Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ff35f58e authored by Song Liu's avatar Song Liu Committed by Shaohua Li
Browse files

md/r5cache: move mddev_lock() out of r5c_journal_mode_set()



r5c_journal_mode_set() is called by r5c_journal_mode_store() and
raid_ctr() in dm-raid. We don't need mddev_lock() when calling from
raid_ctr(). This patch fixes this by moves the mddev_lock() to
r5c_journal_mode_store().

Cc: stable@vger.kernel.org (v4.13+)
Signed-off-by: default avatarSong Liu <songliubraving@fb.com>
Signed-off-by: default avatarShaohua Li <shli@fb.com>
parent aff69d89
Loading
Loading
Loading
Loading
+9 −13
Original line number Original line Diff line number Diff line
@@ -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)
int r5c_journal_mode_set(struct mddev *mddev, int mode)
{
{
	struct r5conf *conf;
	struct r5conf *conf;
	int err;


	if (mode < R5C_JOURNAL_MODE_WRITE_THROUGH ||
	if (mode < R5C_JOURNAL_MODE_WRITE_THROUGH ||
	    mode > R5C_JOURNAL_MODE_WRITE_BACK)
	    mode > R5C_JOURNAL_MODE_WRITE_BACK)
		return -EINVAL;
		return -EINVAL;


	err = mddev_lock(mddev);
	if (err)
		return err;
	conf = mddev->private;
	conf = mddev->private;
	if (!conf || !conf->log) {
	if (!conf || !conf->log)
		mddev_unlock(mddev);
		return -ENODEV;
		return -ENODEV;
	}


	if (raid5_calc_degraded(conf) > 0 &&
	if (raid5_calc_degraded(conf) > 0 &&
	    mode == R5C_JOURNAL_MODE_WRITE_BACK) {
	    mode == R5C_JOURNAL_MODE_WRITE_BACK)
		mddev_unlock(mddev);
		return -EINVAL;
		return -EINVAL;
	}


	mddev_suspend(mddev);
	mddev_suspend(mddev);
	conf->log->r5c_journal_mode = mode;
	conf->log->r5c_journal_mode = mode;
	mddev_resume(mddev);
	mddev_resume(mddev);
	mddev_unlock(mddev);


	pr_debug("md/raid:%s: setting r5c cache mode to %d: %s\n",
	pr_debug("md/raid:%s: setting r5c cache mode to %d: %s\n",
		 mdname(mddev), mode, r5c_journal_mode_str[mode]);
		 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);
	int mode = ARRAY_SIZE(r5c_journal_mode_str);
	size_t len = length;
	size_t len = length;
	int ret;


	if (len < 2)
	if (len < 2)
		return -EINVAL;
		return -EINVAL;
@@ -2625,8 +2617,12 @@ static ssize_t r5c_journal_mode_store(struct mddev *mddev,
		if (strlen(r5c_journal_mode_str[mode]) == len &&
		if (strlen(r5c_journal_mode_str[mode]) == len &&
		    !strncmp(page, r5c_journal_mode_str[mode], len))
		    !strncmp(page, r5c_journal_mode_str[mode], len))
			break;
			break;

	ret = mddev_lock(mddev);
	return r5c_journal_mode_set(mddev, mode) ?: length;
	if (ret)
		return ret;
	ret = r5c_journal_mode_set(mddev, mode);
	mddev_unlock(mddev);
	return ret ?: length;
}
}


struct md_sysfs_entry
struct md_sysfs_entry