int is_26 = get_linux_version() >= 2006000;
int is_rebuilding = 0;
int failed = 0;
+ struct supertype *st = NULL;
+ int max_disks = MD_SB_DISKS;
- mdp_super_t super;
- int have_super = 0;
+ void *super = NULL;
int rv = test ? 4 : 1;
if (fd < 0) {
close(fd);
return rv;
}
+ 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<MD_SB_DISKS; d++) {
+ for (d= 0; d<max_disks; d++) {
mdu_disk_info_t disk;
char *dv;
disk.number = d;
disk.minor == 0)
continue;
if ((dv=map_dev(disk.major, disk.minor))) {
- if (!have_super && (disk.state & (1<<MD_DISK_ACTIVE))) {
+ if (!super && (disk.state & (1<<MD_DISK_ACTIVE))) {
/* try to read the superblock from this device
* to get more info
*/
int fd2 = open(dv, O_RDONLY);
- if (fd2 >=0 &&
- load_super(fd2, &super) ==0 &&
- (unsigned long)super.ctime == (unsigned long)array.ctime &&
- (unsigned int)super.level == (unsigned int)array.level)
- have_super = 1;
+ 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);
}
}
struct mdstat_ent *ms = mdstat_read(0);
struct mdstat_ent *e;
int devnum = array.md_minor;
- if (MAJOR(stb.st_rdev) != MD_MAJOR)
+ if (major(stb.st_rdev) != MD_MAJOR)
devnum = -1 - devnum;
for (e=ms; e; e=e->next)
atime = array.utime;
printf(" Update Time : %.24s\n", ctime(&atime));
printf(" State : %s%s%s\n",
- (array.state&(1<<MD_SB_CLEAN))?"clean":"dirty",
+ (array.state&(1<<MD_SB_CLEAN))?"clean":"active",
array.active_disks < array.raid_disks? ", degraded":"",
(!e || e->percent < 0) ? "" :
(e->resync) ? ", resyncing": ", recovering");
}
free_mdstat(ms);
- if (have_super) {
- printf(" UUID : ");
- if (super.minor_version >= 90)
- printf("%08x:%08x:%08x:%08x", super.set_uuid0, super.set_uuid1,
- super.set_uuid2, super.set_uuid3);
- else
- printf("%08x", super.set_uuid0);
- printf("\n Events : %d.%d\n\n", super.events_hi, super.events_lo);
- }
+ if (super && st)
+ st->ss->detail_super(super);
printf(" Number Major Minor RaidDevice State\n");
}
- for (d= 0; d<MD_SB_DISKS; d++) {
+ for (d= 0; d < max_disks; d++) {
mdu_disk_info_t disk;
char *dv;
disk.number = d;
* device from the array, and then put it back.
* If this fails, we are rebuilding
*/
- int err = ioctl(fd, HOT_REMOVE_DISK, MKDEV(disk.major, disk.minor));
- if (err == 0) ioctl(fd, HOT_ADD_DISK, MKDEV(disk.major, disk.minor));
+ int err = ioctl(fd, HOT_REMOVE_DISK, makedev(disk.major, disk.minor));
+ if (err == 0) ioctl(fd, HOT_ADD_DISK, makedev(disk.major, disk.minor));
if (err && errno == EBUSY)
printf(" rebuilding");
}
if (!brief) printf("\n");
}
if (spares && brief) printf(" spares=%d", spares);
- if (have_super && brief) {
- printf(" UUID=");
- if (super.minor_version >= 90)
- printf("%08x:%08x:%08x:%08x", super.set_uuid0, super.set_uuid1,
- super.set_uuid2, super.set_uuid3);
- else
- printf("%08x", super.set_uuid0);
- }
+ if (super && brief && st)
+ st->ss->brief_detail_super(super);
+
if (brief && devices) printf("\n devices=%s", devices);
if (brief) printf("\n");
if (test && (rv&2)) rv &= ~1;