diff options
| author | Karel Zak <kzak@redhat.com> | 2020-03-02 12:27:36 +0100 |
|---|---|---|
| committer | Karel Zak <kzak@redhat.com> | 2020-03-02 12:27:36 +0100 |
| commit | fa3fface0f83dbf186f046210700473da7a4800b (patch) | |
| tree | daeae205854b29c62d6e44a9df668a88ef4d85a3 /disk-utils/sfdisk.c | |
| parent | 940928c9f172d75952a2d064056c35b56aa8e4e1 (diff) | |
| download | util-linux-fa3fface0f83dbf186f046210700473da7a4800b.tar.gz | |
sfdisk: fix --append to PT with gaps
sfdisk trying to be more smart than libfdisk when analyze if we can
append to the current PT. libfdisk is able to use unused partition
to create a new one (if partno not strictly specified), but sfdisk
assumes that we can add partition to extended partition only.
Addresses: https://github.com/calamares/calamares/issues/1332
Signed-off-by: Karel Zak <kzak@redhat.com>
Diffstat (limited to 'disk-utils/sfdisk.c')
| -rw-r--r-- | disk-utils/sfdisk.c | 17 |
1 files changed, 9 insertions, 8 deletions
diff --git a/disk-utils/sfdisk.c b/disk-utils/sfdisk.c index bc6b22e011..adeed1cbda 100644 --- a/disk-utils/sfdisk.c +++ b/disk-utils/sfdisk.c @@ -112,6 +112,7 @@ struct sfdisk { force : 1, /* do also stupid things */ backup : 1, /* backup sectors before write PT */ container : 1, /* PT contains container (MBR extended) partitions */ + unused : 1, /* PT contains unused partition */ append : 1, /* don't create new PT, append partitions only */ json : 1, /* JSON dump */ movedata: 1, /* move data after resize */ @@ -1519,26 +1520,26 @@ static int loop_control_commands(struct sfdisk *sf, return rc; } -static int has_container(struct sfdisk *sf) +static int has_container_or_unused(struct sfdisk *sf) { size_t i, nparts; struct fdisk_partition *pa = NULL; - if (sf->container) - return sf->container; + if (sf->container || sf->unused) + return 1; nparts = fdisk_get_npartitions(sf->cxt); for (i = 0; i < nparts; i++) { if (fdisk_get_partition(sf->cxt, i, &pa) != 0) continue; - if (fdisk_partition_is_container(pa)) { + if (!fdisk_partition_is_used(pa)) + sf->unused = 1; + if (fdisk_partition_is_container(pa)) sf->container = 1; - break; - } } fdisk_unref_partition(pa); - return sf->container; + return sf->container || sf->unused; } static size_t last_pt_partno(struct sfdisk *sf) @@ -1839,7 +1840,7 @@ static int command_fdisk(struct sfdisk *sf, int argc, char **argv) if (created && partno < 0 && next_partno == fdisk_get_npartitions(sf->cxt) - && !has_container(sf)) { + && has_container_or_unused(sf)) { fdisk_info(sf->cxt, _("All partitions used.")); rc = SFDISK_DONE_ASK; break; |
