+ st = super_by_version(array.major_version, array.minor_version);
+
+ if (fstat(fd, &stb) != 0 && !S_ISBLK(stb.st_mode))
+ stb.st_rdev = 0;
+ rv = 0;
+
+ if (st) max_disks = st->max_devs;
+
+ /* try to load a superblock */
+ for (d= 0; d<max_disks; d++) {
+ mdu_disk_info_t disk;
+ char *dv;
+ disk.number = d;
+ if (ioctl(fd, GET_DISK_INFO, &disk) < 0)
+ continue;
+ if (d >= array.raid_disks &&
+ disk.major == 0 &&
+ disk.minor == 0)
+ continue;
+ if ((dv=map_dev(disk.major, disk.minor, 1))) {
+ if (!super && (disk.state & (1<<MD_DISK_ACTIVE))) {
+ /* try to read the superblock from this device
+ * to get more info
+ */
+ int fd2 = dev_open(dv, O_RDONLY);
+ if (fd2 >=0 && st &&
+ st->ss->load_super(st, fd2, &super, NULL) == 0) {
+ struct mdinfo info;
+ st->ss->getinfo_super(&info, super);
+ if (info.array.ctime != array.ctime ||
+ info.array.level != array.level) {
+ free(super);
+ super = NULL;
+ }
+ }
+ if (fd2 >= 0) close(fd2);
+ }
+ }
+ }
+