diff options
Diffstat (limited to 'drivers/md/dm-raid1.c')
| -rw-r--r-- | drivers/md/dm-raid1.c | 22 | 
1 files changed, 15 insertions, 7 deletions
diff --git a/drivers/md/dm-raid1.c b/drivers/md/dm-raid1.c index 0253130fa13..d1a7f1a4789 100644 --- a/drivers/md/dm-raid1.c +++ b/drivers/md/dm-raid1.c @@ -181,6 +181,17 @@ static void set_default_mirror(struct mirror *m)  	atomic_set(&ms->default_mirror, m - m0);  } +static struct mirror *get_valid_mirror(struct mirror_set *ms) +{ +	struct mirror *m; + +	for (m = ms->mirror; m < ms->mirror + ms->nr_mirrors; m++) +		if (!atomic_read(&m->error_count)) +			return m; + +	return NULL; +} +  /* fail_mirror   * @m: mirror device to fail   * @error_type: one of the enum's, DM_RAID1_*_ERROR @@ -226,13 +237,10 @@ static void fail_mirror(struct mirror *m, enum dm_raid1_error error_type)  		goto out;  	} -	for (new = ms->mirror; new < ms->mirror + ms->nr_mirrors; new++) -		if (!atomic_read(&new->error_count)) { -			set_default_mirror(new); -			break; -		} - -	if (unlikely(new == ms->mirror + ms->nr_mirrors)) +	new = get_valid_mirror(ms); +	if (new) +		set_default_mirror(new); +	else  		DMWARN("All sides of mirror have failed.");  out:  |