X-Git-Url: http://git.ipfire.org/?a=blobdiff_plain;f=Create.c;h=2bf7ebe2dfac380e2c7abe38ab2c7dce38360d50;hb=61018da020ab3e25b21e0dffc7ecc4f708207a0b;hp=60e53f3642b0b4d54f1c740a8d8a27e5d924b6ae;hpb=b42f577a0dbe0b232600478f4a5068b2f63a2684;p=thirdparty%2Fmdadm.git diff --git a/Create.c b/Create.c index 60e53f36..2bf7ebe2 100644 --- a/Create.c +++ b/Create.c @@ -43,7 +43,7 @@ static int default_layout(struct supertype *st, int level, int verbose) layout = 0x102; /* near=2, far=1 */ if (verbose > 0) fprintf(stderr, - Name ": layout defaults to n1\n"); + Name ": layout defaults to n2\n"); break; case 5: case 6: @@ -235,9 +235,13 @@ int Create(struct supertype *st, char *mddev, case 6: case 0: if (chunk == 0) { - chunk = 512; + if (st && st->ss->default_chunk) + chunk = st->ss->default_chunk(st); + + chunk = chunk ? : 512; + if (verbose > 0) - fprintf(stderr, Name ": chunk size defaults to 512K\n"); + fprintf(stderr, Name ": chunk size defaults to %dK\n", chunk); } break; case LEVEL_LINEAR: @@ -375,6 +379,28 @@ int Create(struct supertype *st, char *mddev, warn |= check_ext2(fd, dname); warn |= check_reiser(fd, dname); warn |= check_raid(fd, dname); + if (strcmp(st->ss->name, "1.x") == 0 && + st->minor_version >= 1) + /* metadata at front */ + warn |= check_partitions(fd, dname, 0); + else if (level == 1 || level == LEVEL_CONTAINER) + /* partitions could be meaningful */ + warn |= check_partitions(fd, dname, freesize*2); + else + /* partitions cannot be meaningful */ + warn |= check_partitions(fd, dname, 0); + if (strcmp(st->ss->name, "1.x") == 0 && + st->minor_version >= 1 && + did_default && + level == 1 && + (warn & 1024) == 0) { + warn |= 1024; + fprintf(stderr, Name ": Note: this array has metadata at the start and\n" + " may not be suitable as a boot device. If you plan to\n" + " store '/boot' on this device please ensure that\n" + " your boot-loader understands md/v1.x metadata, or use\n" + " --metadata=0.90\n"); + } close(fd); } } @@ -516,7 +542,7 @@ int Create(struct supertype *st, char *mddev, assume_clean ) { info.array.state = 1; /* clean, but one+ drive will be missing*/ - info.resync_start = ~0ULL; + info.resync_start = MaxSector; } else { info.array.state = 0; /* not clean, but no errors */ info.resync_start = 0; @@ -629,6 +655,11 @@ int Create(struct supertype *st, char *mddev, fprintf(stderr, Name ": internal bitmaps not supported by this kernel.\n"); goto abort; } + if (!st->ss->add_internal_bitmap) { + fprintf(stderr, Name ": internal bitmaps not supported with %s metadata\n", + st->ss->name); + goto abort; + } if (!st->ss->add_internal_bitmap(st, &bitmap_chunk, delay, write_behind, bitmapsize, 1, major_num)) { @@ -762,8 +793,10 @@ int Create(struct supertype *st, char *mddev, if (fd >= 0) remove_partitions(fd); if (st->ss->add_to_super(st, &inf->disk, - fd, dv->devname)) + fd, dv->devname)) { + ioctl(mdfd, STOP_ARRAY, NULL); goto abort; + } st->ss->getinfo_super(st, inf); safe_mode_delay = inf->safe_mode_delay; @@ -867,7 +900,7 @@ int Create(struct supertype *st, char *mddev, if (ioctl(mdfd, RUN_ARRAY, ¶m)) { fprintf(stderr, Name ": RUN_ARRAY failed: %s\n", strerror(errno)); - Manage_runstop(mddev, mdfd, -1, 0); + ioctl(mdfd, STOP_ARRAY, NULL); goto abort; } } @@ -888,6 +921,10 @@ int Create(struct supertype *st, char *mddev, return 0; abort: + map_lock(&map); + map_remove(&map, fd2devnum(mdfd)); + map_unlock(&map); + if (mdfd >= 0) close(mdfd); return 1;