Author: cgutman Date: Sun Jun 19 20:03:49 2011 New Revision: 52374
URL: http://svn.reactos.org/svn/reactos?rev=52374&view=rev Log: [FASTFAT] - Move verification code to the BlockDev* functions (like CDFS does) so functions that call those directly will have verification handled for them - Add verification handling for IOCTL requests
Modified: trunk/reactos/drivers/filesystems/fastfat/blockdev.c trunk/reactos/drivers/filesystems/fastfat/create.c trunk/reactos/drivers/filesystems/fastfat/rw.c
Modified: trunk/reactos/drivers/filesystems/fastfat/blockdev.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/filesystems/fastfat... ============================================================================== --- trunk/reactos/drivers/filesystems/fastfat/blockdev.c [iso-8859-1] (original) +++ trunk/reactos/drivers/filesystems/fastfat/blockdev.c [iso-8859-1] Sun Jun 19 20:03:49 2011 @@ -37,6 +37,10 @@ if (Irp->PendingReturned) { IrpContext->Flags |= IRPCONTEXT_PENDINGRETURNED; + } + else + { + IrpContext->Flags &= ~IRPCONTEXT_PENDINGRETURNED; } if (!NT_SUCCESS(Irp->IoStatus.Status)) { @@ -67,6 +71,7 @@ KEVENT event; NTSTATUS Status;
+again: KeInitializeEvent (&event, NotificationEvent, FALSE);
DPRINT ("VfatReadDisk(pDeviceObject %p, Offset %I64x, Length %d, Buffer %p)\n", @@ -102,6 +107,25 @@ KeWaitForSingleObject (&event, Suspended, KernelMode, FALSE, NULL); DPRINT ("Getting IO Status... for %p\n", Irp); Status = IoStatus.Status; + } + + if (Status == STATUS_VERIFY_REQUIRED) + { + PDEVICE_OBJECT DeviceToVerify; + + DPRINT1 ("Media change detected!\n"); + + /* Find the device to verify and reset the thread field to empty value again. */ + DeviceToVerify = IoGetDeviceToVerify (PsGetCurrentThread ()); + IoSetDeviceToVerify (PsGetCurrentThread (), NULL); + Status = IoVerifyVolume (DeviceToVerify, + FALSE); + + if (NT_SUCCESS(Status)) + { + DPRINT1 ("Volume verification successful; Reissuing read request\n"); + goto again; + } }
if (!NT_SUCCESS (Status)) @@ -134,6 +158,7 @@
Buffer = (PCHAR)MmGetMdlVirtualAddress(IrpContext->Irp->MdlAddress) + BufferOffset;
+again: Irp = IoAllocateIrp(IrpContext->DeviceExt->StorageDevice->StackSize, TRUE); if (Irp == NULL) { @@ -188,6 +213,25 @@ { KeWaitForSingleObject(&IrpContext->Event, Executive, KernelMode, FALSE, NULL); Status = IrpContext->Irp->IoStatus.Status; + } + + if (Status == STATUS_VERIFY_REQUIRED) + { + PDEVICE_OBJECT DeviceToVerify; + + DPRINT1 ("Media change detected!\n"); + + /* Find the device to verify and reset the thread field to empty value again. */ + DeviceToVerify = IoGetDeviceToVerify (PsGetCurrentThread ()); + IoSetDeviceToVerify (PsGetCurrentThread (), NULL); + Status = IoVerifyVolume (DeviceToVerify, + FALSE); + + if (NT_SUCCESS(Status)) + { + DPRINT1 ("Volume verification successful; Reissuing read request\n"); + goto again; + } }
DPRINT("%x\n", Status); @@ -212,6 +256,7 @@
Buffer = (PCHAR)MmGetMdlVirtualAddress(IrpContext->Irp->MdlAddress) + BufferOffset;
+again: DPRINT ("Building asynchronous FSD Request...\n"); Irp = IoAllocateIrp(IrpContext->DeviceExt->StorageDevice->StackSize, TRUE); if (Irp == NULL) @@ -266,6 +311,25 @@ { KeWaitForSingleObject(&IrpContext->Event, Executive, KernelMode, FALSE, NULL); Status = IrpContext->Irp->IoStatus.Status; + } + + if (Status == STATUS_VERIFY_REQUIRED) + { + PDEVICE_OBJECT DeviceToVerify; + + DPRINT1 ("Media change detected!\n"); + + /* Find the device to verify and reset the thread field to empty value again. */ + DeviceToVerify = IoGetDeviceToVerify (PsGetCurrentThread ()); + IoSetDeviceToVerify (PsGetCurrentThread (), NULL); + Status = IoVerifyVolume (DeviceToVerify, + FALSE); + + if (NT_SUCCESS(Status)) + { + DPRINT1 ("Volume verification successful; Reissuing write request\n"); + goto again; + } }
return Status; @@ -292,6 +356,7 @@ InputBuffer, InputBufferSize, OutputBuffer, OutputBufferSize, OutputBufferSize ? *OutputBufferSize : 0);
+again: KeInitializeEvent (&Event, NotificationEvent, FALSE);
DPRINT("Building device I/O control request ...\n"); @@ -328,6 +393,25 @@
Status = IoStatus.Status; } + + if (Status == STATUS_VERIFY_REQUIRED) + { + PDEVICE_OBJECT DeviceToVerify; + + DPRINT1 ("Media change detected!\n"); + + /* Find the device to verify and reset the thread field to empty value again. */ + DeviceToVerify = IoGetDeviceToVerify (PsGetCurrentThread ()); + IoSetDeviceToVerify (PsGetCurrentThread (), NULL); + Status = IoVerifyVolume (DeviceToVerify, + FALSE); + + if (NT_SUCCESS(Status)) + { + DPRINT1 ("Volume verification successful; Reissuing IOCTL request\n"); + goto again; + } + }
if (OutputBufferSize) {
Modified: trunk/reactos/drivers/filesystems/fastfat/create.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/filesystems/fastfat... ============================================================================== --- trunk/reactos/drivers/filesystems/fastfat/create.c [iso-8859-1] (original) +++ trunk/reactos/drivers/filesystems/fastfat/create.c [iso-8859-1] Sun Jun 19 20:03:49 2011 @@ -372,20 +372,6 @@ 0, FALSE);
- if (Status == STATUS_VERIFY_REQUIRED) - - { - PDEVICE_OBJECT DeviceToVerify; - - DPRINT ("Media change detected!\n"); - DPRINT ("Device %p\n", DeviceExt->StorageDevice); - - /* Find the device to verify and reset the thread field to empty value again. */ - DeviceToVerify = IoGetDeviceToVerify (PsGetCurrentThread ()); - IoSetDeviceToVerify (PsGetCurrentThread (), NULL); - Status = IoVerifyVolume (DeviceToVerify, - FALSE); - } if (!NT_SUCCESS(Status)) { DPRINT ("Status %lx\n", Status);
Modified: trunk/reactos/drivers/filesystems/fastfat/rw.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/filesystems/fastfat... ============================================================================== --- trunk/reactos/drivers/filesystems/fastfat/rw.c [iso-8859-1] (original) +++ trunk/reactos/drivers/filesystems/fastfat/rw.c [iso-8859-1] Sun Jun 19 20:03:49 2011 @@ -537,7 +537,6 @@ PERESOURCE Resource = NULL; LARGE_INTEGER ByteOffset; PVOID Buffer; - PDEVICE_OBJECT DeviceToVerify; ULONG BytesPerSector;
ASSERT(IrpContext); @@ -697,20 +696,6 @@ }
Status = VfatReadFileData(IrpContext, Length, ByteOffset, &ReturnedLength); - if (Status == STATUS_VERIFY_REQUIRED) - { - DPRINT("VfatReadFileData returned STATUS_VERIFY_REQUIRED\n"); - DeviceToVerify = IoGetDeviceToVerify(PsGetCurrentThread()); - IoSetDeviceToVerify(PsGetCurrentThread(), NULL); - Status = IoVerifyVolume (DeviceToVerify, FALSE); - - if (NT_SUCCESS(Status)) - { - Status = VfatReadFileData(IrpContext, Length, - ByteOffset, &ReturnedLength); - } - } - if (NT_SUCCESS(Status)) { IrpContext->Irp->IoStatus.Information = ReturnedLength; @@ -767,7 +752,6 @@ ULONG OldAllocationSize; PVOID Buffer; ULONG BytesPerSector; - PDEVICE_OBJECT DeviceToVerify;
ASSERT(IrpContext);
@@ -989,19 +973,6 @@ }
Status = VfatWriteFileData(IrpContext, Length, ByteOffset); - if (Status == STATUS_VERIFY_REQUIRED) - { - DPRINT("VfatWriteFileData returned STATUS_VERIFY_REQUIRED\n"); - DeviceToVerify = IoGetDeviceToVerify(PsGetCurrentThread()); - IoSetDeviceToVerify(PsGetCurrentThread(), NULL); - Status = IoVerifyVolume (DeviceToVerify, FALSE); - - if (NT_SUCCESS(Status)) - { - Status = VfatWriteFileData(IrpContext, Length, ByteOffset); - } - } - if (NT_SUCCESS(Status)) { IrpContext->Irp->IoStatus.Information = Length;