Re: fdisk: +size{k,K,m,M,g,G} chaos

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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

[Index of Archives]     [Netdev]     [Ethernet Bridging]     [Linux Wireless]     [Kernel Newbies]     [Security]     [Linux for Hams]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux RAID]     [Linux Admin]     [Samba]

  Powered by Linux