On 03.04.2011 23:06, Dio Brando wrote:
> Yes, I followed the procedure above:
>
> $ apt-get source grub-pc
> $ cd grub2-1.98+20100804
> $ patch -p1 ../readasync.diff
> $ dpkg-buildpackage -rfakeroot -b
> # dpkg -i /usr/src/grub-common_1.98+20100804-14_amd64.deb (no way, stuck)
>
> then
>
It seems like removing O_SYNC is wrong. Attached a patch which should do
it correctly

-- 
Regards
Vladimir 'φ-coder/phcoder' Serbinenko

=== modified file 'grub-core/kern/emu/hostdisk.c'
--- grub-core/kern/emu/hostdisk.c	2011-04-03 13:45:20 +0000
+++ grub-core/kern/emu/hostdisk.c	2011-04-03 21:35:46 +0000
@@ -664,7 +664,17 @@
       {
 	free (data->dev);
 	if (data->fd != -1)
-	  close (data->fd);
+	  {
+#ifdef __linux__
+	    if (data->access_mode == O_RDWR || data->access_mode == O_WRONLY)
+	      {
+		fsync (data->fd);
+		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 @@
 	    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 @@
     {
       free (data->dev);
       if (data->fd != -1)
-	close (data->fd);
+	{
+#ifdef __linux__
+	    if (data->access_mode == O_RDWR || data->access_mode == O_WRONLY)
+	      {
+		fsync (data->fd);
+		ioctl (data->fd, BLKFLSBUF, 0);
+	      }
+#endif
+	    close (data->fd);
+	}
 
       fd = open (map[disk->id].device, flags);
       if (fd >= 0)
@@ -932,7 +947,16 @@
 
   free (data->dev);
   if (data->fd != -1)
-    close (data->fd);
+    {
+#ifdef __linux__
+      if (data->access_mode == O_RDWR || data->access_mode == O_WRONLY)
+	{
+	  fsync (data->fd);
+	  ioctl (data->fd, BLKFLSBUF, 0);
+	}
+#endif
+      close (data->fd);
+    }
   free (data);
 }
 

Attachment: signature.asc
Description: OpenPGP digital signature

Reply via email to