+ disks = malloc(max_disks * sizeof(mdu_disk_info_t));
+ for (d=0; d<max_disks; d++) {
+ disks[d].state = (1<<MD_DISK_REMOVED);
+ disks[d].major = disks[d].minor = 0;
+ disks[d].number = disks[d].raid_disk = d;
+ }
+
+ next = array.raid_disks;
+ for (d=0; d < max_disks; d++) {
+ mdu_disk_info_t disk;
+ disk.number = d;
+ if (ioctl(fd, GET_DISK_INFO, &disk) < 0) {
+ if (d < array.raid_disks)
+ fprintf(stderr, Name ": cannot get device detail for device %d: %s\n",
+ d, strerror(errno));
+ continue;
+ }
+ if (disk.major == 0 && disk.minor == 0)
+ continue;
+ if (disk.raid_disk >= 0 && disk.raid_disk < array.raid_disks)
+ disks[disk.raid_disk] = disk;
+ else if (next < max_disks)
+ disks[next++] = disk;
+ }
+
+ avail = calloc(array.raid_disks, 1);
+
+ for (d= 0; d < array.raid_disks; d++) {
+ mdu_disk_info_t disk = disks[d];
+
+ if ((disk.state & (1<<MD_DISK_SYNC))) {
+ avail_disks ++;
+ avail[d] = 1;
+ }
+ }
+