for (dv=devlist; dv; dv=dv->next, dnum++) {
char *dname = dv->devname;
unsigned long long freesize;
- int fd;
if (strcasecmp(dname, "missing")==0) {
if (first_missing > dnum)
first_missing = dnum;
info.array.working_disks++;
if (dnum < raiddisks)
info.array.active_disks++;
- fd = open(dname, O_RDONLY|O_EXCL, 0);
- if (fd <0 ) {
- fprintf(stderr, Name ": Cannot open %s: %s\n",
- dname, strerror(errno));
- fail=1;
- continue;
- }
if (st == NULL) {
struct createinfo *ci = conf_get_create_info();
if (ci)
" %lluK < %lluK + metadata\n",
dname, freesize, size);
fail = 1;
- close(fd);
continue;
}
if (maxdisc == NULL || (maxdisc && freesize > maxsize)) {
minsize = freesize;
}
if (runstop != 1 || verbose >= 0) {
+ int fd = open(dname, O_RDONLY, 0);
+ if (fd <0 ) {
+ fprintf(stderr, Name ": Cannot open %s: %s\n",
+ dname, strerror(errno));
+ fail=1;
+ continue;
+ }
warn |= check_ext2(fd, dname);
warn |= check_reiser(fd, dname);
warn |= check_raid(fd, dname);
+ close(fd);
}
- close(fd);
}
if (fail) {
fprintf(stderr, Name ": create aborted\n");
info.disk.state |= (1<<MD_DISK_WRITEMOSTLY);
if (dnum == insert_point ||
- strcasecmp(dv->devname, "missing")==0) {
- info.disk.major = 0;
- info.disk.minor = 0;
- info.disk.state = (1<<MD_DISK_FAULTY);
- } else {
- fd = open(dv->devname, O_RDONLY|O_EXCL, 0);
- if (fd < 0) {
- fprintf(stderr, Name ": failed to open %s after earlier success - aborting\n",
- dv->devname);
- return 1;
- }
- fstat(fd, &stb);
- info.disk.major = major(stb.st_rdev);
- info.disk.minor = minor(stb.st_rdev);
- remove_partitions(fd);
- close(fd);
+ strcasecmp(dv->devname, "missing")==0)
+ continue;
+
+ fd = open(dv->devname, O_RDWR|O_EXCL, 0);
+ if (fd < 0) {
+ fprintf(stderr, Name ": failed to open %s "
+ "after earlier success - aborting\n",
+ dv->devname);
+ return 1;
}
+ fstat(fd, &stb);
+ info.disk.major = major(stb.st_rdev);
+ info.disk.minor = minor(stb.st_rdev);
+
switch(pass){
case 1:
- st->ss->add_to_super(st, &info.disk);
+ remove_partitions(fd);
+ st->ss->add_to_super(st, &info.disk,
+ fd, dv->devname);
break;
case 2:
- if (info.disk.state == 1) break;
- Kill(dv->devname, 0, 1); /* Just be sure it is clean */
- Kill(dv->devname, 0, 1); /* and again, there could be two superblocks */
- st->ss->write_init_super(st, &info.disk,
- dv->devname);
+ close(fd);
if (ioctl(mdfd, ADD_NEW_DISK, &info.disk)) {
fprintf(stderr, Name ": ADD_NEW_DISK for %s failed: %s\n",
}
if (dv == moved_disk && dnum != insert_point) break;
}
+ if (pass == 1)
+ st->ss->write_init_super(st);
}
st->ss->free_super(st);