[EXT2]
[reactos.git] / reactos / drivers / filesystems / ext2 / inc / ext2fs.h
index eb806f3..7792ed1 100644 (file)
@@ -47,7 +47,7 @@
 
 /* STRUCTS & CONSTS******************************************************/
 
-#define EXT2FSD_VERSION                 "0.63"
+#define EXT2FSD_VERSION                 "0.68"
 
 
 /* WDK DEFINITIONS ******************************************************/
@@ -110,6 +110,26 @@ typedef struct ext3_dir_entry_2 EXT2_DIR_ENTRY2, *PEXT2_DIR_ENTRY2;
 #define CEILING_ALIGNED(T, A, B) (((A) + (B) - 1) & (~((T)(B) - 1)))
 #define COCKLOFT_ALIGNED(T, A, B) (((A) + (B)) & (~((T)(B) - 1)))
 
+
+
+/*
+ * Compile-time assertion: (Lustre version)
+ *
+ * Check an invariant described by a constant expression at compile time by
+ * forcing a compiler error if it does not hold.  \a cond must be a constant
+ * expression as defined by the ISO C Standard:
+ *
+ *       6.8.4.2  The switch statement
+ *       ....
+ *       [#3] The expression of each case label shall be  an  integer
+ *       constant   expression  and  no  two  of  the  case  constant
+ *       expressions in the same switch statement shall have the same
+ *       value  after  conversion...
+ *
+ */
+
+#define CL_ASSERT(cond) do {switch('x') {case (cond): case 0: break;}} while (0)
+
 /* File System Releated *************************************************/
 
 #define DRIVER_NAME      "Ext2Fsd"
@@ -130,6 +150,10 @@ typedef struct ext3_dir_entry_2 EXT2_DIR_ENTRY2, *PEXT2_DIR_ENTRY2;
 #define HIDING_SUFFIX       L"HidingSuffix"
 #define AUTO_MOUNT          L"AutoMount"
 #define MOUNT_POINT         L"MountPoint"
+#define UID                 L"uid"
+#define GID                 L"gid"
+#define EUID                L"euid"
+#define EGID                L"egid"
 
 #define DOS_DEVICE_NAME L"\\DosDevices\\Ext2Fsd"
 
@@ -464,6 +488,18 @@ typedef PVOID   PBCB;
 // Data that is not specific to a mounted volume
 //
 
