]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
libfdisk: change the way how apply user device properties
authorKarel Zak <kzak@redhat.com>
Fri, 13 Jan 2017 11:44:35 +0000 (12:44 +0100)
committerKarel Zak <kzak@redhat.com>
Fri, 13 Jan 2017 11:56:10 +0000 (12:56 +0100)
The current code calls fdisk_apply_user_device_properties() after
label probing, because we want to overwrite label geometry by user
settings (e.g. -C -H -S fdisk options).

Unfortunately, this way does not work if we need to use a different
sector size, because label probing depends on sector size... So, the
right way is to apply user setting to the fdisk context before we
start to read from device, and overwrite geometry again after label is
already read. Fortunately, this shit is necessary only rarely and for
SUN and SGI disk labels.

Addresses: https://github.com/karelzak/util-linux/issues/396
Signed-off-by: Karel Zak <kzak@redhat.com>
libfdisk/src/alignment.c
libfdisk/src/bsd.c
libfdisk/src/context.c
libfdisk/src/dos.c
libfdisk/src/fdiskP.h
libfdisk/src/sun.c

index c4496fe9f22f65f109b058b896713be8b7778dea..15d6140ed73b145382c831ea325134b2348838ae 100644 (file)
@@ -321,11 +321,13 @@ int fdisk_save_user_sector_size(struct fdisk_context *cxt,
  */
 int fdisk_has_user_device_properties(struct fdisk_context *cxt)
 {
-       return (cxt->user_pyh_sector
-                   || cxt->user_log_sector
-                   || cxt->user_geom.heads
-                   || cxt->user_geom.sectors
-                   || cxt->user_geom.cylinders);
+       return (cxt->user_pyh_sector || cxt->user_log_sector ||
+               fdisk_has_user_device_geometry(cxt));
+}
+
+int fdisk_has_user_device_geometry(struct fdisk_context *cxt)
+{
+       return (cxt->user_geom.heads || cxt->user_geom.sectors || cxt->user_geom.cylinders);
 }
 
 int fdisk_apply_user_device_properties(struct fdisk_context *cxt)
index ad0a54f6f4bcb94ab242a83bdb6ea038269eca1f..62e4634b6106453b4e230205676aab589c5269d4 100644 (file)
@@ -859,6 +859,9 @@ static int bsd_readlabel(struct fdisk_context *cxt)
        cxt->geom.heads = d->d_ntracks;
        cxt->geom.cylinders = d->d_ncylinders;
 
+       if (fdisk_has_user_device_geometry(cxt))
+               fdisk_apply_user_device_properties(cxt);
+
        cxt->label->nparts_cur = d->d_npartitions;
        cxt->label->nparts_max = BSD_MAXPARTITIONS;
        DBG(LABEL, ul_debug("read BSD label"));
index 947f104fabf8ad8f31184036c4144c4cca1791cb..25220f0642c5b0f1558b8ef74ca701628633ed35 100644 (file)
@@ -614,17 +614,13 @@ int fdisk_assign_device(struct fdisk_context *cxt,
        fdisk_discover_topology(cxt);
        fdisk_discover_geometry(cxt);
 
+       fdisk_apply_user_device_properties(cxt);
+
        if (fdisk_read_firstsector(cxt) < 0)
                goto fail;
 
-       /* detect labels and apply labels specific stuff (e.g geometry)
-        * to the context */
        fdisk_probe_labels(cxt);
 
-       /* let's apply user geometry *after* label prober
-        * to make it possible to override in-label setting */
-       fdisk_apply_user_device_properties(cxt);
-
        /* warn about obsolete stuff on the device if we aren't in
         * list-only mode and there is not PT yet */
        if (!fdisk_is_listonly(cxt) && !fdisk_has_label(cxt) && check_collisions(cxt) < 0)
index b2c6a58ebed40cb1cd90e8ebeac3b98e42484a7d..6adcc7230eab182331b97d42efe283a508c48a45 100644 (file)
@@ -779,6 +779,9 @@ static int dos_probe_label(struct fdisk_context *cxt)
        if (h && s) {
                cxt->geom.heads = h;
                cxt->geom.sectors = s;
+
+               if (fdisk_has_user_device_geometry(cxt))
+                       fdisk_apply_user_device_properties(cxt);
        }
 
        for (i = 0; i < 4; i++) {
index b068638ab1de847480d63118aa80d093d90635b8..0f37541d8e3b8d56294b845c8060501f9eaadceb 100644 (file)
@@ -413,6 +413,7 @@ fdisk_sector_t fdisk_cround(struct fdisk_context *cxt, fdisk_sector_t num);
 extern int fdisk_discover_geometry(struct fdisk_context *cxt);
 extern int fdisk_discover_topology(struct fdisk_context *cxt);
 
+extern int fdisk_has_user_device_geometry(struct fdisk_context *cxt);
 extern int fdisk_apply_user_device_properties(struct fdisk_context *cxt);
 extern void fdisk_zeroize_device_properties(struct fdisk_context *cxt);
 
index d6a71b6e6f54e83fbe78569cf8e4d0ed7b4f3d90..ac46d2ae57e34562844f96e9509a4006aee9b0b2 100644 (file)
@@ -146,6 +146,10 @@ static int sun_probe_label(struct fdisk_context *cxt)
        cxt->geom.cylinders = be16_to_cpu(sunlabel->ncyl);
        cxt->geom.sectors = be16_to_cpu(sunlabel->nsect);
 
+       /* we have on label geom, but user has to win */
+       if (fdisk_has_user_device_geometry(cxt))
+               fdisk_apply_user_device_properties(cxt);
+
        if (be32_to_cpu(sunlabel->vtoc.version) != SUN_VTOC_VERSION) {
                fdisk_warnx(cxt, _("Detected sun disklabel with wrong version [%d]."),
                        be32_to_cpu(sunlabel->vtoc.version));