[ros-diffs] [fireball] 35560: - Perform volume operations as described in http://msdn.microsoft.com/en-us/library/aa364562(VS.85).aspx : Open, Lock, Work, Dismount, Unlock, Close. - Our fastfat driver doesn't support lock/unlock and dismount operations, so no improvement yet.

fireball at svn.reactos.org fireball at svn.reactos.org
Sat Aug 23 13:41:05 CEST 2008


Author: fireball
Date: Sat Aug 23 06:41:04 2008
New Revision: 35560

URL: http://svn.reactos.org/svn/reactos?rev=35560&view=rev
Log:
- Perform volume operations as described in http://msdn.microsoft.com/en-us/library/aa364562(VS.85).aspx : Open, Lock, Work, Dismount, Unlock, Close.
- Our fastfat driver doesn't support lock/unlock and dismount operations, so no improvement yet.

Modified:
    trunk/reactos/lib/fslib/vfatlib/check/io.c
    trunk/reactos/lib/fslib/vfatlib/check/io.h
    trunk/reactos/lib/fslib/vfatlib/vfatlib.c

Modified: trunk/reactos/lib/fslib/vfatlib/check/io.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/lib/fslib/vfatlib/check/io.c?rev=35560&r1=35559&r2=35560&view=diff
==============================================================================
--- trunk/reactos/lib/fslib/vfatlib/check/io.c [iso-8859-1] (original)
+++ trunk/reactos/lib/fslib/vfatlib/check/io.c [iso-8859-1] Sat Aug 23 06:41:04 2008
@@ -72,6 +72,9 @@
         return;
     }
 
+    // If rw is specified, then the volume should be exclusively locked
+    if (rw) fs_lock(TRUE);
+
     // Query geometry and partition info, to have bytes per sector, etc
 
     CurrentOffset.QuadPart = 0LL;
@@ -100,6 +103,43 @@
 
     /* Convert Dirty mask to a boolean value */
     return (DirtyMask & 1);
+}
+
+NTSTATUS fs_lock(BOOLEAN LockVolume)
+{
+    NTSTATUS Status;
+    IO_STATUS_BLOCK IoSb;
+
+    /* Check if volume is dirty */
+    Status = NtFsControlFile(fd,
+                             NULL, NULL, NULL, &IoSb,
+                             LockVolume ? FSCTL_LOCK_VOLUME :
+                                          FSCTL_UNLOCK_VOLUME,
+                             NULL, 0, NULL, 0);
+
+    if (!NT_SUCCESS(Status))
+    {
+        DPRINT1("NtFsControlFile() failed with Status 0x%08x\n", Status);
+    }
+
+    return Status;
+}
+
+void fs_dismount()
+{
+    NTSTATUS Status;
+    IO_STATUS_BLOCK IoSb;
+
+    /* Check if volume is dirty */
+    Status = NtFsControlFile(fd,
+                             NULL, NULL, NULL, &IoSb,
+                             FSCTL_DISMOUNT_VOLUME,
+                             NULL, 0, NULL, 0);
+
+    if (!NT_SUCCESS(Status))
+    {
+        DPRINT1("NtFsControlFile() failed with Status 0x%08x\n", Status);
+    }
 }
 
 void fs_read(loff_t pos,int size,void *data)

Modified: trunk/reactos/lib/fslib/vfatlib/check/io.h
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/lib/fslib/vfatlib/check/io.h?rev=35560&r1=35559&r2=35560&view=diff
==============================================================================
--- trunk/reactos/lib/fslib/vfatlib/check/io.h [iso-8859-1] (original)
+++ trunk/reactos/lib/fslib/vfatlib/check/io.h [iso-8859-1] Sat Aug 23 06:41:04 2008
@@ -51,6 +51,14 @@
 
 /* Determines whether the file system has changed. See fs_close. */
 
+NTSTATUS fs_lock(BOOLEAN LockVolume);
+
+/* Lock or unlocks the volume */
+
+void fs_dismount();
+
+/* Dismounts the volume */
+
 extern unsigned device_no;
 
 /* Major number of device (0 if file) and size (in 512 byte sectors) */

Modified: trunk/reactos/lib/fslib/vfatlib/vfatlib.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/lib/fslib/vfatlib/vfatlib.c?rev=35560&r1=35559&r2=35560&view=diff
==============================================================================
--- trunk/reactos/lib/fslib/vfatlib/vfatlib.c [iso-8859-1] (original)
+++ trunk/reactos/lib/fslib/vfatlib/vfatlib.c [iso-8859-1] Sat Aug 23 06:41:04 2008
@@ -300,6 +300,16 @@
     VfatPrint("%wZ: %u files, %lu/%lu clusters\n", DriveRoot,
         FsCheckTotalFiles, fs.clusters - free_clusters, fs.clusters );
 
+    if (FixErrors)
+    {
+        /* Dismount the volume */
+        fs_dismount();
+
+        /* Unlock the volume */
+        fs_lock(FALSE);
+    }
+
+    /* Close the volume */
     return fs_close(FixErrors) ? STATUS_SUCCESS : STATUS_UNSUCCESSFUL;
 #else
     return STATUS_SUCCESS;



More information about the Ros-diffs mailing list