summaryrefslogtreecommitdiffstats
path: root/libfdisk/src
diff options
context:
space:
mode:
Diffstat (limited to 'libfdisk/src')
-rw-r--r--libfdisk/src/alignment.c12
-rw-r--r--libfdisk/src/bsd.c3
-rw-r--r--libfdisk/src/context.c8
-rw-r--r--libfdisk/src/dos.c3
-rw-r--r--libfdisk/src/fdiskP.h1
-rw-r--r--libfdisk/src/sun.c4
6 files changed, 20 insertions, 11 deletions
diff --git a/libfdisk/src/alignment.c b/libfdisk/src/alignment.c
index c4496fe9f..15d6140ed 100644
--- a/libfdisk/src/alignment.c
+++ b/libfdisk/src/alignment.c
@@ -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)
diff --git a/libfdisk/src/bsd.c b/libfdisk/src/bsd.c
index ad0a54f6f..62e4634b6 100644
--- a/libfdisk/src/bsd.c
+++ b/libfdisk/src/bsd.c
@@ -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"));
diff --git a/libfdisk/src/context.c b/libfdisk/src/context.c
index 947f104fa..25220f064 100644
--- a/libfdisk/src/context.c
+++ b/libfdisk/src/context.c
@@ -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)
diff --git a/libfdisk/src/dos.c b/libfdisk/src/dos.c
index b2c6a58eb..6adcc7230 100644
--- a/libfdisk/src/dos.c
+++ b/libfdisk/src/dos.c
@@ -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++) {
diff --git a/libfdisk/src/fdiskP.h b/libfdisk/src/fdiskP.h
index b068638ab..0f37541d8 100644
--- a/libfdisk/src/fdiskP.h
+++ b/libfdisk/src/fdiskP.h
@@ -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);
diff --git a/libfdisk/src/sun.c b/libfdisk/src/sun.c
index d6a71b6e6..ac46d2ae5 100644
--- a/libfdisk/src/sun.c
+++ b/libfdisk/src/sun.c
@@ -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));