On Thu, 13 Dec 2007 01:14:34 +0100 Karel Zak wrote: > On Wed, Dec 12, 2007 at 03:16:46PM -0800, Randy Dunlap wrote: > > On Thu, 13 Dec 2007 00:09:52 +0100 Karel Zak wrote: > > > It seems like a chaos between KiB, MiB, (2^N) and kB, MB, GB, (10^N). > > > > > > Does anyone understand this code? I don't believe it's a bug -- it's > > > too stupid... > > > > It looks to me like someone decided that only K could mean 2^N > > and any other suffix means 10^M. > > Yes. A proposed patch is below. > > Karel > > > > >From 00855c890465670ba76934229dd6881647934e22 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 +size[kKmMgG] to: > > +size -- bytes > +sizek -- kB (10^3) > +sizeK -- KiB (2^10) > +sizem -- MB (10^6) > +sizeM -- MiB (2^20) > +sizeg -- GB (10^9) > +sizeG -- GiB (2^30) > > Signed-off-by: Karel Zak <kzak@xxxxxxxxxx> > --- > fdisk/fdisk.c | 20 ++++++++++++-------- > 1 files changed, 12 insertions(+), 8 deletions(-) > > diff --git a/fdisk/fdisk.c b/fdisk/fdisk.c > index c5e3f06..0accb20 100644 > --- a/fdisk/fdisk.c > +++ b/fdisk/fdisk.c > @@ -1174,7 +1174,7 @@ 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) { > @@ -1184,18 +1184,22 @@ read_int(unsigned int low, unsigned int dflt, unsigned int high, > i *= heads * sectors; > break; > case 'K': > - absolute = 1024; > + absolute = 2 << 10; /* KiB */ > break; > case 'k': > - absolute = 1000; > + absolute = 1000; /* kB */ > break; > - case 'm': > case 'M': > - absolute = 1000000; > + absolute = 2 << 19; /* MiB */ > + break; > + case 'm': > + absolute = 1000000; /* MB */ > break; > - case 'g': > case 'G': > - absolute = 1000000000; > + absolute = 2 << 29; /* GiB */ > + break; > + case 'g': > + absolute = 1000000000; /* GB */ > break; > default: > break; > @@ -2061,7 +2065,7 @@ add_partition(int n, int sys) { > stop = limit; > } else { > snprintf(mesg, sizeof(mesg), > - _("Last %s or +size or +sizeM or +sizeK"), > + _("Last %s or +size, +sizeK, +sizeM or +sizeG"), I would use + _("Last %s or +size[KkMmGg]"), or are you trying to encourage use of 2^N? :) Of course, if [KkMmGg] is used, somewhere it needs to tell users what the difference in them is. > str_units(SINGULAR)); > stop = read_int(cround(start), cround(limit), cround(limit), > cround(start), mesg); Rest looks reasonable to me. --- ~Randy - 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