diff -u util-linux-2.13-pre7_/fdisk/Makefile.am util-linux-2.13-pre7/fdisk/Makefile.am
--- util-linux-2.13-pre7_/fdisk/Makefile.am	2005-10-16 14:12:52.000000000 +0200
+++ util-linux-2.13-pre7/fdisk/Makefile.am	2008-08-31 02:05:08.000000000 +0200
@@ -23,7 +23,7 @@
 sbin_PROGRAMS += cfdisk
 man_MANS += cfdisk.8
 cfdisk_SOURCES = cfdisk.c disksize.c i386_sys_types.c
-cfdisk_LDADD = -lncurses
+cfdisk_LDADD = -lncurses -lm
 endif
 endif
 
diff -u util-linux-2.13-pre7_/fdisk/Makefile.in util-linux-2.13-pre7/fdisk/Makefile.in
--- util-linux-2.13-pre7_/fdisk/Makefile.in	2006-03-06 00:21:02.000000000 +0100
+++ util-linux-2.13-pre7/fdisk/Makefile.in	2008-08-31 02:09:25.000000000 +0200
@@ -276,7 +276,7 @@
 @M68K_FALSE@@SPARC_FALSE@sfdisk_SOURCES = sfdisk.c disksize.c i386_sys_types.c partname.c
 @HAVE_NCURSES_TRUE@@M68K_FALSE@@SPARC_FALSE@@USE_SLANG_FALSE@cfdisk_SOURCES = cfdisk.c disksize.c i386_sys_types.c
 @M68K_FALSE@@SPARC_FALSE@@USE_SLANG_TRUE@cfdisk_SOURCES = cfdisk.c disksize.c i386_sys_types.c
-@HAVE_NCURSES_TRUE@@M68K_FALSE@@SPARC_FALSE@@USE_SLANG_FALSE@cfdisk_LDADD = -lncurses
+@HAVE_NCURSES_TRUE@@M68K_FALSE@@SPARC_FALSE@@USE_SLANG_FALSE@cfdisk_LDADD = -lncurses -lm
 @M68K_FALSE@@SPARC_FALSE@@USE_SLANG_TRUE@cfdisk_LDADD = -lslang
 all: all-am
 
diff -u util-linux-2.13-pre7_/fdisk/cfdisk.c util-linux-2.13-pre7/fdisk/cfdisk.c
--- util-linux-2.13-pre7_/fdisk/cfdisk.c	2005-11-17 02:14:33.000000000 +0100
+++ util-linux-2.13-pre7/fdisk/cfdisk.c		2008-08-31 02:40:43.000000000 +0200
@@ -87,11 +87,12 @@
 #define DEFAULT_DEVICE "/dev/hda"
 #define ALTERNATE_DEVICE "/dev/sda"
 
-/* With K=1024 we have `binary' megabytes, gigabytes, etc.
+/* With Ki=1024 we have `binary' megabytes, gigabytes, etc.
    Some misguided hackers like that.
    With K=1000 we have MB and GB that follow the standards
    [SI, ATA, IEEE etc] and the disk manufacturers and the law. */
 #define K	1000
+#define Ki	1024
 
 #define LINE_LENGTH 80
 #define MAXIMUM_PARTS 60
@@ -133,8 +134,14 @@
 /* Display units */
 #define GIGABYTES 1
 #define MEGABYTES 2
-#define SECTORS 3
+#define SECTORS   3
 #define CYLINDERS 4
+#define KILOBYTES 5
+#define KIBIBYTES 6
+#define _2KBLOCKS 7
+#define _4KBLOCKS 8
+#define MEBIBYTES 9
+#define GIBIBYTES 0
 
 #define GS_DEFAULT -1
 #define GS_ESCAPE -2
@@ -1439,19 +1446,38 @@
 	for (j = 0;
 	     j < len-1 && (isdigit(response[j]) || response[j] == '.');
 	     j++);
