fdisk: reinstate a short sleep between sync() and ioctl(BLKRRPART)
While at it, simplify code a bit.
function old new delta
write_table 201 198 -3
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
diff --git a/util-linux/fdisk.c b/util-linux/fdisk.c
index b86b13b..9765586 100644
--- a/util-linux/fdisk.c
+++ b/util-linux/fdisk.c
@@ -201,7 +201,6 @@
static void update_units(void);
#if ENABLE_FEATURE_FDISK_WRITABLE
static void change_units(void);
-static void reread_partition_table(int leave);
static void delete_partition(int i);
static unsigned get_partition(int warn, unsigned max);
static void list_types(const char *const *sys);
@@ -2553,7 +2552,6 @@
ptes[3].changed = 1;
for (i = 3; i < g_partitions; i++) {
struct pte *pe = &ptes[i];
-
if (pe->changed) {
write_part_table_flag(pe->sectorbuffer);
write_sector(pe->offset_from_dev_start, pe->sectorbuffer);
@@ -2565,27 +2563,24 @@
sgi_write_table();
}
else if (LABEL_IS_SUN) {
- int needw = 0;
-
- for (i = 0; i < 8; i++)
- if (ptes[i].changed)
- needw = 1;
- if (needw)
- sun_write_table();
+ for (i = 0; i < 8; i++) {
+ if (ptes[i].changed) {
+ sun_write_table();
+ break;
+ }
+ }
}
- printf("The partition table has been altered!\n\n");
- reread_partition_table(1);
-}
+ printf(
+ "The partition table has been altered.\n"
+ "Calling ioctl(BLKRRPART) to re-read partition table.\n"
+ );
-static void
-reread_partition_table(int leave)
-{
- int i;
-
- printf("Calling ioctl() to re-read partition table\n");
sync();
- /* sleep(2); Huh? */
+ /* Users with slow external USB disks on a 320MHz ARM system (year 2011)
+ * report that sleep is needed, otherwise BLKRRPART may fail with -EIO:
+ */
+ sleep(1);
i = ioctl_or_perror(dev_fd, BLKRRPART, NULL,
"WARNING: rereading partition table "
"failed, kernel still uses old table");
@@ -2597,11 +2592,9 @@
"information\n");
#endif
- if (leave) {
- if (ENABLE_FEATURE_CLEAN_UP)
- close_dev_fd();
- exit(i != 0);
- }
+ if (ENABLE_FEATURE_CLEAN_UP)
+ close_dev_fd();
+ exit(i != 0);
}
#endif /* FEATURE_FDISK_WRITABLE */
@@ -3100,7 +3093,7 @@
verify();
break;
case 'w':
- write_table(); /* does not return */
+ write_table(); /* does not return */
break;
#if ENABLE_FEATURE_FDISK_ADVANCED
case 'x':