]> git.ipfire.org Git - thirdparty/mdadm.git/commitdiff
Prefer version-1 superblocks for v.large devices.
authorNeil Brown <neilb@suse.de>
Tue, 31 Jan 2006 00:01:48 +0000 (00:01 +0000)
committerNeil Brown <neilb@suse.de>
Tue, 31 Jan 2006 00:01:48 +0000 (00:01 +0000)
Signed-off-by: Neil Brown <neilb@suse.de>
Create.c
mdadm.c
super1.c

index 7fbf9c02f08307c33cfd3acee7e86af569006605..71bab18b7f414b10810fb5ed1cb30758c05b4f94 100644 (file)
--- a/Create.c
+++ b/Create.c
@@ -214,6 +214,27 @@ int Create(struct supertype *st, char *mddev, int mdfd,
                        ldsize = dsize;
                        ldsize <<= 9;
                }
+               if (st == NULL) {
+                       /* Need to choose a default metadata, which is different
+                        * depending on the sizes of devices
+                        */
+                       int i;
+                       char *name = "default";
+                       if (level >= 1 && ldsize > (0x7fffffffULL<<10))
+                               name = "default/large";
+                       for(i=0; !st && superlist[i]; i++)
+                               st = superlist[i]->match_metadata_desc(name);
+
+                       if (!st) {
+                               fprintf(stderr, Name ": internal error - no default metadata style\n");
+                               exit(2);
+                       }
+                       if (st->ss->major != 0 ||
+                           st->minor_version != 90)
+                               fprintf(stderr, Name ": Defaulting to verion %d.%d metadata\n",
+                                       st->ss->major,
+                                       st->minor_version);
+               }
                freesize = st->ss->avail_size(st, ldsize >> 9);
                if (freesize == 0) {
                        fprintf(stderr, Name ": %s is too small: %luK\n",
diff --git a/mdadm.c b/mdadm.c
index f5f64b561b577bb56072a9a2fe74a14be34a9e26..925c01fef8315940134ecac8c1afb161fe4de82d 100644 (file)
--- a/mdadm.c
+++ b/mdadm.c
@@ -1006,14 +1006,6 @@ int main(int argc, char *argv[])
                        rv = 1;
                        break;
                }
-               if (ss == NULL) {
-                       for(i=0; !ss && superlist[i]; i++) 
-                               ss = superlist[i]->match_metadata_desc("default");
-               }
-               if (!ss) {
-                       fprintf(stderr, Name ": internal error - no default metadata style\n");
-                       exit(2);
-               }
 
                rv = Create(ss, devlist->devname, mdfd, chunk, level, layout, size<0 ? 0 : size,
                            raiddisks, sparedisks, ident.name,
index 62494a6e749c4f4634f5ed8764b1de96b2bfb7dc..afe29984ce766a21f1d50451cb6b2670280b00a6 100644 (file)
--- a/super1.c
+++ b/super1.c
@@ -911,7 +911,8 @@ static struct supertype *match_metadata_desc1(char *arg)
        st->ss = &super1;
        st->max_devs = 384;
        if (strcmp(arg, "1") == 0 ||
-           strcmp(arg, "1.0") == 0) {
+           strcmp(arg, "1.0") == 0 ||
+           strcmp(arg, "default/large") == 0) {
                st->minor_version = 0;
                return st;
        }