diff options
Diffstat (limited to 'drivers/md/raid5-cache.c')
| -rw-r--r-- | drivers/md/raid5-cache.c | 22 | 
1 files changed, 9 insertions, 13 deletions
| diff --git a/drivers/md/raid5-cache.c b/drivers/md/raid5-cache.c index f1c86d938502..39f31f07ffe9 100644 --- a/drivers/md/raid5-cache.c +++ b/drivers/md/raid5-cache.c @@ -2577,31 +2577,22 @@ static ssize_t r5c_journal_mode_show(struct mddev *mddev, char *page)  int r5c_journal_mode_set(struct mddev *mddev, int mode)  {  	struct r5conf *conf; -	int err;  	if (mode < R5C_JOURNAL_MODE_WRITE_THROUGH ||  	    mode > R5C_JOURNAL_MODE_WRITE_BACK)  		return -EINVAL; -	err = mddev_lock(mddev); -	if (err) -		return err;  	conf = mddev->private; -	if (!conf || !conf->log) { -		mddev_unlock(mddev); +	if (!conf || !conf->log)  		return -ENODEV; -	}  	if (raid5_calc_degraded(conf) > 0 && -	    mode == R5C_JOURNAL_MODE_WRITE_BACK) { -		mddev_unlock(mddev); +	    mode == R5C_JOURNAL_MODE_WRITE_BACK)  		return -EINVAL; -	}  	mddev_suspend(mddev);  	conf->log->r5c_journal_mode = mode;  	mddev_resume(mddev); -	mddev_unlock(mddev);  	pr_debug("md/raid:%s: setting r5c cache mode to %d: %s\n",  		 mdname(mddev), mode, r5c_journal_mode_str[mode]); @@ -2614,6 +2605,7 @@ static ssize_t r5c_journal_mode_store(struct mddev *mddev,  {  	int mode = ARRAY_SIZE(r5c_journal_mode_str);  	size_t len = length; +	int ret;  	if (len < 2)  		return -EINVAL; @@ -2625,8 +2617,12 @@ static ssize_t r5c_journal_mode_store(struct mddev *mddev,  		if (strlen(r5c_journal_mode_str[mode]) == len &&  		    !strncmp(page, r5c_journal_mode_str[mode], len))  			break; - -	return r5c_journal_mode_set(mddev, mode) ?: length; +	ret = mddev_lock(mddev); +	if (ret) +		return ret; +	ret = r5c_journal_mode_set(mddev, mode); +	mddev_unlock(mddev); +	return ret ?: length;  }  struct md_sysfs_entry |