]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
fdisk: move user geometry setting from fdisk.c to API
authorKarel Zak <kzak@redhat.com>
Mon, 23 Jul 2012 08:11:08 +0000 (10:11 +0200)
committerKarel Zak <kzak@redhat.com>
Mon, 23 Jul 2012 08:11:08 +0000 (10:11 +0200)
 - to avoid duplicate code
 - to remove fdisk_geom_set_cyls() from API

Signed-off-by: Karel Zak <kzak@redhat.com>
fdisks/fdisk.c
fdisks/fdisk.h
fdisks/utils.c

index 32b6de96c6f491e21e5e41533543783c9f8cd8f0..a7787c6a2aa0c19f8e9e566c8d2f516d85e54434 100644 (file)
@@ -1759,24 +1759,17 @@ gpt_warning(char *dev)
 static void print_partition_table_from_option(char *device, unsigned long sector_size)
 {
        int gb;
+       struct fdisk_context *cxt;
 
-       struct fdisk_context *cxt = fdisk_new_context_from_filename(device, 1); /* read-only */
+       cxt = fdisk_new_context_from_filename(device, 1);       /* read-only */
        if (!cxt)
                err(EXIT_FAILURE, _("cannot open %s"), device);
-       if (sector_size)  /* passed -b option, override autodiscovery */
-               cxt->phy_sector_size = cxt->sector_size = sector_size;
-       /* passed CHS option(s), override autodiscovery */
-       if (user_cylinders)
-               cxt->geom.cylinders = user_cylinders;
-       if (user_heads) {
-               cxt->geom.heads = user_heads;
-               fdisk_geom_set_cyls(cxt);
-       }
-       if (user_sectors) {
-               cxt->geom.sectors = user_sectors;
-               fdisk_geom_set_cyls(cxt);
-       }
 
+       if (sector_size) /* passed -b option, override autodiscovery */
+               fdisk_context_force_sector_size(cxt, sector_size);
+
+       fdisk_context_set_user_geometry(cxt, user_cylinders,
+                                       user_heads, user_sectors);
        gpt_warning(device);
        gb = get_boot(cxt, 1);
        if (gb < 0) { /* no DOS signature */
@@ -2065,19 +2058,12 @@ int main(int argc, char **argv)
        cxt = fdisk_new_context_from_filename(argv[optind], 0);
        if (!cxt)
                err(EXIT_FAILURE, _("cannot open %s"), argv[optind]);
+
        if (sector_size)        /* passed -b option, override autodiscovery */
-               cxt->phy_sector_size = cxt->sector_size = sector_size;
-       /* passed CHS option(s), override autodiscovery */
-       if (user_cylinders)
-               cxt->geom.cylinders = user_cylinders;
-       if (user_heads) {
-               cxt->geom.heads = user_heads;
-               fdisk_geom_set_cyls(cxt);
-       }
-       if (user_sectors) {
-               cxt->geom.sectors = user_sectors;
-               fdisk_geom_set_cyls(cxt);
-       }
+               fdisk_context_force_sector_size(cxt, sector_size);
+
+       fdisk_context_set_user_geometry(cxt, user_cylinders,
+                                       user_heads, user_sectors);
 
        print_welcome();
 
index 64a8147e651b87348fe73bbf96b19b61a754c1f2..9eead15f2ec1deaff2f6fcc0785cf4afaee23834 100644 (file)
@@ -149,7 +149,10 @@ extern int fdisk_dev_has_topology(struct fdisk_context *cxt);
 extern int fdisk_dev_sectsz_is_default(struct fdisk_context *cxt);
 extern void fdisk_free_context(struct fdisk_context *cxt);
 extern void fdisk_mbr_zeroize(struct fdisk_context *cxt);
-extern void fdisk_geom_set_cyls(struct fdisk_context *cxt);
+extern int fdisk_context_force_sector_size(struct fdisk_context *cxt, sector_t s);
+extern int fdisk_context_set_user_geometry(struct fdisk_context *cxt,
+                           unsigned int cylinders, unsigned int heads,
+                           unsigned int sectors);
 
 /* prototypes for fdisk.c */
 extern char *disk_device, *line_ptr;
index 94a080fb3391a2e66b9004d0edaff8a5b14c44a4..f1a9f3da1b84c9f3d8237a0604aa10efa72eb33c 100644 (file)
@@ -91,17 +91,65 @@ static unsigned long __get_sector_size(int fd)
 }
 
 /**
- * fdisk_geom_set_cyls
+ * fdisk_context_force_sector_size:
  * @cxt: fdisk context
+ * @s: required sector size
  *
- * Sets the cylinders based on sectors and heads
+ * Overwrites logical and physical sector size. Note that the default sector
+ * size is discovered by fdisk_new_context_from_device() from device topology.
+ *
+ * Don't use this function, rely on the default behavioer is more safe.
+ *
+ * Returns: 0 on success, < 0 on error.
  */
-void fdisk_geom_set_cyls(struct fdisk_context *cxt)
+int fdisk_context_force_sector_size(struct fdisk_context *cxt, sector_t s)
+{
+       if (!cxt)
+               return -EINVAL;
+
+       cxt->phy_sector_size = cxt->sector_size = s;
+       return 0;
+}
+
+static void recount_geometry(struct fdisk_context *cxt)
 {
        cxt->geom.cylinders = cxt->total_sectors /
                (cxt->geom.heads * cxt->geom.sectors);
 }
 
+/**
+ * fdisk_context_set_user_geometry:
+ * @cxt: fdisk context
+ * @cylinders: user specified cylinders
+ * @heads: user specified heads
+ * @sectors: user specified sectors
+ *
+ * Overrides autodiscovery and apply user specified geometry.
+ *
+ * Returns: 0 on success, < 0 on error.
+ */
+int fdisk_context_set_user_geometry(struct fdisk_context *cxt,
+                                   unsigned int cylinders,
+                                   unsigned int heads,
+                                   unsigned int sectors)
+{
+       if (!cxt)
+               return -EINVAL;
+       if (heads)
+               cxt->geom.heads = heads;
+       if (sectors)
+               cxt->geom.sectors = sectors;
+
+       recount_geometry(cxt);
+
+       if (!cxt->geom.cylinders)
+               /* use the user defined cylinders only as fillback */
+               cxt->geom.cylinders = cylinders;
+
+       return 0;
+}
+
+
 static int __discover_geometry(struct fdisk_context *cxt)
 {
        sector_t nsects;
@@ -127,13 +175,13 @@ static int __discover_geometry(struct fdisk_context *cxt)
 hs_ok: /* obtained heads and sectors */
        cxt->geom.heads = h;
        cxt->geom.sectors = s;
-       fdisk_geom_set_cyls(cxt);
+       recount_geometry(cxt);
+
        update_sector_offset(cxt);
 
        DBG(GEOMETRY, dbgprint("geometry discovered for %s: C/H/S: %lld/%d/%lld",
                               cxt->dev_path, cxt->geom.cylinders,
                               cxt->geom.heads, cxt->geom.sectors));
-
        return 0;
 }