update for HEAD-2003021201
[reactos.git] / drivers / fs / vfat / misc.c
index dd71eb8..b2bd621 100644 (file)
@@ -51,8 +51,12 @@ NTSTATUS VfatDispatchRequest (
          return VfatQueryVolumeInformation(IrpContext);
       case IRP_MJ_SET_VOLUME_INFORMATION:
          return VfatSetVolumeInformation(IrpContext);
+      case IRP_MJ_LOCK_CONTROL:
+         return VfatLockControl(IrpContext);
       case IRP_MJ_CLEANUP:
          return VfatCleanup(IrpContext);
+      case IRP_MJ_FLUSH_BUFFERS:
+         return VfatFlush(IrpContext);
       default:
          DPRINT1 ("Unexpected major function %x\n", IrpContext->MajorFunction);
          IrpContext->Irp->IoStatus.Status = STATUS_DRIVER_INTERNAL_ERROR;
@@ -62,6 +66,47 @@ NTSTATUS VfatDispatchRequest (
    }
 }
 
+NTSTATUS VfatLockControl(
+   IN PVFAT_IRP_CONTEXT IrpContext
+   )
+{
+   PVFATFCB Fcb;
+   PVFATCCB Ccb;
+   NTSTATUS Status;
+
+   DPRINT("VfatLockControl(IrpContext %x)\n", IrpContext);
+   assert(IrpContext);
+
+   Ccb = (PVFATCCB)IrpContext->FileObject->FsContext2;
+   Fcb = Ccb->pFcb;
+
+   if (IrpContext->DeviceObject == VfatGlobalData->DeviceObject)
+   {
+      Status = STATUS_INVALID_DEVICE_REQUEST;
+      goto Fail;
+   }
+
+   if (Fcb->entry.Attrib & FILE_ATTRIBUTE_DIRECTORY)
+   {
+      Status = STATUS_INVALID_PARAMETER;
+      goto Fail;
+   }
+
+   Status = FsRtlProcessFileLock(&Fcb->FileLock,
+                                 IrpContext->Irp,
+                                 NULL
+                                 );
+
+   VfatFreeIrpContext(IrpContext);
+   return Status;
+
+Fail:;
+   IrpContext->Irp->IoStatus.Status = Status;
+   IofCompleteRequest(IrpContext->Irp, NT_SUCCESS(Status) ? IO_DISK_INCREMENT : IO_NO_INCREMENT);
+   VfatFreeIrpContext(IrpContext);
+   return Status;
+}
 
 NTSTATUS STDCALL VfatBuildRequest (
         IN PDEVICE_OBJECT DeviceObject,
@@ -94,7 +139,7 @@ NTSTATUS STDCALL VfatBuildRequest (
 VOID VfatFreeIrpContext (PVFAT_IRP_CONTEXT IrpContext)
 {
    assert (IrpContext);
-   ExFreePool(IrpContext);
+   ExFreeToNPagedLookasideList(&VfatGlobalData->IrpContextLookasideList, IrpContext);
 }
 
 PVFAT_IRP_CONTEXT VfatAllocateIrpContext(PDEVICE_OBJECT DeviceObject, PIRP Irp)
@@ -107,7 +152,7 @@ PVFAT_IRP_CONTEXT VfatAllocateIrpContext(PDEVICE_OBJECT DeviceObject, PIRP Irp)
    assert (DeviceObject);
    assert (Irp);
 
-   IrpContext = ExAllocatePool (NonPagedPool, sizeof(VFAT_IRP_CONTEXT));
+   IrpContext = ExAllocateFromNPagedLookasideList(&VfatGlobalData->IrpContextLookasideList);
    if (IrpContext)
    {
       RtlZeroMemory(IrpContext, sizeof(IrpContext));