+typedef VOID (NTAPI *EXT2_REAPER_RELEASE)(PVOID);
+
+typedef struct _EXT2_REAPER {
+        PETHREAD                Thread;
+        KEVENT                  Engine;
+        KEVENT                  Wait;
+        EXT2_REAPER_RELEASE     Free;
+        ULONG                   Flags;
+} EXT2_REAPER, *PEXT2_REAPER;
+
+#define EXT2_REAPER_FLAG_STOP   (1 << 0)
+
 typedef struct _EXT2_GLOBAL {
 
     /* Identifier for this structure */
@@ -479,6 +515,9 @@ typedef struct _EXT2_GLOBAL {
     /* Table of pointers to the fast I/O entry points */
     FAST_IO_DISPATCH            FastIoDispatch;
 
+    /* Filter callbacks */
+    FS_FILTER_CALLBACKS         FilterCallbacks;
+
     /* Table of pointers to the Cache Manager callbacks */
     CACHE_MANAGER_CALLBACKS     CacheManagerCallbacks;
     CACHE_MANAGER_CALLBACKS     CacheManagerNoOpCallbacks;
@@ -496,10 +535,9 @@ typedef struct _EXT2_GLOBAL {
     LIST_ENTRY                  VcbList;
 
     /* Cleaning thread related: resource cleaner */
-    struct {
-        KEVENT                  Engine;
-        KEVENT                  Wait;
-    } Reaper;
+    EXT2_REAPER                 FcbReaper;
+    EXT2_REAPER                 McbReaper;
+    EXT2_REAPER                 bhReaper;
 
     /* Look Aside table of IRP_CONTEXT, FCB, MCB, CCB */
     NPAGED_LOOKASIDE_LIST       Ext2IrpContextLookasideList;
@@ -512,11 +550,14 @@ typedef struct _EXT2_GLOBAL {
 
     /* User specified global codepage name */
     struct {
+        WCHAR                   PageName[CODEPAGE_MAXLEN];
         UCHAR                   AnsiName[CODEPAGE_MAXLEN];
         struct nls_table *      PageTable;
     } Codepage;
 
     /* global hiding patterns */
+    WCHAR                       wHidingPrefix[HIDINGPAT_LEN];
+    WCHAR                       wHidingSuffix[HIDINGPAT_LEN];
     BOOLEAN                     bHidingPrefix;
     CHAR                        sHidingPrefix[HIDINGPAT_LEN];
     BOOLEAN                     bHidingSuffix;
@@ -599,18 +640,26 @@ typedef struct _EXT2_VCB {
     /* Common header */
     EXT2_FCBVCB;
 
-    // Resource for metadata (super block, tables)
-    ERESOURCE                   MetaLock;
+    // Resource for metadata (inode)
+    ERESOURCE                   MetaInode;
+
+    // Resource for metadata (block)
+    ERESOURCE                   MetaBlock;
 
     // Resource for Mcb (Meta data control block)
     ERESOURCE                   McbLock;
 
-    // Entry of Mcb Tree (Root Node)
-    PEXT2_MCB                   McbTree;
+    // List of FCBs for open files on this volume
+    ERESOURCE                   FcbLock;
+    LIST_ENTRY                  FcbList;
+    ULONG                       FcbCount;
 
     // Mcb list
-    LIST_ENTRY                  McbList;
     ULONG                       NumOfMcb;
+    LIST_ENTRY                  McbList;
+
+    // Entry of Mcb Tree (Root Node)
+    PEXT2_MCB                   McbTree;
 
     // Link list to Global
     LIST_ENTRY                  Next;
@@ -621,10 +670,6 @@ typedef struct _EXT2_VCB {
     // Dirty Mcbs of modifications for volume stream
     LARGE_MCB                   Extents;
 
-    // List of FCBs for open files on this volume
-    ULONG                       FcbCount;
-    LIST_ENTRY                  FcbList;
-    KSPIN_LOCK                  FcbLock;
 
     // Share Access for the file object
     SHARE_ACCESS                ShareAccess;
@@ -669,12 +714,6 @@ typedef struct _EXT2_VCB {
     BOOLEAN                     IsExt3fs;
     PEXT2_SUPER_BLOCK           SuperBlock;
 
-    /*
-        // Bitmap Block per group
-        PRTL_BITMAP                 BlockBitMaps;
-        PRTL_BITMAP                 InodeBitMaps;
-    */
-
     // Block / Cluster size
     ULONG                       BlockSize;
 
@@ -745,10 +784,12 @@ typedef struct _EXT2_VCB {
 #define VCB_USER_IDS            0x00000040  /* uid/gid specified by user */
 #define VCB_USER_EIDS           0x00000080  /* euid/egid specified by user */
 
+#define VCB_BEING_DROPPED       0x00002000
 #define VCB_FORCE_WRITING       0x00004000
 #define VCB_DEVICE_REMOVED      0x00008000
 #define VCB_JOURNAL_RECOVER     0x00080000
 #define VCB_ARRIVAL_NOTIFIED    0x00800000
+#define VCB_RO_COMPAT_READ_ONLY 0x01000000
 #define VCB_READ_ONLY           0x08000000
 #define VCB_WRITE_PROTECTED     0x10000000
 #define VCB_FLOPPY_DISK         0x20000000
@@ -760,6 +801,7 @@ typedef struct _EXT2_VCB {
 #define IsMounted(Vcb)     (IsFlagOn((Vcb)->Flags, VCB_MOUNTED))
 #define IsDispending(Vcb)  (IsFlagOn((Vcb)->Flags, VCB_DISMOUNT_PENDING))
 #define IsVcbReadOnly(Vcb) (IsFlagOn((Vcb)->Flags, VCB_READ_ONLY) ||    \
+                            IsFlagOn((Vcb)->Flags, VCB_RO_COMPAT_READ_ONLY) ||    \
                             IsFlagOn((Vcb)->Flags, VCB_WRITE_PROTECTED))
 
 
@@ -780,6 +822,7 @@ typedef struct _EXT2_FCB {
 
     // List of FCBs for this volume
     LIST_ENTRY                      Next;
+    LARGE_INTEGER                   TsDrop; /* drop time */
 
     SECTION_OBJECT_POINTERS         SectionObject;
 
@@ -826,7 +869,7 @@ typedef struct _EXT2_FCB {
 #define FCB_FROM_POOL               0x00000001
 #define FCB_PAGE_FILE               0x00000002
 #define FCB_FILE_MODIFIED           0x00000020
-#define FCB_STATE_BUSY              0x00000040
+
 #define FCB_ALLOC_IN_CREATE         0x00000080
 #define FCB_ALLOC_IN_WRITE          0x00000100
 #define FCB_ALLOC_IN_SETINFO        0x00000200
@@ -924,12 +967,10 @@ struct _EXT2_MCB {
 static
 #endif
 __inline ULONG DEC_OBJ_CNT(PULONG _C) {
-    if (*_C > 0) {
-        return InterlockedDecrement(_C);
-    } else {
+    if (*_C <= 0) {
         DbgBreak();
     }
-    return 0;
+    return InterlockedDecrement(_C);
 }
 
 #if EXT2_DEBUG
@@ -1148,7 +1189,6 @@ int Ext2CheckFileAccess (PEXT2_VCB Vcb, PEXT2_MCB Mcb, int attempt);
 PMDL
 Ext2CreateMdl (
     IN PVOID Buffer,
-    IN BOOLEAN bPaged,
     IN ULONG Length,
     IN LOCK_OPERATION Operation
 );
@@ -1255,44 +1295,6 @@ Ext2NoOpAcquire (
 VOID NTAPI
 Ext2NoOpRelease (IN PVOID Fcb);
 
-VOID NTAPI
-Ext2AcquireForCreateSection (
-    IN PFILE_OBJECT FileObject
-);
-
-VOID NTAPI
-Ext2ReleaseForCreateSection (
-    IN PFILE_OBJECT FileObject
-);
-
-NTSTATUS NTAPI
-Ext2AcquireFileForModWrite (
-    IN PFILE_OBJECT FileObject,
-    IN PLARGE_INTEGER EndingOffset,
-    OUT PERESOURCE *ResourceToRelease,
-    IN PDEVICE_OBJECT DeviceObject
-);
-
-NTSTATUS NTAPI
-Ext2ReleaseFileForModWrite (
-    IN PFILE_OBJECT FileObject,
-    IN PERESOURCE ResourceToRelease,
-    IN PDEVICE_OBJECT DeviceObject
-);
-
-NTSTATUS NTAPI
-Ext2AcquireFileForCcFlush (
-    IN PFILE_OBJECT FileObject,
-    IN PDEVICE_OBJECT DeviceObject
-);
-
-NTSTATUS NTAPI
-Ext2ReleaseFileForCcFlush (
-    IN PFILE_OBJECT FileObject,
-    IN PDEVICE_OBJECT DeviceObject
-);
-
-
 //
 // Create.c
 //
@@ -1399,13 +1401,7 @@ Ext2SupersedeOrOverWriteFile(
 #define DL_PNP 0x00010000   /* pnp */
 #define DL_IO  0x00020000   /* file i/o */
 
-#define DL_ALL (DL_ERR|DL_VIT|DL_DBG|DL_INF|DL_FUN|DL_LOW|DL_REN|DL_RES|DL_BLK|DL_CP|DL_EXT|DL_MAP|DL_JNL|DL_HTI|DL_WRN|DL_BH|DL_PNP|DL_IO)
-
-#if EXT2_DEBUG && defined(__REACTOS__)
-  #define DL_DEFAULT (DL_ERR|DL_VIT|DL_DBG|DL_INF|DL_FUN|DL_LOW|DL_WRN)
-#else
-  #define DL_DEFAULT (DL_ERR|DL_VIT)
-#endif
+#define DL_DEFAULT (DL_ERR|DL_VIT)
 
 #if EXT2_DEBUG
 extern  ULONG DebugFilter;
@@ -1482,21 +1478,21 @@ Ext2FreePool(
 NTSTATUS
 Ext2ProcessGlobalProperty(
     IN  PDEVICE_OBJECT  DeviceObject,
-    IN  PEXT2_VOLUME_PROPERTY2 Property,
+    IN  PEXT2_VOLUME_PROPERTY3 Property,
     IN  ULONG Length
 );
 
 NTSTATUS
 Ext2ProcessVolumeProperty(
     IN  PEXT2_VCB              Vcb,
-    IN  PEXT2_VOLUME_PROPERTY2 Property,
+    IN  PEXT2_VOLUME_PROPERTY3 Property,
     IN  ULONG Length
 );
 
 NTSTATUS
 Ext2ProcessUserProperty(
     IN PEXT2_IRP_CONTEXT        IrpContext,
-    IN PEXT2_VOLUME_PROPERTY2   Property,
+    IN PEXT2_VOLUME_PROPERTY3   Property,
     IN ULONG                    Length
 );
 
@@ -1776,7 +1772,7 @@ VOID
 Ext2PutGroup(IN PEXT2_VCB Vcb);
 
 VOID
-Ext2DropGroup(IN PEXT2_VCB Vcb);
+Ext2DropBH(IN PEXT2_VCB Vcb);
 
 BOOLEAN
 Ext2SaveGroup(
@@ -1911,6 +1907,13 @@ Ext2NewInode(
     OUT PULONG              Inode
 );
 
+NTSTATUS
+Ext2UpdateGroupDirStat(
+    IN PEXT2_IRP_CONTEXT    IrpContext,
+    IN PEXT2_VCB            Vcb,
+    IN ULONG                Group
+);
+
 NTSTATUS
 Ext2FreeInode(
     IN PEXT2_IRP_CONTEXT    IrpContext,
@@ -1934,7 +1937,8 @@ Ext2SetFileType (
     IN PEXT2_IRP_CONTEXT    IrpContext,
     IN PEXT2_VCB            Vcb,
     IN PEXT2_FCB            Dcb,
-    IN PEXT2_MCB            Mcb
+    IN PEXT2_MCB            Mcb,
+    IN umode_t              mode
 );
 
 NTSTATUS
@@ -2110,6 +2114,56 @@ Ext2FastIoQueryNetworkOpenInfo (
     OUT PIO_STATUS_BLOCK                IoStatus,
     IN PDEVICE_OBJECT                   DeviceObject);
 
+VOID
+NTAPI
+Ext2AcquireForCreateSection (
+    IN PFILE_OBJECT FileObject
+);
+
+VOID
+NTAPI
+Ext2ReleaseForCreateSection (
+    IN PFILE_OBJECT FileObject
+);
+
+NTSTATUS
+NTAPI
+Ext2AcquireFileForModWrite (
+    IN PFILE_OBJECT FileObject,
+    IN PLARGE_INTEGER EndingOffset,
+    OUT PERESOURCE *ResourceToRelease,
+    IN PDEVICE_OBJECT DeviceObject
+);
+
+NTSTATUS
+NTAPI
+Ext2ReleaseFileForModWrite (
+    IN PFILE_OBJECT FileObject,
+    IN PERESOURCE ResourceToRelease,
+    IN PDEVICE_OBJECT DeviceObject
+);
+
+NTSTATUS
+NTAPI
+Ext2AcquireFileForCcFlush (
+    IN PFILE_OBJECT FileObject,
+    IN PDEVICE_OBJECT DeviceObject
+);
+
+NTSTATUS
+NTAPI
+Ext2ReleaseFileForCcFlush (
+    IN PFILE_OBJECT FileObject,
+    IN PDEVICE_OBJECT DeviceObject
+);
+
+
+NTSTATUS
+NTAPI
+Ext2PreAcquireForCreateSection(
+    IN PFS_FILTER_CALLBACK_DATA cd,
+    OUT PVOID *cc
+    );
 
 //
 // FileInfo.c
@@ -2382,7 +2436,6 @@ struct buffer_head *ext3_bread(struct ext2_icb *icb, struct inode *inode,
 int add_dirent_to_buf(struct ext2_icb *icb, struct dentry *dentry,
                       struct inode *inode, struct ext3_dir_entry_2 *de,
                       struct buffer_head *bh);
-
 #if !defined(__REACTOS__) || defined(_MSC_VER)
 struct ext3_dir_entry_2 *
             do_split(struct ext2_icb *icb, struct inode *dir,
@@ -2402,8 +2455,10 @@ int ext3_is_dir_empty(struct ext2_icb *icb, struct inode *inode);
 // Init.c
 //
 
+NTSTATUS
+Ext2QueryGlobalParameters(IN PUNICODE_STRING RegistryPath);
 BOOLEAN
-Ext2QueryGlobalParameters (IN PUNICODE_STRING  RegistryPath);
+Ext2QueryRegistrySettings(IN PUNICODE_STRING  RegistryPath);
 
 VOID NTAPI
 DriverUnload (IN PDRIVER_OBJECT DriverObject);
@@ -2465,6 +2520,25 @@ Ext2LockControl (IN PEXT2_IRP_CONTEXT IrpContext);
 // Memory.c
 //
 
+VOID
+NTAPI
+Ext2FcbReaperThread(
+    PVOID   Context
+);
+
+VOID
+NTAPI
+Ext2McbReaperThread(
+    PVOID   Context
+);
+
+VOID
+NTAPI
+Ext2bhReaperThread(
+    PVOID   Context
+);
+
+
 PEXT2_IRP_CONTEXT
 Ext2AllocateIrpContext (IN PDEVICE_OBJECT   DeviceObject,
                         IN PIRP             Irp );
@@ -2480,13 +2554,15 @@ Ext2AllocateFcb (
 );
 
 VOID
-Ext2FreeFcb (IN PEXT2_FCB Fcb);
+Ext2UnlinkFcb(IN PEXT2_FCB Fcb);
 
 VOID
-Ext2InsertFcb(PEXT2_VCB Vcb, PEXT2_FCB Fcb);
+Ext2FreeFcb (IN PEXT2_FCB Fcb);
+VOID
+Ext2ReleaseFcb (IN PEXT2_FCB Fcb);
 
 VOID
-Ext2RemoveFcb(PEXT2_VCB Vcb, PEXT2_FCB Fcb);
+Ext2InsertFcb(PEXT2_VCB Vcb, PEXT2_FCB Fcb);
 
 PEXT2_CCB
 Ext2AllocateCcb (ULONG Flags, PEXT2_MCB SymLink);
@@ -2769,7 +2845,10 @@ Ext2ReaperThread(
 );
 
 NTSTATUS
-Ext2StartReaperThread();
+Ext2StartReaper(PEXT2_REAPER, EXT2_REAPER_RELEASE);
+VOID
+NTAPI
+Ext2StopReaper(PEXT2_REAPER Reaper);
 
 //
 // Misc.c
@@ -2948,6 +3027,7 @@ Ext2WriteInode (
     OUT PULONG              dwReturn
 );
 
+
 VOID
 Ext2StartFloppyFlushDpc (
     PEXT2_VCB   Vcb,