summaryrefslogtreecommitdiffstats
path: root/drivers/md
diff options
context:
space:
mode:
authorYufen Yu <yuyufen@huawei.com>2019-09-03 09:12:41 -0400
committerSong Liu <songliubraving@fb.com>2019-09-03 17:52:03 -0400
commit07f1a6850c5d5a65c917c3165692b5179ac4cb6b (patch)
tree2da1c0e21745ab935f37b29994ac00e11e35548b /drivers/md
parent62f7b1989c02feed9274131b2fd5e990de4aba6f (diff)
md/raid1: fail run raid1 array when active disk less than one
When run test case: mdadm -CR /dev/md1 -l 1 -n 4 /dev/sd[a-d] --assume-clean --bitmap=internal mdadm -S /dev/md1 mdadm -A /dev/md1 /dev/sd[b-c] --run --force mdadm --zero /dev/sda mdadm /dev/md1 -a /dev/sda echo offline > /sys/block/sdc/device/state echo offline > /sys/block/sdb/device/state sleep 5 mdadm -S /dev/md1 echo running > /sys/block/sdb/device/state echo running > /sys/block/sdc/device/state mdadm -A /dev/md1 /dev/sd[a-c] --run --force mdadm run fail with kernel message as follow: [ 172.986064] md: kicking non-fresh sdb from array! [ 173.004210] md: kicking non-fresh sdc from array! [ 173.022383] md/raid1:md1: active with 0 out of 4 mirrors [ 173.022406] md1: failed to create bitmap (-5) In fact, when active disk in raid1 array less than one, we need to return fail in raid1_run(). Reviewed-by: NeilBrown <neilb@suse.de> Signed-off-by: Yufen Yu <yuyufen@huawei.com> Signed-off-by: Song Liu <songliubraving@fb.com>
Diffstat (limited to 'drivers/md')
-rw-r--r--drivers/md/raid1.c13
1 files changed, 12 insertions, 1 deletions
diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c
index 6ea4f2679b78..0466ee2453b4 100644
--- a/drivers/md/raid1.c
+++ b/drivers/md/raid1.c
@@ -3129,6 +3129,13 @@ static int raid1_run(struct mddev *mddev)
3129 !test_bit(In_sync, &conf->mirrors[i].rdev->flags) || 3129 !test_bit(In_sync, &conf->mirrors[i].rdev->flags) ||
3130 test_bit(Faulty, &conf->mirrors[i].rdev->flags)) 3130 test_bit(Faulty, &conf->mirrors[i].rdev->flags))
3131 mddev->degraded++; 3131 mddev->degraded++;
3132 /*
3133 * RAID1 needs at least one disk in active
3134 */
3135 if (conf->raid_disks - mddev->degraded < 1) {
3136 ret = -EINVAL;
3137 goto abort;
3138 }
3132 3139
3133 if (conf->raid_disks - mddev->degraded == 1) 3140 if (conf->raid_disks - mddev->degraded == 1)
3134 mddev->recovery_cp = MaxSector; 3141 mddev->recovery_cp = MaxSector;
@@ -3162,8 +3169,12 @@ static int raid1_run(struct mddev *mddev)
3162 ret = md_integrity_register(mddev); 3169 ret = md_integrity_register(mddev);
3163 if (ret) { 3170 if (ret) {
3164 md_unregister_thread(&mddev->thread); 3171 md_unregister_thread(&mddev->thread);
3165 raid1_free(mddev, conf); 3172 goto abort;
3166 } 3173 }
3174 return 0;
3175
3176abort:
3177 raid1_free(mddev, conf);
3167 return ret; 3178 return ret;
3168} 3179}
3169 3180