forked from mirrors/linux
		
	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>
This commit is contained in:
		
							parent
							
								
									62f7b1989c
								
							
						
					
					
						commit
						07f1a6850c
					
				
					 1 changed files with 12 additions and 1 deletions
				
			
		| 
						 | 
					@ -3129,6 +3129,13 @@ static int raid1_run(struct mddev *mddev)
 | 
				
			||||||
		    !test_bit(In_sync, &conf->mirrors[i].rdev->flags) ||
 | 
							    !test_bit(In_sync, &conf->mirrors[i].rdev->flags) ||
 | 
				
			||||||
		    test_bit(Faulty, &conf->mirrors[i].rdev->flags))
 | 
							    test_bit(Faulty, &conf->mirrors[i].rdev->flags))
 | 
				
			||||||
			mddev->degraded++;
 | 
								mddev->degraded++;
 | 
				
			||||||
 | 
						/*
 | 
				
			||||||
 | 
						 * RAID1 needs at least one disk in active
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						if (conf->raid_disks - mddev->degraded < 1) {
 | 
				
			||||||
 | 
							ret = -EINVAL;
 | 
				
			||||||
 | 
							goto abort;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (conf->raid_disks - mddev->degraded == 1)
 | 
						if (conf->raid_disks - mddev->degraded == 1)
 | 
				
			||||||
		mddev->recovery_cp = MaxSector;
 | 
							mddev->recovery_cp = MaxSector;
 | 
				
			||||||
| 
						 | 
					@ -3162,8 +3169,12 @@ static int raid1_run(struct mddev *mddev)
 | 
				
			||||||
	ret = md_integrity_register(mddev);
 | 
						ret = md_integrity_register(mddev);
 | 
				
			||||||
	if (ret) {
 | 
						if (ret) {
 | 
				
			||||||
		md_unregister_thread(&mddev->thread);
 | 
							md_unregister_thread(&mddev->thread);
 | 
				
			||||||
		raid1_free(mddev, conf);
 | 
							goto abort;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
						return 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					abort:
 | 
				
			||||||
 | 
						raid1_free(mddev, conf);
 | 
				
			||||||
	return ret;
 | 
						return ret;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue