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:
parent
a669eca3a2
commit
80856b37e8
@ -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':
|
||||||
|
Loading…
Reference in New Issue
Block a user