Author: pschweitzer
Date: Fri Feb 17 22:25:03 2017
New Revision: 73822
URL:
http://svn.reactos.org/svn/reactos?rev=73822&view=rev
Log:
[FASTFAT]
Generalize the usage of functions pointers for FatX vs Fat specific code (direntry).
This should also help speeding up FastFAT.
Modified:
trunk/reactos/drivers/filesystems/fastfat/cleanup.c
trunk/reactos/drivers/filesystems/fastfat/create.c
trunk/reactos/drivers/filesystems/fastfat/direntry.c
trunk/reactos/drivers/filesystems/fastfat/dirwr.c
trunk/reactos/drivers/filesystems/fastfat/fcb.c
trunk/reactos/drivers/filesystems/fastfat/finfo.c
trunk/reactos/drivers/filesystems/fastfat/fsctl.c
trunk/reactos/drivers/filesystems/fastfat/vfat.h
Modified: trunk/reactos/drivers/filesystems/fastfat/cleanup.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/filesystems/fastfa…
==============================================================================
--- trunk/reactos/drivers/filesystems/fastfat/cleanup.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/filesystems/fastfat/cleanup.c [iso-8859-1] Fri Feb 17 22:25:03
2017
@@ -85,7 +85,7 @@
pFcb->OpenHandleCount == 0)
{
if (vfatFCBIsDirectory(pFcb) &&
- !VfatIsDirectoryEmpty(pFcb, vfatVolumeIsFatX(DeviceExt)))
+ !VfatIsDirectoryEmpty(DeviceExt, pFcb))
{
pFcb->Flags &= ~FCB_DELETE_PENDING;
}
Modified: trunk/reactos/drivers/filesystems/fastfat/create.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/filesystems/fastfa…
==============================================================================
--- trunk/reactos/drivers/filesystems/fastfat/create.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/filesystems/fastfat/create.c [iso-8859-1] Fri Feb 17 22:25:03
2017
@@ -296,7 +296,7 @@
while (TRUE)
{
- Status = DeviceExt->GetNextDirEntry(&Context, &Page, Parent,
DirContext, First);
+ Status = VfatGetNextDirEntry(DeviceExt, &Context, &Page, Parent,
DirContext, First);
First = FALSE;
if (Status == STATUS_NO_MORE_ENTRIES)
{
Modified: trunk/reactos/drivers/filesystems/fastfat/direntry.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/filesystems/fastfa…
==============================================================================
--- trunk/reactos/drivers/filesystems/fastfat/direntry.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/filesystems/fastfat/direntry.c [iso-8859-1] Fri Feb 17 22:25:03
2017
@@ -39,7 +39,6 @@
return cluster;
}
-static
BOOLEAN
FATIsDirectoryEmpty(
PVFATFCB Fcb)
@@ -108,7 +107,6 @@
return TRUE;
}
-static
BOOLEAN
FATXIsDirectoryEmpty(
PVFATFCB Fcb)
@@ -166,17 +164,6 @@
}
return TRUE;
-}
-
-BOOLEAN
-VfatIsDirectoryEmpty(
- PVFATFCB Fcb,
- BOOLEAN IsFatX)
-{
- if (IsFatX)
- return FATXIsDirectoryEmpty(Fcb);
- else
- return FATIsDirectoryEmpty(Fcb);
}
NTSTATUS
Modified: trunk/reactos/drivers/filesystems/fastfat/dirwr.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/filesystems/fastfa…
==============================================================================
--- trunk/reactos/drivers/filesystems/fastfat/dirwr.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/filesystems/fastfat/dirwr.c [iso-8859-1] Fri Feb 17 22:25:03
2017
@@ -815,22 +815,6 @@
return STATUS_SUCCESS;
}
-NTSTATUS
-VfatAddEntry(
- IN PDEVICE_EXTENSION DeviceExt,
- IN PUNICODE_STRING NameU,
- IN PVFATFCB *Fcb,
- IN PVFATFCB ParentFcb,
- IN ULONG RequestedOptions,
- IN UCHAR ReqAttr,
- IN PVFAT_MOVE_CONTEXT MoveContext)
-{
- if (vfatVolumeIsFatX(DeviceExt))
- return FATXAddEntry(DeviceExt, NameU, Fcb, ParentFcb, RequestedOptions, ReqAttr,
MoveContext);
- else
- return FATAddEntry(DeviceExt, NameU, Fcb, ParentFcb, RequestedOptions, ReqAttr,
MoveContext);
-}
-
/*
* deleting an existing FAT entry
*/
@@ -978,18 +962,6 @@
return STATUS_SUCCESS;
}
-NTSTATUS
-VfatDelEntry(
- IN PDEVICE_EXTENSION DeviceExt,
- IN PVFATFCB pFcb,
- OUT PVFAT_MOVE_CONTEXT MoveContext)
-{
- if (vfatVolumeIsFatX(DeviceExt))
- return FATXDelEntry(DeviceExt, pFcb, MoveContext);
- else
- return FATDelEntry(DeviceExt, pFcb, MoveContext);
-}
-
/*
* move an existing FAT entry
*/
@@ -1031,4 +1003,23 @@
return Status;
}
+extern BOOLEAN FATXIsDirectoryEmpty(PVFATFCB Fcb);
+extern BOOLEAN FATIsDirectoryEmpty(PVFATFCB Fcb);
+extern NTSTATUS FATGetNextDirEntry(PVOID *pContext, PVOID *pPage, PVFATFCB pDirFcb,
PVFAT_DIRENTRY_CONTEXT DirContext, BOOLEAN First);
+extern NTSTATUS FATXGetNextDirEntry(PVOID *pContext, PVOID *pPage, PVFATFCB pDirFcb,
PVFAT_DIRENTRY_CONTEXT DirContext, BOOLEAN First);
+
+VFAT_DISPATCH FatXDispatch = {
+ .IsDirectoryEmpty = FATXIsDirectoryEmpty,
+ .AddEntry = FATXAddEntry,
+ .DelEntry = FATXDelEntry,
+ .GetNextDirEntry = FATXGetNextDirEntry,
+};
+
+VFAT_DISPATCH FatDispatch = {
+ .IsDirectoryEmpty = FATIsDirectoryEmpty,
+ .AddEntry = FATAddEntry,
+ .DelEntry = FATDelEntry,
+ .GetNextDirEntry = FATGetNextDirEntry,
+};
+
/* EOF */
Modified: trunk/reactos/drivers/filesystems/fastfat/fcb.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/filesystems/fastfa…
==============================================================================
--- trunk/reactos/drivers/filesystems/fastfat/fcb.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/filesystems/fastfat/fcb.c [iso-8859-1] Fri Feb 17 22:25:03 2017
@@ -797,7 +797,8 @@
while (TRUE)
{
- status = pDeviceExt->GetNextDirEntry(&Context,
+ status = VfatGetNextDirEntry(pDeviceExt,
+ &Context,
&Page,
pDirectoryFCB,
&DirContext,
Modified: trunk/reactos/drivers/filesystems/fastfat/finfo.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/filesystems/fastfa…
==============================================================================
--- trunk/reactos/drivers/filesystems/fastfat/finfo.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/filesystems/fastfat/finfo.c [iso-8859-1] Fri Feb 17 22:25:03
2017
@@ -357,7 +357,7 @@
return STATUS_CANNOT_DELETE;
}
- if (vfatFCBIsDirectory(FCB) && !VfatIsDirectoryEmpty(FCB,
vfatVolumeIsFatX(DeviceExt)))
+ if (vfatFCBIsDirectory(FCB) && !VfatIsDirectoryEmpty(DeviceExt, FCB))
{
/* can't delete a non-empty directory */
Modified: trunk/reactos/drivers/filesystems/fastfat/fsctl.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/filesystems/fastfa…
==============================================================================
--- trunk/reactos/drivers/filesystems/fastfat/fsctl.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/filesystems/fastfat/fsctl.c [iso-8859-1] Fri Feb 17 22:25:03
2017
@@ -29,6 +29,9 @@
#define NDEBUG
#include <debug.h>
+
+extern VFAT_DISPATCH FatXDispatch;
+extern VFAT_DISPATCH FatDispatch;
/* FUNCTIONS ****************************************************************/
@@ -465,13 +468,13 @@
DeviceExt->FatInfo.FatType == FATX32)
{
DeviceExt->Flags |= VCB_IS_FATX;
- DeviceExt->GetNextDirEntry = FATXGetNextDirEntry;
DeviceExt->BaseDateYear = 2000;
+ RtlCopyMemory(&DeviceExt->Dispatch, &FatXDispatch,
sizeof(VFAT_DISPATCH));
}
else
{
- DeviceExt->GetNextDirEntry = FATGetNextDirEntry;
DeviceExt->BaseDateYear = 1980;
+ RtlCopyMemory(&DeviceExt->Dispatch, &FatDispatch,
sizeof(VFAT_DISPATCH));
}
DeviceExt->StorageDevice = DeviceToMount;
Modified: trunk/reactos/drivers/filesystems/fastfat/vfat.h
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/filesystems/fastfa…
==============================================================================
--- trunk/reactos/drivers/filesystems/fastfat/vfat.h [iso-8859-1] (original)
+++ trunk/reactos/drivers/filesystems/fastfat/vfat.h [iso-8859-1] Fri Feb 17 22:25:03
2017
@@ -260,6 +260,7 @@
struct _VFATFCB;
struct _VFAT_DIRENTRY_CONTEXT;
+struct _VFAT_MOVE_CONTEXT;
typedef struct _HASHENTRY
{
@@ -275,7 +276,18 @@
typedef NTSTATUS (*PFIND_AND_MARK_AVAILABLE_CLUSTER)(PDEVICE_EXTENSION,PULONG);
typedef NTSTATUS (*PWRITE_CLUSTER)(PDEVICE_EXTENSION,ULONG,ULONG,PULONG);
+typedef BOOLEAN (*PIS_DIRECTORY_EMPTY)(struct _VFATFCB*);
+typedef NTSTATUS (*PADD_ENTRY)(PDEVICE_EXTENSION,PUNICODE_STRING,struct _VFATFCB**,struct
_VFATFCB*,ULONG,UCHAR,struct _VFAT_MOVE_CONTEXT*);
+typedef NTSTATUS (*PDEL_ENTRY)(PDEVICE_EXTENSION,struct _VFATFCB*,struct
_VFAT_MOVE_CONTEXT*);
typedef NTSTATUS (*PGET_NEXT_DIR_ENTRY)(PVOID*,PVOID*,struct _VFATFCB*,struct
_VFAT_DIRENTRY_CONTEXT*,BOOLEAN);
+
+typedef struct _VFAT_DISPATCH
+{
+ PIS_DIRECTORY_EMPTY IsDirectoryEmpty;
+ PADD_ENTRY AddEntry;
+ PDEL_ENTRY DelEntry;
+ PGET_NEXT_DIR_ENTRY GetNextDirEntry;
+} VFAT_DISPATCH, *PVFAT_DISPATCH;
typedef struct DEVICE_EXTENSION
{
@@ -303,9 +315,6 @@
PWRITE_CLUSTER WriteCluster;
ULONG CleanShutBitMask;
- /* Pointers to functions for manipulating directory entries. */
- PGET_NEXT_DIR_ENTRY GetNextDirEntry;
-
ULONG BaseDateYear;
LIST_ENTRY VolumeListEntry;
@@ -320,7 +329,52 @@
/* VPBs for dismount */
PVPB IoVPB;
PVPB SpareVPB;
+
+ /* Pointers to functions for manipulating directory entries. */
+ VFAT_DISPATCH Dispatch;
} DEVICE_EXTENSION, VCB, *PVCB;
+
+FORCEINLINE
+BOOLEAN
+VfatIsDirectoryEmpty(PDEVICE_EXTENSION DeviceExt,
+ struct _VFATFCB* Fcb)
+{
+ return DeviceExt->Dispatch.IsDirectoryEmpty(Fcb);
+}
+
+FORCEINLINE
+NTSTATUS
+VfatAddEntry(PDEVICE_EXTENSION DeviceExt,
+ PUNICODE_STRING NameU,
+ struct _VFATFCB** Fcb,
+ struct _VFATFCB* ParentFcb,
+ ULONG RequestedOptions,
+ UCHAR ReqAttr,
+ struct _VFAT_MOVE_CONTEXT* MoveContext)
+{
+ return DeviceExt->Dispatch.AddEntry(DeviceExt, NameU, Fcb, ParentFcb,
RequestedOptions, ReqAttr, MoveContext);
+}
+
+FORCEINLINE
+NTSTATUS
+VfatDelEntry(PDEVICE_EXTENSION DeviceExt,
+ struct _VFATFCB* Fcb,
+ struct _VFAT_MOVE_CONTEXT* MoveContext)
+{
+ return DeviceExt->Dispatch.DelEntry(DeviceExt, Fcb, MoveContext);
+}
+
+FORCEINLINE
+NTSTATUS
+VfatGetNextDirEntry(PDEVICE_EXTENSION DeviceExt,
+ PVOID *pContext,
+ PVOID *pPage,
+ struct _VFATFCB* pDirFcb,
+ struct _VFAT_DIRENTRY_CONTEXT* DirContext,
+ BOOLEAN First)
+{
+ return DeviceExt->Dispatch.GetNextDirEntry(pContext, pPage, pDirFcb, DirContext,
First);
+}
#define VFAT_BREAK_ON_CORRUPTION 1
@@ -640,49 +694,12 @@
PDEVICE_EXTENSION pDeviceExt,
PDIR_ENTRY pDirEntry);
-BOOLEAN
-VfatIsDirectoryEmpty(
- PVFATFCB Fcb,
- BOOLEAN IsFatX);
-
-NTSTATUS
-FATGetNextDirEntry(
- PVOID *pContext,
- PVOID *pPage,
- IN PVFATFCB pDirFcb,
- IN PVFAT_DIRENTRY_CONTEXT DirContext,
- BOOLEAN First);
-
-NTSTATUS
-FATXGetNextDirEntry(
- PVOID *pContext,
- PVOID *pPage,
- IN PVFATFCB pDirFcb,
- IN PVFAT_DIRENTRY_CONTEXT DirContext,
- BOOLEAN First);
-
/* dirwr.c */
-
-NTSTATUS
-VfatAddEntry(
- PDEVICE_EXTENSION DeviceExt,
- PUNICODE_STRING PathNameU,
- PVFATFCB* Fcb,
- PVFATFCB ParentFcb,
- ULONG RequestedOptions,
- UCHAR ReqAttr,
- PVFAT_MOVE_CONTEXT MoveContext);
NTSTATUS
VfatUpdateEntry(
PVFATFCB pFcb,
IN BOOLEAN IsFatX);
-
-NTSTATUS
-VfatDelEntry(
- PDEVICE_EXTENSION,
- PVFATFCB,
- PVFAT_MOVE_CONTEXT);
BOOLEAN
vfatFindDirSpace(