Skip to content

Commit

Permalink
[PATCH] md: fix raid10 assembly when too many devices are missing
Browse files Browse the repository at this point in the history
If you try to assemble an array with too many missing devices, raid10 will now
reject the attempt, instead of allowing it.

Also check when hot-adding a drive and refuse the hot-add if the array is
beyond hope.

Signed-off-by: Neil Brown <neilb@suse.de>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
  • Loading branch information
NeilBrown authored and Linus Torvalds committed Sep 9, 2005
1 parent 6118156 commit 6d50824
Showing 1 changed file with 27 additions and 3 deletions.
30 changes: 27 additions & 3 deletions drivers/md/raid10.c
Original file line number Diff line number Diff line change
Expand Up @@ -906,6 +906,27 @@ static void close_sync(conf_t *conf)
conf->r10buf_pool = NULL;
}

/* check if there are enough drives for
* every block to appear on atleast one
*/
static int enough(conf_t *conf)
{
int first = 0;

do {
int n = conf->copies;
int cnt = 0;
while (n--) {
if (conf->mirrors[first].rdev)
cnt++;
first = (first+1) % conf->raid_disks;
}
if (cnt == 0)
return 0;
} while (first != 0);
return 1;
}

static int raid10_spare_active(mddev_t *mddev)
{
int i;
Expand Down Expand Up @@ -944,6 +965,8 @@ static int raid10_add_disk(mddev_t *mddev, mdk_rdev_t *rdev)
* very different from resync
*/
return 0;
if (!enough(conf))
return 0;

for (mirror=0; mirror < mddev->raid_disks; mirror++)
if ( !(p=conf->mirrors+mirror)->rdev) {
Expand Down Expand Up @@ -1684,9 +1707,10 @@ static int run(mddev_t *mddev)
init_waitqueue_head(&conf->wait_idle);
init_waitqueue_head(&conf->wait_resume);

if (!conf->working_disks) {
printk(KERN_ERR "raid10: no operational mirrors for %s\n",
mdname(mddev));
/* need to check that every block has at least one working mirror */
if (!enough(conf)) {
printk(KERN_ERR "raid10: not enough operational mirrors for %s\n",
mdname(mddev));
goto out_free_conf;
}

Expand Down

0 comments on commit 6d50824

Please sign in to comment.