diff -upN --exclude CVS ../d7-patch/includes/common.inc includes/common.inc
--- ../d7-patch/includes/common.inc	2008-05-30 19:41:51.000000000 +0200
+++ includes/common.inc	2008-06-07 16:33:53.000000000 +0200
@@ -1079,17 +1079,21 @@ function parse_size($size) {
  *   A translated string representation of the size.
  */
 function format_size($size, $langcode = NULL) {
-  if ($size < 1024) {
+  if ($size < 1000) {
     return format_plural($size, '1 byte', '@count bytes', array(), $langcode);
   }
   else {
-    $size = round($size / 1024, 2);
-    $suffix = t('KB', array(), $langcode);
-    if ($size >= 1024) {
-      $size = round($size / 1024, 2);
-      $suffix = t('MB', array(), $langcode);
+    $size = $size / 1000; // convert bytes to kilobytes (1000 bytes)
+    $units = array('KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB');
+    foreach ($units as $suffix) {
+      if (round($size, 2) >= 1000) {
+        $size = $size / 1000;
+      }
+      else {
+        break;
+      }
     }
-    return t('@size @suffix', array('@size' => $size, '@suffix' => $suffix), $langcode);
+    return t('@size @suffix', array('@size' => round($size, 2), '@suffix' => $suffix), $langcode);
   }
 }
 
diff -upN --exclude CVS ../d7-patch/includes/common.test includes/common.test
--- ../d7-patch/includes/common.test	1970-01-01 01:00:00.000000000 +0100
+++ includes/common.test	2008-06-07 16:36:34.000000000 +0200
@@ -0,0 +1,54 @@
+<?php
+
+class CommonFormatSizeTestCase extends DrupalWebTestCase {
+
+  /**
+   * Implementation of getInfo().
+   */
+  function getInfo() {
+    return array(
+      'name' => t('Format size test'),
+      'description' => t('Parse a predefined amount of bytes and compare the output with the expected value.'),
+      'group' => t('System')
+    );
+  }
+
+  /**
+   * Implementation of setUp().
+   */
+  function setUp() {
+    $this->exact_test_cases = array(
+      '1 byte'    => 1, // byte
+      '1 KB'      => 1000, // kilobyte
+      '1 MB'      => 1000000, // megabyte
+      '1 GB'      => 1000000000, // gigabyte
+      '1 TB'      => 1000000000000, // terabyte
+      '1 PB'      => 1000000000000000, // petabyte
+      '1 EB'      => 1000000000000000000, // exabyte
+      '1 ZB'      => 1000000000000000000000, // zettabyte
+      '1 YB'      => 1000000000000000000000000, // yottabyte
+    );
+    $this->rounded_test_cases = array(
+      '2 bytes'   => 2, // bytes
+      '1 MB'      => 999999, // 1 MB (not 1000 kilobyte!)
+      '3.62 MB'   => 3623651, // megabytes
+      '67.23 PB'  => 67234178751368124, // petabytes
+      '235.35 YB' => 235346823821125814962843827, // yottabytes
+    );
+    parent::setUp();
+  }
+
+  /**
+   * testCommonFormatSize
+   */
+  function testCommonFormatSize() {
+    foreach (array($this->exact_test_cases, $this->rounded_test_cases) as $test_cases) {
+      foreach ($test_cases as $expected => $size) {
+        $this->assertTrue(
+          ($result = format_size($size, NULL)) == $expected,
+          $expected . " == " . $result . " (" . $size . " bytes) %s"
+        );
+      }
+    }
+  }
+}
