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>
This commit is contained in:
Denys Vlasenko 2011-07-13 09:06:32 +02:00
parent a669eca3a2
commit 80856b37e8

View File

@ -201,7 +201,6 @@ enum action { OPEN_MAIN, TRY_ONLY, CREATE_EMPTY_DOS, CREATE_EMPTY_SUN };
static void update_units(void); static void update_units(void);
#if ENABLE_FEATURE_FDISK_WRITABLE #if ENABLE_FEATURE_FDISK_WRITABLE
static void change_units(void); static void change_units(void);
static void reread_partition_table(int leave);
static void delete_partition(int i); static void delete_partition(int i);
static unsigned get_partition(int warn, unsigned max); static unsigned get_partition(int warn, unsigned max);
static void list_types(const char *const *sys); static void list_types(const char *const *sys);
@ -2553,7 +2552,6 @@ write_table(void)
ptes[3].changed = 1; ptes[3].changed = 1;
for (i = 3; i < g_partitions; i++) { for (i = 3; i < g_partitions; i++) {
struct pte *pe = &ptes[i]; struct pte *pe = &ptes[i];
if (pe->changed) { if (pe->changed) {
write_part_table_flag(pe->sectorbuffer); write_part_table_flag(pe->sectorbuffer);
write_sector(pe->offset_from_dev_start, pe->sectorbuffer); write_sector(pe->offset_from_dev_start, pe->sectorbuffer);
@ -2565,27 +2563,24 @@ write_table(void)
sgi_write_table(); sgi_write_table();
} }
else if (LABEL_IS_SUN) { else if (LABEL_IS_SUN) {
int needw = 0; for (i = 0; i < 8; i++) {
if (ptes[i].changed) {
for (i = 0; i < 8; i++) sun_write_table();
if (ptes[i].changed) break;
needw = 1; }
if (needw) }
sun_write_table();
} }
printf("The partition table has been altered!\n\n"); printf(
reread_partition_table(1); "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(); 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, i = ioctl_or_perror(dev_fd, BLKRRPART, NULL,
"WARNING: rereading partition table " "WARNING: rereading partition table "
"failed, kernel still uses old table"); "failed, kernel still uses old table");
@ -2597,11 +2592,9 @@ reread_partition_table(int leave)
"information\n"); "information\n");
#endif #endif
if (leave) { if (ENABLE_FEATURE_CLEAN_UP)
if (ENABLE_FEATURE_CLEAN_UP) close_dev_fd();
close_dev_fd(); exit(i != 0);
exit(i != 0);
}
} }
#endif /* FEATURE_FDISK_WRITABLE */ #endif /* FEATURE_FDISK_WRITABLE */
@ -3100,7 +3093,7 @@ int fdisk_main(int argc UNUSED_PARAM, char **argv)
verify(); verify();
break; break;
case 'w': case 'w':
write_table(); /* does not return */ write_table(); /* does not return */
break; break;
#if ENABLE_FEATURE_FDISK_ADVANCED #if ENABLE_FEATURE_FDISK_ADVANCED
case 'x': case 'x':