diff options
Diffstat (limited to 'drivers/md/dm-raid.c')
| -rw-r--r-- | drivers/md/dm-raid.c | 20 | 
1 files changed, 9 insertions, 11 deletions
diff --git a/drivers/md/dm-raid.c b/drivers/md/dm-raid.c index 8846bf510a35..becdb689190e 100644 --- a/drivers/md/dm-raid.c +++ b/drivers/md/dm-raid.c @@ -3251,8 +3251,7 @@ size_check:  	r = md_start(&rs->md);  	if (r) {  		ti->error = "Failed to start raid array"; -		mddev_unlock(&rs->md); -		goto bad_md_start; +		goto bad_unlock;  	}  	/* If raid4/5/6 journal mode explicitly requested (only possible with journal dev) -> set it */ @@ -3260,8 +3259,7 @@ size_check:  		r = r5c_journal_mode_set(&rs->md, rs->journal_dev.mode);  		if (r) {  			ti->error = "Failed to set raid4/5/6 journal mode"; -			mddev_unlock(&rs->md); -			goto bad_journal_mode_set; +			goto bad_unlock;  		}  	} @@ -3272,14 +3270,14 @@ size_check:  	if (rs_is_raid456(rs)) {  		r = rs_set_raid456_stripe_cache(rs);  		if (r) -			goto bad_stripe_cache; +			goto bad_unlock;  	}  	/* Now do an early reshape check */  	if (test_bit(RT_FLAG_RESHAPE_RS, &rs->runtime_flags)) {  		r = rs_check_reshape(rs);  		if (r) -			goto bad_check_reshape; +			goto bad_unlock;  		/* Restore new, ctr requested layout to perform check */  		rs_config_restore(rs, &rs_layout); @@ -3288,7 +3286,7 @@ size_check:  			r = rs->md.pers->check_reshape(&rs->md);  			if (r) {  				ti->error = "Reshape check failed"; -				goto bad_check_reshape; +				goto bad_unlock;  			}  		}  	} @@ -3299,11 +3297,9 @@ size_check:  	mddev_unlock(&rs->md);  	return 0; -bad_md_start: -bad_journal_mode_set: -bad_stripe_cache: -bad_check_reshape: +bad_unlock:  	md_stop(&rs->md); +	mddev_unlock(&rs->md);  bad:  	raid_set_free(rs); @@ -3314,7 +3310,9 @@ static void raid_dtr(struct dm_target *ti)  {  	struct raid_set *rs = ti->private; +	mddev_lock_nointr(&rs->md);  	md_stop(&rs->md); +	mddev_unlock(&rs->md);  	raid_set_free(rs);  }  |