]> git.ipfire.org Git - thirdparty/grub.git/commitdiff
* grub-core/kern/emu/hostdisk.c (open_device): Sync on close and not
authorVladimir 'phcoder' Serbinenko <phcoder@gmail.com>
Fri, 8 Apr 2011 09:49:38 +0000 (11:49 +0200)
committerVladimir 'phcoder' Serbinenko <phcoder@gmail.com>
Fri, 8 Apr 2011 09:49:38 +0000 (11:49 +0200)
on open.
(grub_util_biosdisk_close): Likewise.

ChangeLog
grub-core/kern/emu/hostdisk.c

index 1c4bbb5ab3c936665b7f0712c92224218eb9957a..a9aaa81c117420f88cfeca6e77ce9be9d85594a5 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2011-04-08  Vladimir Serbinenko  <phcoder@gmail.com>
+
+       * grub-core/kern/emu/hostdisk.c (open_device): Sync on close and not
+       on open.
+       (grub_util_biosdisk_close): Likewise.
+
 2011-04-08  Vladimir Serbinenko  <phcoder@gmail.com>
 
        * grub-core/kern/emu/getroot.c (grub_util_get_grub_dev): Add missing
index 50e5a34add7cc85122178c44ff23030a47123e83..7b034e06b3be3f9eb48320de9b0bce8107847296 100644 (file)
@@ -664,7 +664,17 @@ open_device (const grub_disk_t disk, grub_disk_addr_t sector, int flags)
       {
        free (data->dev);
        if (data->fd != -1)
-         close (data->fd);
+         {
+           if (data->access_mode == O_RDWR || data->access_mode == O_WRONLY)
+             {
+               fsync (data->fd);
+#ifdef __linux__
+               ioctl (data->fd, BLKFLSBUF, 0);
+#endif
+             }
+
+           close (data->fd);
+         }
 
        /* Open the partition.  */
        grub_dprintf ("hostdisk", "opening the device `%s' in open_device()\n", dev);
@@ -675,10 +685,6 @@ open_device (const grub_disk_t disk, grub_disk_addr_t sector, int flags)
            return -1;
          }
 
-       /* Flush the buffer cache to the physical disk.
-          XXX: This also empties the buffer cache.  */
-       ioctl (fd, BLKFLSBUF, 0);
-
        data->dev = xstrdup (dev);
        data->access_mode = (flags & O_ACCMODE);
        data->fd = fd;
@@ -716,7 +722,16 @@ open_device (const grub_disk_t disk, grub_disk_addr_t sector, int flags)
     {
       free (data->dev);
       if (data->fd != -1)
-       close (data->fd);
+       {
+           if (data->access_mode == O_RDWR || data->access_mode == O_WRONLY)
+             {
+               fsync (data->fd);
+#ifdef __linux__
+               ioctl (data->fd, BLKFLSBUF, 0);
+#endif
+             }
+           close (data->fd);
+       }
 
       fd = open (map[disk->id].device, flags);
       if (fd >= 0)
@@ -932,7 +947,16 @@ grub_util_biosdisk_close (struct grub_disk *disk)
 
   free (data->dev);
   if (data->fd != -1)
-    close (data->fd);
+    {
+      if (data->access_mode == O_RDWR || data->access_mode == O_WRONLY)
+       {
+         fsync (data->fd);
+#ifdef __linux__
+         ioctl (data->fd, BLKFLSBUF, 0);
+#endif
+       }
+      close (data->fd);
+    }
   free (data);
 }