]> err.no Git - util-linux/commitdiff
fdisk: doing useless ioctl when editing an image
authorPascal Terjan <pterjan@linuxfr.org>
Mon, 3 Sep 2007 22:10:16 +0000 (00:10 +0200)
committerKarel Zak <kzak@redhat.com>
Wed, 5 Sep 2007 09:52:28 +0000 (11:52 +0200)
When editing a disk image, fdisk wants to ask the kernel to reread the
partition table which is useless and provokes an error, a wrong exit
code and some waiting. This annoys me as I can't check the return code
in my script and because I have to wait a few seconds each time.

This trivial patch makes it only do the ioctl on block devices.

It also simplifies code by dropping some workaround for kernel 1.2.x

Signed-off-by: Pascal Terjan <pterjan@linuxfr.org>
fdisk/fdisk.c

index dac14c2f5502ffa4046a4e0307cc23c1e55c6318..89a49253b5a2baa62be76b452623b49d1d83a93c 100644 (file)
@@ -2248,22 +2248,15 @@ write_table(void) {
 
 void
 reread_partition_table(int leave) {
-       int error = 0;
        int i;
+       struct stat statbuf;
 
-       printf(_("Calling ioctl() to re-read partition table.\n"));
-       sync();
-       sleep(2);
-       if ((i = ioctl(fd, BLKRRPART)) != 0) {
-                error = errno;
-        } else {
-                /* some kernel versions (1.2.x) seem to have trouble
-                   rereading the partition table, but if asked to do it
-                  twice, the second time works. - biro@yggdrasil.com */
-                sync();
-                sleep(2);
-                if ((i = ioctl(fd, BLKRRPART)) != 0)
-                        error = errno;
+       i = fstat(fd, &statbuf);
+       if (i == 0 && S_ISBLK(statbuf.st_mode)) {
+               printf(_("Calling ioctl() to re-read partition table.\n"));
+               sync();
+               sleep(2);
+               i = ioctl(fd, BLKRRPART);
         }
 
        if (i) {
@@ -2272,7 +2265,7 @@ reread_partition_table(int leave) {
                         "The kernel still uses the old table.\n"
                         "The new table will be used "
                         "at the next reboot.\n"),
-                       error, strerror(error));
+                       errno, strerror(errno));
        }
 
        if (dos_changed)