Karel Zak wrote: > On Thu, Dec 13, 2007 at 10:35:13AM +0000, Pádraig Brady wrote: >> If you were changing the meaning, would it be better >> to sync with coreutils? There it is: >> >> <size> is a number which may be optionally followed >> by the following multiplicative suffixes: >> b 512 ("blocks") >> KB 1000 (KiloBytes) >> K 1024 (KibiBytes) >> MB 1000*1000 (MegaBytes) >> M 1024*1024 (MebiBytes) >> and so on for G, T, P, E, Z, Y > > Sounds good. It makes sense to use same suffixes everywhere. (Well, > except 'b' -- I think we needn't this multiplier.) > > The updated patch is below. > > Karel > > >>From 3cce2b41d9b4b8ca60d04beb4f226af3ef57ff48 Mon Sep 17 00:00:00 2001 > From: Karel Zak <kzak@xxxxxxxxxx> > Date: Thu, 13 Dec 2007 01:06:44 +0100 > Subject: [PATCH] fdisk: calculate +size{K,M,G} in 2^N > > fdisk(8) does not calculate partition size (+sizeM or +sizeG) > in MiB or GiB correctly. It uses 10^N instead 2^N. > > This patch cleanups +sizeX to: > > +sizeK -- KiB (2^10) > +sizeKB -- KB (10^3) > +sizeM -- MiB (2^20) > +sizeMB -- MB (10^6) > +sizeG -- GB (10^9) > +sizeGB -- GiB (2^30) > > This patch also fixes the "Last cylinder..." hint message. The "+number" > without any suffix is not a size at all. It's number of cylinders/sectors. > > Old version: > Last cylinder or +size or +sizeM or +sizeK > > Fixed version: > Last cylinder, +cylinders, +sizeK, +sizeM or +sizeG > > Note, the 10^N suffixes are not proposed to end-uses in the hint > message. > > Signed-off-by: Karel Zak <kzak@xxxxxxxxxx> > --- > fdisk/fdisk.c | 67 +++++++++++++++++++++++++++++++++++++------------------- > 1 files changed, 44 insertions(+), 23 deletions(-) > > diff --git a/fdisk/fdisk.c b/fdisk/fdisk.c > index c5e3f06..6a1af32 100644 > --- a/fdisk/fdisk.c > +++ b/fdisk/fdisk.c > @@ -1174,33 +1174,54 @@ read_int(unsigned int low, unsigned int dflt, unsigned int high, > > i = atoi(line_ptr+1); > > - while (isdigit(*++line_ptr)) > + while (isdigit(*++line_ptr)) > use_default = 0; > > - switch (*line_ptr) { > - case 'c': > - case 'C': > - if (!display_in_cyl_units) > - i *= heads * sectors; > - break; > - case 'K': > - absolute = 1024; > - break; > - case 'k': > + if ((*line_ptr == 'C' || *line_ptr == 'c') && > + *(line_ptr + 1) == '\n') { > + /* > + * Cylinders > + */ > + if (!display_in_cyl_units) > + i *= heads * sectors; > + } else if (*(line_ptr + 1) == 'B' && > + *(line_ptr + 2) == '\n') { > + /* > + * 10^N > + */ > + if (*line_ptr == 'K') > absolute = 1000; > - break; > - case 'm': > - case 'M': > + else if (*line_ptr == 'M') > absolute = 1000000; > - break; > - case 'g': > - case 'G': > + else if (*line_ptr == 'G') > absolute = 1000000000; > - break; > - default: > - break; > + else > + absolute = -1; > + } else if (*(line_ptr + 1) == '\n') { > + /* > + * 2^N > + */ > + if (*line_ptr == 'K') > + absolute = 1 << 10; > + else if (*line_ptr == 'M') > + absolute = 1 << 20; > + else if (*line_ptr == 'G') > + absolute = 1 << 30; > + else > + absolute = -1; > + } else if (*line_ptr != '\n') > + absolute = -1; > + > + if (absolute == -1) { > + int len = strlen(line_ptr) - 1; > + *(line_ptr+len) = '\0'; > + printf(_("Unsupported suffix: '%s'.\n"), line_ptr); > + printf(_("Supported: 10^N: KB (KiloByte), MB (MegaByte), GB (GigaByte)\n" > + " 2^N: K (KibiByte), M (MebiByte), G (GibiByte)\n")); > + continue; > } > - if (absolute) { > + > + if (absolute && i) { > unsigned long long bytes; > unsigned long unit; > > @@ -2061,8 +2082,8 @@ add_partition(int n, int sys) { > stop = limit; > } else { > snprintf(mesg, sizeof(mesg), > - _("Last %s or +size or +sizeM or +sizeK"), > - str_units(SINGULAR)); > + _("Last %s, +%s, +sizeK, +sizeM or +sizeG"), > + str_units(SINGULAR), str_units(PLURAL)); > stop = read_int(cround(start), cround(limit), cround(limit), > cround(start), mesg); > if (display_in_cyl_units) { With the patch applied: [root@fedora-i386 fdisk]# ./fdisk /dev/sdb ... Partition number (1-4): 2 First cylinder (4864-9964, default 4864): Using default value 4864 Last cylinder, +cylinders, +sizeK, +sizeM or +sizeG (4864-9964, default 9964): +1000M ^^^^^^^ Unsupported suffix: 'M '. I deliberately leave a space after '+1000M' ;) And before applying the patch, fdisk accepts this. BTW: I feel the message "Last cylinder,...):" is a bit too long after patch. - To unsubscribe from this list: send the line "unsubscribe util-linux-ng" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html