]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
cfdisk: use fdisk_reread_changes()
authorKarel Zak <kzak@redhat.com>
Fri, 14 Jul 2017 09:08:54 +0000 (11:08 +0200)
committerKarel Zak <kzak@redhat.com>
Fri, 14 Jul 2017 09:34:55 +0000 (11:34 +0200)
Let's make cfdisk usable for disks where some partitions are mounted.

Signed-off-by: Karel Zak <kzak@redhat.com>
disk-utils/cfdisk.c

index 00c512e491af2a5c2cedb8677acca41886016825..f14ae82a850b948af6bd7a61935358b747847ed3 100644 (file)
@@ -212,6 +212,7 @@ struct cfdisk_line {
 struct cfdisk {
        struct fdisk_context    *cxt;   /* libfdisk context */
        struct fdisk_table      *table; /* partition table */
+       struct fdisk_table      *original_layout; /* original on-disk PT */
 
        struct cfdisk_menu      *menu;  /* the current menu */
 
@@ -238,6 +239,7 @@ struct cfdisk {
 #endif
        unsigned int    wrong_order :1,         /* PT not in right order */
                        zero_start :1,          /* ignore existing partition table */
+                       device_is_used : 1,     /* don't use re-read ioctl */
                        show_extra :1;          /* show extra partinfo */
 };
 
@@ -2371,7 +2373,10 @@ static int main_menu_action(struct cfdisk *cf, int key)
                if (rc)
                        warn = _("Failed to write disklabel.");
                else {
-                       fdisk_reread_partition_table(cf->cxt);
+                       if (cf->device_is_used)
+                               fdisk_reread_changes(cf->cxt, cf->original_layout);
+                       else
+                               fdisk_reread_partition_table(cf->cxt);
                        info = _("The partition table has been altered.");
                }
                cf->nwrites++;
@@ -2638,6 +2643,11 @@ int main(int argc, char *argv[])
        if (rc != 0)
                err(EXIT_FAILURE, _("cannot open %s"), diskpath);
 
+       if (!fdisk_is_readonly(cf->cxt)) {
+               cf->device_is_used = fdisk_device_is_used(cf->cxt);
+               fdisk_get_partitions(cf->cxt, &cf->original_layout);
+       }
+
        /* Don't use err(), warn() from this point */
        ui_init(cf);
        ui_run(cf);