-	if (toupper(response[j]) == 'K') {
-	    num_sects = num_cyls(atof(response)*K)*cylinder_size;
-	} else if (toupper(response[j]) == 'M') {
-	    num_sects = num_cyls(atof(response)*K*K)*cylinder_size;
-	} else if (toupper(response[j]) == 'G') {
-	    num_sects = num_cyls(atof(response)*K*K*K)*cylinder_size;
-	} else if (toupper(response[j]) == 'C') {
-	    num_sects = round_int(atof(response))*cylinder_size;
-	} else if (toupper(response[j]) == 'S') {
-	    num_sects = round_int(atof(response));
-	} else {
-	    num_sects = num_cyls(atof(response)*K*K)*cylinder_size;
-	}
+        if (j+1 < len && toupper(response[j+1]) == 'I') {
+            /* Ki/Mi/Gi-Byte mode */ 
+            if (toupper(response[j]) == 'K') {
+                num_sects = num_cyls(atof(response)*Ki)*cylinder_size;
+            } else if (toupper(response[j]) == 'M') {
+                num_sects = num_cyls(atof(response)*Ki*Ki)*cylinder_size;
+            } else if (toupper(response[j]) == 'G') {
+                num_sects = num_cyls(atof(response)*Ki*Ki*Ki)*cylinder_size;
+            /* for the following chars, an appended i/I is ignored */
+            } else if (toupper(response[j]) == 'C') {
+                num_sects = round_int(atof(response))*cylinder_size;
+            } else if (toupper(response[j]) == 'S') {
+                num_sects = round_int(atof(response));
+            } else { /* Site specification not given: use MB (not MiB) */
+                num_sects = num_cyls(atof(response)*K*K)*cylinder_size;
+            }
+        } else {
+            /* K/M/G-Byte mode */
+            if (toupper(response[j]) == 'K') {
+                num_sects = num_cyls(atof(response)*K)*cylinder_size;
+            } else if (toupper(response[j]) == 'M') {
+                num_sects = num_cyls(atof(response)*K*K)*cylinder_size;
+            } else if (toupper(response[j]) == 'G') {
+                num_sects = num_cyls(atof(response)*K*K*K)*cylinder_size;
+            } else if (toupper(response[j]) == 'C') {
+                num_sects = round_int(atof(response))*cylinder_size;
+            } else if (toupper(response[j]) == 'S') {
+                num_sects = round_int(atof(response));
+            } else {
+                num_sects = num_cyls(atof(response)*K*K)*cylinder_size;
+            }
+        }
     }
 
     if (num_sects <= 0 ||
@@ -2578,13 +2604,25 @@
     size = p_info[i].last_sector - p_info[i].first_sector + 1;
     fsize = (double) size * SECTOR_SIZE;
     if (display_units == SECTORS)
-	mvprintw(y, SIZE_START, "%11lld", size);
+	mvprintw(y, SIZE_START, "%12lld", size);
     else if (display_units == CYLINDERS)
-	mvprintw(y, SIZE_START, "%11lld", size/cylinder_size);
+	mvprintw(y, SIZE_START, "%12lld", size/cylinder_size);
     else if (display_units == MEGABYTES)
-	mvprintw(y, SIZE_START, "%11.2f", ceiling((100*fsize)/(K*K))/100);
+	mvprintw(y, SIZE_START, "%12.1f", ceil((10.0*fsize)/(K*K))/10.0);
     else if (display_units == GIGABYTES)
-	mvprintw(y, SIZE_START, "%11.2f", ceiling((100*fsize)/(K*K*K))/100);
+	mvprintw(y, SIZE_START, "%12.1f", ceil((10.0*fsize)/(K*K*K))/10.0);
+    else if (display_units == KILOBYTES)
+	mvprintw(y, SIZE_START, "%12.1f", ceil((10.0*fsize)/K)/10.0);
+    else if (display_units == KIBIBYTES)
+	mvprintw(y, SIZE_START, "%12.1f", fsize/Ki);
+    else if (display_units == _2KBLOCKS)
+	mvprintw(y, SIZE_START, "%12.1f", fsize/(2.0*Ki));
+    else if (display_units == _4KBLOCKS)
+	mvprintw(y, SIZE_START, "%12.1f", ceil((10.0*fsize)/(4*Ki))/10.0);
+    else if (display_units == MEBIBYTES)
+	mvprintw(y, SIZE_START, "%12.1f", ceil((10.0*fsize)/(Ki*Ki))/10.0);
+    else if (display_units == GIBIBYTES)
+	mvprintw(y, SIZE_START, "%12.1f", ceil((10.0*fsize)/(Ki*Ki*Ki))/10.0);
     if (size % cylinder_size != 0 ||
 	p_info[i].first_sector % cylinder_size != 0)
 	mvprintw(y, COLUMNS-1, "*");
@@ -2659,13 +2697,25 @@
     mvaddstr(DISK_TABLE_START, FSTYPE_START, _("FS Type"));
     mvaddstr(DISK_TABLE_START, LABEL_START+1, _("[Label]"));
     if (display_units == SECTORS)
-	mvaddstr(DISK_TABLE_START, SIZE_START, _("    Sectors"));
+	mvaddstr(DISK_TABLE_START, SIZE_START, _("     Sectors"));
     else if (display_units == CYLINDERS)
-	mvaddstr(DISK_TABLE_START, SIZE_START, _("  Cylinders"));
+	mvaddstr(DISK_TABLE_START, SIZE_START, _("   Cylinders"));
     else if (display_units == MEGABYTES)
-	mvaddstr(DISK_TABLE_START, SIZE_START, _("  Size (MB)"));
+	mvaddstr(DISK_TABLE_START, SIZE_START, _("   Size (MB)"));
     else if (display_units == GIGABYTES)
-	mvaddstr(DISK_TABLE_START, SIZE_START, _("  Size (GB)"));
+	mvaddstr(DISK_TABLE_START, SIZE_START, _("   Size (GB)"));
+    else if (display_units == KILOBYTES)
+	mvaddstr(DISK_TABLE_START, SIZE_START, _("   Size (KB)"));
+    else if (display_units == KIBIBYTES)
+	mvaddstr(DISK_TABLE_START, SIZE_START, _("  Size (KiB)"));
+    else if (display_units == _2KBLOCKS)
+	mvaddstr(DISK_TABLE_START, SIZE_START, _("  2Ki-Blocks"));
+    else if (display_units == _4KBLOCKS)
+	mvaddstr(DISK_TABLE_START, SIZE_START, _("  4Ki-Blocks"));
+    else if (display_units == MEBIBYTES)
+	mvaddstr(DISK_TABLE_START, SIZE_START, _("  Size (MiB)"));
+    else if (display_units == GIBIBYTES)
+	mvaddstr(DISK_TABLE_START, SIZE_START, _("  Size (GiB)"));
 
     move(DISK_TABLE_START+1, 1);
     for (i = 1; i < COLS-1; i++)
@@ -2838,14 +2888,26 @@
 	    break;
 	case 'U':
 	case 'u':
-	    if (display_units == GIGABYTES)
-		display_units = MEGABYTES;
-	    else if (display_units == MEGABYTES)
+	    if (display_units == MEGABYTES)
+		display_units = MEBIBYTES;
+	    else if (display_units == MEBIBYTES)
+		display_units = GIGABYTES;
+	    else if (display_units == GIGABYTES)
+		display_units = GIBIBYTES;
+	    else if (display_units == GIBIBYTES)
 		display_units = SECTORS;
 	    else if (display_units == SECTORS)
 		display_units = CYLINDERS;
 	    else if (display_units == CYLINDERS)
-		display_units = MEGABYTES; 	/* not yet GIGA */
+		display_units = KILOBYTES;
+	    else if (display_units == KILOBYTES)
+		display_units = KIBIBYTES;
+	    else if (display_units == KIBIBYTES)
+		display_units = _2KBLOCKS;
+	    else if (display_units == _2KBLOCKS)
+		display_units = _4KBLOCKS;
+	    else if (display_units == _4KBLOCKS)
+		display_units = MEGABYTES;
 	    draw_screen();
 	    break;
 	case 'W':
