aboutsummaryrefslogtreecommitdiffstats
path: root/Detail.c
diff options
context:
space:
mode:
authorXiao Ni <xni@redhat.com>2021-02-09 17:39:51 +0800
committerJes Sorensen <jsorensen@fb.com>2021-03-08 10:50:37 -0500
commitdb5377883fef8655aac56b5d7ce5408f8ae494e0 (patch)
tree42f00b469a6c6765d54e86a590975dde01b5a936 /Detail.c
parentc7b8547c70035395a02ae4f7a5ec76a46dedb3cb (diff)
downloadmdadm-db5377883fef8655aac56b5d7ce5408f8ae494e0.tar.gz
It should be FAILED when raid has not enough active disks
It can't remove the disk if there are not enough disks. For example, raid5 can't remove the second disk. If the second disk is unplug from machine, it's better show missing and the raid should be FAILED. It's better for administrator to monitor the raid. Signed-off-by: Xiao Ni <xni@redhat.com> Signed-off-by: Jes Sorensen <jsorensen@fb.com>
Diffstat (limited to 'Detail.c')
-rw-r--r--Detail.c14
1 files changed, 10 insertions, 4 deletions
diff --git a/Detail.c b/Detail.c
index f8dea6fd..cd26fb0f 100644
--- a/Detail.c
+++ b/Detail.c
@@ -355,9 +355,14 @@ int Detail(char *dev, struct context *c)
avail = xcalloc(array.raid_disks, 1);
for (d = 0; d < array.raid_disks; d++) {
-
- if ((disks[d*2].state & (1<<MD_DISK_SYNC)) ||
- (disks[d*2+1].state & (1<<MD_DISK_SYNC))) {
+ char *dv, *dv_rep;
+ dv = map_dev_preferred(disks[d*2].major,
+ disks[d*2].minor, 0, c->prefer);
+ dv_rep = map_dev_preferred(disks[d*2+1].major,
+ disks[d*2+1].minor, 0, c->prefer);
+
+ if ((dv && (disks[d*2].state & (1<<MD_DISK_SYNC))) ||
+ (dv_rep && (disks[d*2+1].state & (1<<MD_DISK_SYNC)))) {
avail_disks ++;
avail[d] = 1;
} else
@@ -789,7 +794,8 @@ This is pretty boring
&max_devices, n_devices);
else
printf(" %s", dv);
- }
+ } else if (disk.major | disk.minor)
+ printf(" missing");
if (!c->brief)
printf("\n");
}