- fstat(fd, &stb);
- disk.major = major(stb.st_rdev);
- disk.minor = minor(stb.st_rdev);
- close(fd);
- }
- if (ioctl(mdfd, ADD_NEW_DISK, &disk)) {
- fprintf(stderr, Name ": ADD_NEW_DISK for %s failed: %s\n",
- dv->devname, strerror(errno));
- return 1;
+ disk.raid_disk = disk.number;
+ if (disk.raid_disk < raiddisks)
+ disk.state = 6; /* active and in sync */
+ else
+ disk.state = 0;
+ if (dnum == insert_point ||
+ strcasecmp(dv->devname, "missing")==0) {
+ disk.major = 0;
+ disk.minor = 0;
+ disk.state = 1; /* 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);
+ disk.major = major(stb.st_rdev);
+ disk.minor = minor(stb.st_rdev);
+ close(fd);
+ }
+ if (disk.state != 1)
+ switch(pass){
+ case 1:
+ st->ss->add_to_super(super, &disk);
+ break;
+ case 2:
+ st->ss->write_init_super(st, super, &disk, dv->devname);
+
+ if (ioctl(mdfd, ADD_NEW_DISK, &disk)) {
+ fprintf(stderr, Name ": ADD_NEW_DISK for %s failed: %s\n",
+ dv->devname, strerror(errno));
+ free(super);
+ return 1;
+ }
+
+ break;
+ }
+ if (dv == moved_disk && dnum != insert_point) break;