From 10a7555f9e2fecc79235ae86c0a6637697b6b35d Mon Sep 17 00:00:00 2001 From: Pierre Schweitzer Date: Sun, 24 Sep 2017 09:50:36 +0000 Subject: [PATCH] [FASTFAT] Implement statistics counting for create operations. svn path=/trunk/; revision=75938 --- reactos/drivers/filesystems/fastfat/create.c | 43 ++++++++++++++++++++ reactos/drivers/filesystems/fastfat/vfat.h | 6 +++ 2 files changed, 49 insertions(+) diff --git a/reactos/drivers/filesystems/fastfat/create.c b/reactos/drivers/filesystems/fastfat/create.c index 363580471e9..cd4e6577719 100644 --- a/reactos/drivers/filesystems/fastfat/create.c +++ b/reactos/drivers/filesystems/fastfat/create.c @@ -468,6 +468,8 @@ VfatCreateFile( return STATUS_CANNOT_DELETE; } + vfatAddToStat(DeviceExt, Fat.CreateHits, 1); + pFcb = DeviceExt->VolumeFcb; if (pFcb->OpenHandleCount == 0) @@ -486,6 +488,7 @@ VfatCreateFile( FALSE); if (!NT_SUCCESS(Status)) { + vfatAddToStat(DeviceExt, Fat.FailedCreates, 1); return Status; } } @@ -493,6 +496,7 @@ VfatCreateFile( vfatAttachFCBToFileObject(DeviceExt, pFcb, FileObject); DeviceExt->OpenHandleCount++; pFcb->OpenHandleCount++; + vfatAddToStat(DeviceExt, Fat.SuccessfulCreates, 1); Irp->IoStatus.Information = FILE_OPENED; return STATUS_SUCCESS; @@ -566,6 +570,8 @@ VfatCreateFile( /* Try opening the file. */ if (!OpenTargetDir) { + vfatAddToStat(DeviceExt, Fat.CreateHits, 1); + Status = VfatOpenFile(DeviceExt, &PathNameU, FileObject, RequestedDisposition, RequestedOptions, &ParentFcb); } else @@ -573,6 +579,8 @@ VfatCreateFile( PVFATFCB TargetFcb; LONG idx, FileNameLen; + vfatAddToStat(DeviceExt, Fat.CreateHits, 1); + ParentFcb = (FileObject->RelatedFileObject != NULL) ? FileObject->RelatedFileObject->FsContext : NULL; if (ParentFcb) { @@ -654,6 +662,7 @@ VfatCreateFile( if (!NT_SUCCESS(Status)) { VfatCloseFile(DeviceExt, FileObject); + vfatAddToStat(DeviceExt, Fat.FailedCreates, 1); return Status; } } @@ -672,6 +681,15 @@ VfatCreateFile( vfatReleaseFCB(DeviceExt, ParentFcb); } + if (NT_SUCCESS(Status)) + { + vfatAddToStat(DeviceExt, Fat.SuccessfulCreates, 1); + } + else + { + vfatAddToStat(DeviceExt, Fat.FailedCreates, 1); + } + return Status; } @@ -689,12 +707,14 @@ VfatCreateFile( { vfatReleaseFCB(DeviceExt, ParentFcb); } + vfatAddToStat(DeviceExt, Fat.FailedCreates, 1); return Status; } if (!NT_SUCCESS(Status) && ParentFcb == NULL) { DPRINT1("VfatOpenFile failed for '%wZ', status %x\n", &PathNameU, Status); + vfatAddToStat(DeviceExt, Fat.FailedCreates, 1); return Status; } @@ -712,6 +732,7 @@ VfatCreateFile( if (TrailingBackslash) { vfatReleaseFCB(DeviceExt, ParentFcb); + vfatAddToStat(DeviceExt, Fat.FailedCreates, 1); return STATUS_OBJECT_NAME_INVALID; } Attributes |= FILE_ATTRIBUTE_ARCHIVE; @@ -726,6 +747,7 @@ VfatCreateFile( if (!NT_SUCCESS(Status)) { vfatReleaseFCB(DeviceExt, pFcb); + vfatAddToStat(DeviceExt, Fat.FailedCreates, 1); return Status; } @@ -745,12 +767,14 @@ VfatCreateFile( } else { + vfatAddToStat(DeviceExt, Fat.FailedCreates, 1); return Status; } } else { vfatReleaseFCB(DeviceExt, ParentFcb); + vfatAddToStat(DeviceExt, Fat.FailedCreates, 1); return Status; } } @@ -769,9 +793,11 @@ VfatCreateFile( VfatCloseFile(DeviceExt, FileObject); if (TrailingBackslash && !vfatFCBIsDirectory(pFcb)) { + vfatAddToStat(DeviceExt, Fat.FailedCreates, 1); return STATUS_OBJECT_NAME_INVALID; } Irp->IoStatus.Information = FILE_EXISTS; + vfatAddToStat(DeviceExt, Fat.FailedCreates, 1); return STATUS_OBJECT_NAME_COLLISION; } @@ -785,6 +811,7 @@ VfatCreateFile( if (!NT_SUCCESS(Status)) { VfatCloseFile(DeviceExt, FileObject); + vfatAddToStat(DeviceExt, Fat.FailedCreates, 1); return Status; } } @@ -796,17 +823,20 @@ VfatCreateFile( vfatFCBIsDirectory(pFcb)) { VfatCloseFile (DeviceExt, FileObject); + vfatAddToStat(DeviceExt, Fat.FailedCreates, 1); return STATUS_FILE_IS_A_DIRECTORY; } if (BooleanFlagOn(RequestedOptions, FILE_DIRECTORY_FILE) && !vfatFCBIsDirectory(pFcb)) { VfatCloseFile (DeviceExt, FileObject); + vfatAddToStat(DeviceExt, Fat.FailedCreates, 1); return STATUS_NOT_A_DIRECTORY; } if (TrailingBackslash && !vfatFCBIsDirectory(pFcb)) { VfatCloseFile (DeviceExt, FileObject); + vfatAddToStat(DeviceExt, Fat.FailedCreates, 1); return STATUS_OBJECT_NAME_INVALID; } #ifndef USE_ROS_CC_AND_FS @@ -823,6 +853,7 @@ VfatCreateFile( DPRINT1("%d %d %d\n", Stack->Parameters.Create.SecurityContext->DesiredAccess & FILE_WRITE_DATA, RequestedDisposition == FILE_OVERWRITE, RequestedDisposition == FILE_OVERWRITE_IF); VfatCloseFile (DeviceExt, FileObject); + vfatAddToStat(DeviceExt, Fat.FailedCreates, 1); return (BooleanFlagOn(RequestedOptions, FILE_DELETE_ON_CLOSE)) ? STATUS_CANNOT_DELETE : STATUS_SHARING_VIOLATION; } @@ -844,6 +875,7 @@ VfatCreateFile( if(!BooleanFlagOn(pFcb->Flags, FCB_IS_PAGE_FILE)) { VfatCloseFile(DeviceExt, FileObject); + vfatAddToStat(DeviceExt, Fat.FailedCreates, 1); return STATUS_INVALID_PARAMETER; } } @@ -857,6 +889,7 @@ VfatCreateFile( if (BooleanFlagOn(pFcb->Flags, FCB_IS_PAGE_FILE)) { VfatCloseFile(DeviceExt, FileObject); + vfatAddToStat(DeviceExt, Fat.FailedCreates, 1); return STATUS_INVALID_PARAMETER; } } @@ -881,6 +914,7 @@ VfatCreateFile( if (!NT_SUCCESS (Status)) { VfatCloseFile(DeviceExt, FileObject); + vfatAddToStat(DeviceExt, Fat.FailedCreates, 1); return Status; } } @@ -938,6 +972,15 @@ VfatCreateFile( /* FIXME : test write access if requested */ + if (NT_SUCCESS(Status)) + { + vfatAddToStat(DeviceExt, Fat.SuccessfulCreates, 1); + } + else + { + vfatAddToStat(DeviceExt, Fat.FailedCreates, 1); + } + return Status; } diff --git a/reactos/drivers/filesystems/fastfat/vfat.h b/reactos/drivers/filesystems/fastfat/vfat.h index 97dd9249351..b84b320573c 100644 --- a/reactos/drivers/filesystems/fastfat/vfat.h +++ b/reactos/drivers/filesystems/fastfat/vfat.h @@ -602,6 +602,12 @@ vfatVolumeIsFatX(PDEVICE_EXTENSION DeviceExt) return BooleanFlagOn(DeviceExt->Flags, VCB_IS_FATX); } +#define vfatAddToStat(Vcb, Stat, Inc) \ +{ \ + PSTATISTICS Stats = &(Vcb)->Statistics[KeGetCurrentProcessorNumber() % VfatGlobalData->NumberProcessors]; \ + Stats->Stat += Inc; \ +} + /* blockdev.c */ NTSTATUS