*/
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)
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"));
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)
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++) {
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);
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));