summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNeil Brown <neilb@suse.de>2006-01-31 00:01:48 +0000
committerNeil Brown <neilb@suse.de>2006-01-31 00:01:48 +0000
commit576d6d83af3e684bda417493cf64aab3ce235ab2 (patch)
tree67438281f1ad7beced6cea2cb4a1f2b6dce9561d
parent6ee5c05a11a7c5160178e6eb21a30d294f56f235 (diff)
downloadmdadm-576d6d83af3e684bda417493cf64aab3ce235ab2.tar.gz
mdadm-576d6d83af3e684bda417493cf64aab3ce235ab2.tar.xz
mdadm-576d6d83af3e684bda417493cf64aab3ce235ab2.zip
Prefer version-1 superblocks for v.large devices.
Signed-off-by: Neil Brown <neilb@suse.de>
-rw-r--r--Create.c21
-rw-r--r--mdadm.c8
-rw-r--r--super1.c3
3 files changed, 23 insertions, 9 deletions
diff --git a/Create.c b/Create.c
index 7fbf9c0..71bab18 100644
--- 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 f5f64b5..925c01f 100644
--- 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,
diff --git a/super1.c b/super1.c
index 62494a6..afe2998 100644
--- 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;
}