]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
fdisk: add total sectors
authorDavidlohr Bueso <dave@gnu.org>
Sun, 3 Jun 2012 18:15:20 +0000 (20:15 +0200)
committerKarel Zak <kzak@redhat.com>
Wed, 6 Jun 2012 08:40:40 +0000 (10:40 +0200)
Add the total_sectors variable to the context structure. This is the initial
geometry information.

Signed-off-by: Davidlohr Bueso <dave@gnu.org>
fdisk/fdisk.c
fdisk/fdisk.h
fdisk/fdiskdoslabel.c
fdisk/utils.c

index 47c5d672088cd705a993230514c8e48d59ee3297..a57dec22b2fe34040fc9a6f9368222fc42c4ac1c 100644 (file)
@@ -145,7 +145,6 @@ unsigned int        heads,
        units_per_sector = 1,
        display_in_cyl_units = 0;
 
-sector_t total_number_of_sectors; /* in logical sectors */
 unsigned long grain = DEFAULT_SECTOR_SIZE;
 enum labeltype disklabel;      /* Current disklabel */
 
@@ -400,8 +399,8 @@ void update_units(void)
 
 void warn_limits(struct fdisk_context *cxt)
 {
-       if (total_number_of_sectors > UINT_MAX && !nowarn) {
-               unsigned long long bytes = total_number_of_sectors * cxt->sector_size;
+       if (cxt->total_sectors > UINT_MAX && !nowarn) {
+               unsigned long long bytes = cxt->total_sectors * cxt->sector_size;
                int giga = bytes / 1000000000;
                int hectogiga = (giga + 50) / 100;
 
@@ -509,7 +508,7 @@ update_sector_offset(struct fdisk_context *cxt)
                sector_offset = x / cxt->sector_size;
 
                /* don't use huge offset on small devices */
-               if (total_number_of_sectors <= sector_offset * 4)
+               if (cxt->total_sectors <= sector_offset * 4)
                        sector_offset = cxt->phy_sector_size / cxt->sector_size;
 
                /* use 1MiB grain always when possible */
@@ -517,7 +516,7 @@ update_sector_offset(struct fdisk_context *cxt)
                        grain = 2048 * 512;
 
                /* don't use huge grain on small devices */
-               if (total_number_of_sectors <= (grain * 4 / cxt->sector_size))
+               if (cxt->total_sectors <= (grain * 4 / cxt->sector_size))
                        grain = cxt->phy_sector_size;
        }
 }
@@ -540,13 +539,9 @@ get_geometry(struct fdisk_context *cxt, struct geom *g) {
                pt_sectors ? pt_sectors :
                kern_sectors ? kern_sectors : 63;
 
-       /* get number of 512-byte sectors, and convert it the real sectors */
-       if (blkdev_get_sectors(cxt->dev_fd, &nsects) == 0)
-               total_number_of_sectors = (nsects / (cxt->sector_size >> 9));
-
        update_sector_offset(cxt);
 
-       llcyls = total_number_of_sectors / (heads * sectors);
+       llcyls = cxt->total_sectors / (heads * sectors);
        cylinders = llcyls;
        if (cylinders != llcyls)        /* truncated? */
                cylinders = ~0;
@@ -1146,7 +1141,7 @@ check_alignment(struct fdisk_context *cxt, sector_t lba, int partition)
 
 static void
 list_disk_geometry(struct fdisk_context *cxt) {
-       unsigned long long bytes = total_number_of_sectors * cxt->sector_size;
+       unsigned long long bytes = cxt->total_sectors * cxt->sector_size;
        long megabytes = bytes/1000000;
 
        if (megabytes < 10000)
@@ -1160,7 +1155,7 @@ list_disk_geometry(struct fdisk_context *cxt) {
        printf(_("%d heads, %llu sectors/track, %d cylinders"),
               heads, sectors, cylinders);
        if (units_per_sector == 1)
-               printf(_(", total %llu sectors"), total_number_of_sectors);
+               printf(_(", total %llu sectors"), cxt->total_sectors);
        printf("\n");
        printf(_("Units = %s of %d * %ld = %ld bytes\n"),
               str_units(PLURAL),
@@ -1468,7 +1463,7 @@ check(int n, unsigned int h, unsigned int s, unsigned int c,
 static void
 verify(struct fdisk_context *cxt) {
        int i, j;
-       sector_t total = 1, n_sectors = total_number_of_sectors;
+       sector_t total = 1, n_sectors = cxt->total_sectors;
        unsigned long long first[partitions], last[partitions];
        struct partition *p;
 
index a24fa2056495a7b271ae57dfc9defb4b78d2ba35..61853d14cd02c29fba2d6eec7a02ef11f27ebbbf 100644 (file)
@@ -112,6 +112,9 @@ struct fdisk_context {
        unsigned long phy_sector_size; /* physical size */
        unsigned long sector_size; /* logical size */
        unsigned long alignment_offset;
+
+       /* geometry */
+       sector_t total_sectors; /* in logical sectors */
 };
 
 extern struct fdisk_context *fdisk_new_context_from_filename(const char *fname, int readonly);
@@ -181,8 +184,8 @@ extern enum labeltype disklabel;
  */
 extern unsigned char *MBRbuffer;
 extern int MBRbuffer_changed;
-extern sector_t total_number_of_sectors;
 extern unsigned long grain;
+
 /* start_sect and nr_sects are stored little endian on all machines */
 /* moreover, they are not aligned correctly */
 static inline void
index 8ee35666cffd4c39aa1f392e4643792fd55b5231..299cff83c4c296aa7ec430bb316bb1b701865609 100644 (file)
@@ -449,10 +449,10 @@ void dos_add_partition(struct fdisk_context *cxt, int n, int sys)
        fill_bounds(first, last);
        if (n < 4) {
                start = sector_offset;
-               if (display_in_cyl_units || !total_number_of_sectors)
+               if (display_in_cyl_units || !cxt->total_sectors)
                        limit = heads * sectors * cylinders - 1;
                else
-                       limit = total_number_of_sectors - 1;
+                       limit = cxt->total_sectors - 1;
 
                if (limit > UINT_MAX)
                        limit = UINT_MAX;
index 5de4cab02bd50271d321a33ae19650fa9aee95a5..3162c7054dbf74ac559c0586d3251a5747dbc5cd 100644 (file)
@@ -40,6 +40,16 @@ static unsigned long __get_sector_size(int fd)
        return DEFAULT_SECTOR_SIZE;
 }
 
+static int __discover_geometry(struct fdisk_context *cxt)
+{
+       sector_t nsects;
+
+       /* get number of 512-byte sectors, and convert it the real sectors */
+       if (!blkdev_get_sectors(cxt->dev_fd, &nsects))
+               cxt->total_sectors = (nsects / (cxt->sector_size >> 9));
+       return 0;
+}
+
 static int __discover_topology(struct fdisk_context *cxt)
 {
 #ifdef HAVE_LIBBLKID
@@ -151,7 +161,9 @@ struct fdisk_context *fdisk_new_context_from_filename(const char *fname, int rea
        cxt->dev_path = strdup(fname);
        if (!cxt->dev_path)
                goto fail;
+
        __discover_topology(cxt);
+       __discover_geometry(cxt);
 
        DBG(CONTEXT, dbgprint("context initialized for %s [%s]",
                              fname, readonly ? "READ-ONLY" : "READ-WRITE"));