On 03.04.2011 23:05, Dio Brando wrote:
> # time strace -S time -tt
> /usr/src/grub2-1.98+20100804/debian/grub-common/usr/sbin/grub-probe
> --device /dev/sda1 --target=fs_uuid -v > /tmp/probe_strace 2>&1
>
> real    5m2.368s
> user    0m0.080s
> sys     0m0.092s
>
> log attached at this email.
Looks like the time comes from calling BLKFLSBUF. Attached patch makes
BLKFLSBUF only on write.

-- 
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:21:00 +0000
@@ -629,11 +629,14 @@
 #ifdef O_LARGEFILE
   flags |= O_LARGEFILE;
 #endif
+  
 #ifdef O_SYNC
-  flags |= O_SYNC;
+  if ((flags & O_ACCMODE) == O_WRONLY || (flags & O_ACCMODE) == O_RDWR)
+    flags |= O_SYNC;
 #endif
 #ifdef O_FSYNC
-  flags |= O_FSYNC;
+  if ((flags & O_ACCMODE) == O_WRONLY || (flags & O_ACCMODE) == O_RDWR)
+    flags |= O_FSYNC;
 #endif
 #ifdef O_BINARY
   flags |= O_BINARY;
@@ -664,7 +667,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 +688,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 +725,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 +950,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