- else {
- ldsize = dsize;
- ldsize <<= 9;
- }
- freesize = st->ss->avail_size(st, ldsize >> 9);
- if (freesize == 0) {
- fprintf(stderr, Name ": %s is too small: %luK\n",
- dname, (unsigned long)(ldsize>>10));
- fail = 1;
- close(fd);
- continue;
+ if (st == NULL) {
+ /* Need to choose a default metadata, which is different
+ * depending on geometry of array.
+ */
+ int i;
+ char *name = "default";
+ for(i=0; !st && superlist[i]; i++) {
+ st = superlist[i]->match_metadata_desc(name);
+ if (st && !st->ss->validate_geometry
+ (st, level, layout, raiddisks,
+ chunk, size, dname, &freesize))
+ st = NULL;
+ }
+
+ if (!st) {
+ fprintf(stderr, Name ": device %s not suitable "
+ "for any style of array\n",
+ dname);
+ exit(2);
+ }
+ if (st->ss->major != 0 ||
+ st->minor_version != 90)
+ fprintf(stderr, Name ": Defaulting to version"
+ " %d.%d metadata\n",
+ st->ss->major,
+ st->minor_version);
+ } else {
+ if (!st->ss->validate_geometry(st, level, layout,
+ raiddisks,
+ chunk, size, dname,
+ &freesize)) {
+
+ fprintf(stderr,
+ Name ": %s is not suitable for "
+ "this array.\n",
+ dname);
+ fail = 1;
+ continue;
+ }