void *super = NULL;
int rv = test ? 4 : 1;
+ int avail_disks = 0;
+ char *avail;
if (fd < 0) {
fprintf(stderr, Name ": cannot open %s: %s\n",
printf("MD_DEVICES=%d\n", array.raid_disks);
printf("MD_METADATA=%d.%d\n", array.major_version,
array.minor_version);
- st->ss->export_super(super);
+ if (super)
+ st->ss->export_super(super);
goto out;
}
if (brief)
- printf("ARRAY %s level=%s num-devices=%d", dev, c?c:"-unknown-",array.raid_disks );
+ printf("ARRAY %s level=%s metadata=%d.%d num-devices=%d", dev,
+ c?c:"-unknown-",
+ array.major_version, array.minor_version,
+ array.raid_disks );
else {
mdu_bitmap_file_t bmf;
unsigned long long larray_size;
break;
default: break;
}
-
+
if (e && e->percent >= 0) {
printf(" Re%s Status : %d%% complete\n",
(super && info.reshape_active)? "shape":"build",
}
if (disk.major == 0 && disk.minor == 0)
continue;
- if (disk.raid_disk >= 0 && disk.raid_disk < array.raid_disks)
+ 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 < max_disks; d++) {
char *dv;
mdu_disk_info_t disk = disks[d];
if (!brief) {
if (d == array.raid_disks) printf("\n");
if (disk.raid_disk < 0)
- printf(" %5d %5d %5d - ",
+ printf(" %5d %5d %5d - ",
disk.number, disk.major, disk.minor);
else
- printf(" %5d %5d %5d %5d ",
+ printf(" %5d %5d %5d %5d ",
disk.number, disk.major, disk.minor, disk.raid_disk);
- if (disk.state & (1<<MD_DISK_FAULTY)) {
- printf(" faulty");
+ if (disk.state & (1<<MD_DISK_FAULTY)) {
+ printf(" faulty");
if (disk.raid_disk < array.raid_disks &&
disk.raid_disk >= 0)
failed++;
}
}
if (disk.state == 0) spares++;
- if (test && d < array.raid_disks && disk.state & (1<<MD_DISK_FAULTY)) {
- if ((rv & 1) && (array.level ==4 || array.level == 5))
- rv |= 2;
+ if (test && d < array.raid_disks
+ && !(disk.state & (1<<MD_DISK_SYNC)))
rv |= 1;
+ if (d < array.raid_disks
+ && (disk.state & (1<<MD_DISK_SYNC))) {
+ avail_disks ++;
+ avail[d] = 1;
}
if ((dv=map_dev(disk.major, disk.minor, 0))) {
if (brief) {
if (brief > 1 && devices) printf("\n devices=%s", devices);
if (brief) printf("\n");
+ if (test &&
+ !enough(array.level, array.raid_disks, array.layout,
+ 1, avail, avail_disks))
+ rv = 2;
+
out:
- if (test && (rv&2)) rv &= ~1;
close(fd);
return rv;
}