]> git.ipfire.org Git - thirdparty/mdadm.git/commitdiff
Fix component size checks in validate_super0.
authorNeilBrown <neilb@suse.de>
Thu, 8 Sep 2011 02:20:36 +0000 (12:20 +1000)
committerNeilBrown <neilb@suse.de>
Thu, 8 Sep 2011 02:20:36 +0000 (12:20 +1000)
A 0.90 array can use at most 4TB of each device - 2TB between
2.6.39 and 3.1 due to a kernel bug.

The test for this in validate_super0 is very wrong.  'size' is sectors
and the number it is compared against is just confusing.

So fix it all up and correct the spelling of terabytes and remove
a second redundant test on 'size'.

Signed-off-by: NeilBrown <neilb@suse.de>
super0.c
util.c

index 4a165f9b7f30830dd47f53f5ef4018cf89dada0f..62c4ff0c518cd0296dcbad798ab59c9f681ca980 100644 (file)
--- a/super0.c
+++ b/super0.c
@@ -1115,6 +1115,13 @@ static int validate_geometry0(struct supertype *st, int level,
 {
        unsigned long long ldsize;
        int fd;
+       unsigned int tbmax = 4;
+
+       /* prior to linux 3.1, a but limits usable device size to 2TB.
+        * It was introduced in 2.6.29, but we won't worry about that detail
+        */
+       if (get_linux_version() < 3001000)
+               tbmax = 2;
 
        if (level == LEVEL_CONTAINER) {
                if (verbose)
@@ -1127,9 +1134,10 @@ static int validate_geometry0(struct supertype *st, int level,
                                MD_SB_DISKS);
                return 0;
        }
-       if (size > (0x7fffffffULL<<9)) {
+       if (size >= tbmax * 1024*1024*1024*2ULL) {
                if (verbose)
-                       fprintf(stderr, Name ": 0.90 metadata supports at most 2 terrabytes per device\n");
+                       fprintf(stderr, Name ": 0.90 metadata supports at most "
+                               "%d terabytes per device\n", tbmax);
                return 0;
        }
        if (chunk && *chunk == UnSet)
@@ -1154,8 +1162,6 @@ static int validate_geometry0(struct supertype *st, int level,
 
        if (ldsize < MD_RESERVED_SECTORS * 512)
                return 0;
-       if (size > (0x7fffffffULL<<9))
-               return 0;
        *freesize = MD_NEW_SIZE_SECTORS(ldsize >> 9);
        return 1;
 }
diff --git a/util.c b/util.c
index e68d55f3c5cf74f53fc836c29f1ad15deb72ea7f..0ea7e0d27d8a3cd347fbcc255141f0d11ef0aa30 100644 (file)
--- a/util.c
+++ b/util.c
@@ -640,7 +640,7 @@ char *human_size(long long bytes)
         * We allow upto 2048Megabytes before converting to
         * gigabytes, as that shows more precision and isn't
         * too large a number.
-        * Terrabytes are not yet handled.
+        * Terabytes are not yet handled.
         */
 
        if (bytes < 5000*1024)