int fd = open(dev, O_RDONLY, 0);
int vers;
mdu_array_info_t array;
+ mdu_disk_info_t *disks;
+ int next;
int d;
time_t atime;
char *c;
int is_26 = get_linux_version() >= 2006000;
int is_rebuilding = 0;
int failed = 0;
+ struct supertype *st = NULL;
+ int max_disks = MD_SB_DISKS;
void *super = NULL;
int rv = test ? 4 : 1;
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;
* to get more info
*/
int fd2 = open(dv, O_RDONLY);
- if (fd2 >=0 &&
- load_super0(fd2, &super, NULL) == 0) {
+ if (fd2 >=0 && st &&
+ st->ss->load_super(st, fd2, &super, NULL) == 0) {
struct mdinfo info;
- getinfo_super0(&info, super);
+ struct mddev_ident_s ident;
+ st->ss->getinfo_super(&info, &ident, super);
if (info.array.ctime != array.ctime ||
info.array.level != array.level) {
free(super);
}
free_mdstat(ms);
- if (super)
- detail_super0(super);
+ if (super && st)
+ st->ss->detail_super(super);
printf(" Number Major Minor RaidDevice State\n");
}
- for (d= 0; d<MD_SB_DISKS; d++) {
+ 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;
+ }
+
+ next = array.raid_disks;
+ 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) {
if (d < array.raid_disks)
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;
+ }
+
+ for (d= 0; d < max_disks; d++) {
+ char *dv;
+ mdu_disk_info_t disk = disks[d];
+
if (d >= array.raid_disks &&
disk.major == 0 &&
disk.minor == 0)
continue;
if (!brief) {
- if (disk.number == array.raid_disks) printf("\n");
+ if (d == array.raid_disks) printf("\n");
if (disk.raid_disk < 0)
printf(" %5d %5d %5d - ",
disk.number, disk.major, disk.minor);
if (disk.state & (1<<MD_DISK_ACTIVE)) printf(" active");
if (disk.state & (1<<MD_DISK_SYNC)) printf(" sync");
if (disk.state & (1<<MD_DISK_REMOVED)) printf(" removed");
- if (disk.state == 0) printf(" spare");
- if (disk.state == 0) {
+ if (disk.state & (1<<MD_DISK_WRITEMOSTLY)) printf(" writemostly");
+ if ((disk.state &
+ ((1<<MD_DISK_ACTIVE)|(1<<MD_DISK_SYNC)|(1<<MD_DISK_REMOVED)))
+ == 0) {
+ printf(" spare");
if (is_26) {
if (disk.raid_disk < array.raid_disks && disk.raid_disk >= 0)
printf(" rebuilding");
if (!brief) printf("\n");
}
if (spares && brief) printf(" spares=%d", spares);
- if (super && brief)
- brief_detail_super0(super);
+ if (super && brief && st)
+ st->ss->brief_detail_super(super);
- if (brief && devices) printf("\n devices=%s", devices);
+ if (brief > 1 && devices) printf("\n devices=%s", devices);
if (brief) printf("\n");
if (test && (rv&2)) rv &= ~1;
close(fd);