fdisk reinstate sleep

Bob Dunlop bob.dunlop at xyzzy.org.uk
Tue Jul 12 09:47:16 UTC 2011


Hi,

On Mon, Jul 11 at 05:16, Rich Felker wrote:
> In my opinion the patch is unacceptable as-is. Any sleeps need to be
> optional and off-by-default, and at least someone should investigate
> the time actually needed. Or it could just loop retrying until it's no
> longer busy. This would be much more robust.

Here's an alternate along your lines but it's a lot of code for very
little gain.  I think a static delay is acceptable in a program that
is going to be run once in a blue moon.

There's still a fixed (is smaller) delay in there, I don't like CPU bound
busy loops.

With some debug annotation my test rig goes around the loop a maximum of
3 times.  So approx 150ms, but I'm guessing this will be very hardware
dependent.


--- busybox-1.18.3/util-linux/fdisk.c-orig	2011-07-12 10:21:47.000000000 +0100
+++ busybox-1.18.3/util-linux/fdisk.c	2011-07-12 10:26:34.000000000 +0100
@@ -2564,10 +2564,18 @@
 
 	printf("Calling ioctl() to re-read partition table\n");
 	sync();
-	/* sleep(2); Huh? */
-	i = ioctl_or_perror(dev_fd, BLKRRPART, NULL,
-			"WARNING: rereading partition table "
-			"failed, kernel still uses old table");
+	for (;;) {
+		i = ioctl(dev_fd, BLKRRPART, NULL);
+		if(i == 0)
+			break;
+		if(errno != EBUSY) {
+			bb_perror_msg(
+				"WARNING: rereading partition table "
+				"failed, kernel still uses old table");
+			break;
+		}
+		usleep(50000);
+	}
 #if 0
 	if (dos_changed)
 		printf(

-- 
        Bob Dunlop


More information about the busybox mailing list