Skip to content

Commit 07f1a68

Browse files
Yufen Yuliu-song-6
authored andcommitted
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 <[email protected]> Signed-off-by: Yufen Yu <[email protected]> Signed-off-by: Song Liu <[email protected]>
1 parent 62f7b19 commit 07f1a68

File tree

1 file changed

+12
-1
lines changed

1 file changed

+12
-1
lines changed

drivers/md/raid1.c

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3129,6 +3129,13 @@ static int raid1_run(struct mddev *mddev)
31293129
!test_bit(In_sync, &conf->mirrors[i].rdev->flags) ||
31303130
test_bit(Faulty, &conf->mirrors[i].rdev->flags))
31313131
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+
}
31323139

31333140
if (conf->raid_disks - mddev->degraded == 1)
31343141
mddev->recovery_cp = MaxSector;
@@ -3162,8 +3169,12 @@ static int raid1_run(struct mddev *mddev)
31623169
ret = md_integrity_register(mddev);
31633170
if (ret) {
31643171
md_unregister_thread(&mddev->thread);
3165-
raid1_free(mddev, conf);
3172+
goto abort;
31663173
}
3174+
return 0;
3175+
3176+
abort:
3177+
raid1_free(mddev, conf);
31673178
return ret;
31683179
}
31693180

0 commit comments

Comments
 (0)