[FASTFAT_NEW]
authorAleksey Bragin <aleksey@reactos.org>
Wed, 11 Aug 2010 12:18:24 +0000 (12:18 +0000)
committerAleksey Bragin <aleksey@reactos.org>
Wed, 11 Aug 2010 12:18:24 +0000 (12:18 +0000)
- Plug in a commented out notification call in case of cleanup.
- Implement a case of device info query.
- Implement lock control.

svn path=/trunk/; revision=48518

reactos/drivers/filesystems/fastfat_new/cleanup.c
reactos/drivers/filesystems/fastfat_new/lock.c
reactos/drivers/filesystems/fastfat_new/volume.c

index 49ae955..dbc1f1b 100644 (file)
@@ -303,12 +303,11 @@ FatiCleanup(PFAT_IRP_CONTEXT IrpContext, PIRP Irp)
                 if (FlagOn(Fcb->State, FCB_STATE_DELETE_ON_CLOSE) &&
                     Fcb->Header.AllocationSize.LowPart == 0)
                 {
-                    UNIMPLEMENTED;
-                    /*FatNotifyReportChange(IrpContext,
+                    FatNotifyReportChange(IrpContext,
                                           Vcb,
                                           Fcb,
                                           FILE_NOTIFY_CHANGE_FILE_NAME,
-                                          FILE_ACTION_REMOVED );*/
+                                          FILE_ACTION_REMOVED);
                 }
 
                 /* Remove the entry from the splay table if the file was deleted */
index a081c4b..509aa50 100644 (file)
 
 /* FUNCTIONS ****************************************************************/
 
+NTSTATUS
+NTAPI
+FatiLockControl(PFAT_IRP_CONTEXT IrpContext, PIRP Irp)
+{
+    PIO_STACK_LOCATION IrpSp;
+    TYPE_OF_OPEN TypeOfOpen;
+    PVCB Vcb;
+    PFCB Fcb;
+    PCCB Ccb;
+    NTSTATUS Status;
+
+    /* Get IRP stack location */
+    IrpSp = IoGetCurrentIrpStackLocation(Irp);
+
+    /* Determine type of open */
+    TypeOfOpen = FatDecodeFileObject(IrpSp->FileObject, &Vcb, &Fcb, &Ccb);
+
+    /* Only user file open is allowed */
+    if (TypeOfOpen != UserFileOpen)
+    {
+        FatCompleteRequest(IrpContext, Irp, STATUS_INVALID_PARAMETER);
+        return STATUS_INVALID_PARAMETER;
+    }
+
+    /* Acquire shared FCB lock */
+    if (!FatAcquireSharedFcb(IrpContext, Fcb))
+    {
+        UNIMPLEMENTED;
+        //Status = FatFsdPostRequest(IrpContext, Irp);
+        Status = STATUS_NOT_IMPLEMENTED;
+        return Status;
+    }
+
+    /* Check oplock state */
+    Status = FsRtlCheckOplock(&Fcb->Fcb.Oplock,
+                              Irp,
+                              IrpContext,
+                              FatOplockComplete,
+                              NULL);
+
+    if (Status != STATUS_SUCCESS)
+    {
+        /* Release FCB lock */
+        FatReleaseFcb(IrpContext, Fcb);
+
+        return Status;
+    }
+
+    /* Process the lock */
+    Status = FsRtlProcessFileLock(&Fcb->Fcb.Lock, Irp, NULL);
+
+    /* Update Fast I/O state */
+    Fcb->Header.IsFastIoPossible = FatIsFastIoPossible(Fcb);
+
+    /* Complete the request */
+    FatCompleteRequest(IrpContext, NULL, 0);
+
+    /* Release FCB lock */
+    FatReleaseFcb(IrpContext, Fcb);
+
+    return Status;
+}
+
 NTSTATUS
 NTAPI
 FatLockControl(PDEVICE_OBJECT DeviceObject, PIRP Irp)
 {
+    PFAT_IRP_CONTEXT IrpContext;
+    NTSTATUS Status;
+    BOOLEAN TopLevel;
+
     DPRINT1("FatLockControl()\n");
-    return STATUS_NOT_IMPLEMENTED;
+
+    /* Enter FsRtl critical region */
+    FsRtlEnterFileSystem();
+
+    /* Set Top Level IRP if not set */
+    TopLevel = FatIsTopLevelIrp(Irp);
+
+    /* Build an irp context */
+    IrpContext = FatBuildIrpContext(Irp, IoIsOperationSynchronous(Irp));
+
+    /* Call internal function */
+    Status = FatiLockControl(IrpContext, Irp);
+
+    /* Reset Top Level IRP */
+    if (TopLevel) IoSetTopLevelIrp(NULL);
+
+    /* Leave FsRtl critical region */
+    FsRtlExitFileSystem();
+
+    return Status;
 }
 
 VOID
index 6fc53f2..a6a30ab 100644 (file)
@@ -83,6 +83,25 @@ FatiQueryFsSizeInfo(PVCB Vcb,
     return Status;
 }
 
+NTSTATUS
+NTAPI
+FatiQueryFsDeviceInfo(PVCB Vcb,
+                      PFILE_FS_DEVICE_INFORMATION Buffer,
+                      PLONG Length)
+{
+    /* Deduct the minimum written length */
+    *Length -= sizeof(FILE_FS_DEVICE_INFORMATION);
+
+    /* Zero it */
+    RtlZeroMemory(Buffer, sizeof(FILE_FS_DEVICE_INFORMATION));
+
+    /* Set values */
+    Buffer->DeviceType = FILE_DEVICE_DISK;
+    Buffer->Characteristics = Vcb->TargetDeviceObject->Characteristics;
+
+    return STATUS_SUCCESS;
+}
+
 NTSTATUS
 NTAPI
 FatiQueryVolumeInfo(PFAT_IRP_CONTEXT IrpContext, PIRP Irp)
@@ -142,8 +161,7 @@ FatiQueryVolumeInfo(PFAT_IRP_CONTEXT IrpContext, PIRP Irp)
         break;
 
     case FileFsDeviceInformation:
-        UNIMPLEMENTED
-        //Status = FatiQueryFsDeviceInfo(IrpContext, Vcb, Buffer, &Length);
+        Status = FatiQueryFsDeviceInfo(Vcb, Buffer, &Length);
         break;
 
     case FileFsAttributeInformation: