-
- for (dnum=0, dv = devlist ; dv ; dv=dv->next, dnum++) {
- int fd;
- struct stat stb;
- mdu_disk_info_t disk;
-
- disk.number = dnum;
- if (dnum >= insert_point)
- disk.number++;
- disk.raid_disk = disk.number;
- if (disk.raid_disk < raiddisks)
- disk.state = 6; /* active and in sync */
- else
- disk.state = 0;
- if (strcasecmp(dv->devname, "missing")==0) {
- disk.major = 0;
- disk.minor = 0;
- disk.state = 1; /* faulty */
- } else {
- fd = open(dv->devname, O_RDONLY, 0);
+
+ if (bitmap_file) {
+ int uuid[4];
+
+ st->ss->uuid_from_super(st, uuid);
+ if (CreateBitmap(bitmap_file, force, (char*)uuid, bitmap_chunk,
+ delay, write_behind,
+ bitmapsize,
+ major_num)) {
+ return 1;
+ }
+ bitmap_fd = open(bitmap_file, O_RDWR);
+ if (bitmap_fd < 0) {
+ fprintf(stderr, Name ": weird: %s cannot be openned\n",
+ bitmap_file);
+ return 1;
+ }
+ if (ioctl(mdfd, SET_BITMAP_FILE, bitmap_fd) < 0) {
+ fprintf(stderr, Name ": Cannot set bitmap file for %s: %s\n",
+ mddev, strerror(errno));
+ return 1;
+ }
+ }
+
+
+
+ for (pass=1; pass <=2 ; pass++) {
+ mddev_dev_t moved_disk = NULL; /* the disk that was moved out of the insert point */
+
+ for (dnum=0, dv = devlist ; dv ;
+ dv=(dv->next)?(dv->next):moved_disk, dnum++) {
+ int fd;
+ struct stat stb;
+
+ info.disk.number = dnum;
+ if (dnum == insert_point) {
+ moved_disk = dv;
+ }
+ info.disk.raid_disk = info.disk.number;
+ if (info.disk.raid_disk < raiddisks)
+ info.disk.state = (1<<MD_DISK_ACTIVE) |
+ (1<<MD_DISK_SYNC);
+ else
+ info.disk.state = 0;
+ if (dv->writemostly)
+ info.disk.state |= (1<<MD_DISK_WRITEMOSTLY);
+
+ if (dnum == insert_point ||
+ strcasecmp(dv->devname, "missing")==0)
+ continue;
+
+ fd = open(dv->devname, O_RDWR|O_EXCL, 0);