md/md-bitmap: hold 'reconfig_mutex' in backlog_store()
[ Upstream commit 44abfa6a95df425c0660d56043020b67e6d93ab8 ]
Several reasons why 'reconfig_mutex' should be held:
1) rdev_for_each() is not safe to be called without the lock, because
rdev can be removed concurrently.
2) mddev_destroy_serial_pool() and mddev_create_serial_pool() should not
be called concurrently.
3) mddev_suspend() from mddev_destroy/create_serial_pool() should be
protected by the lock.
Fixes: 10c92fca63
("md-bitmap: create and destroy wb_info_pool with the change of backlog")
Signed-off-by: Yu Kuai <yukuai3@huawei.com>
Link: https://lore.kernel.org/r/20230706083727.608914-3-yukuai1@huaweicloud.com
Signed-off-by: Song Liu <song@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
parent
e970bc3828
commit
f9b9c6b0d4
@ -2481,6 +2481,10 @@ backlog_store(struct mddev *mddev, const char *buf, size_t len)
|
|||||||
if (backlog > COUNTER_MAX)
|
if (backlog > COUNTER_MAX)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
|
rv = mddev_lock(mddev);
|
||||||
|
if (rv)
|
||||||
|
return rv;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Without write mostly device, it doesn't make sense to set
|
* Without write mostly device, it doesn't make sense to set
|
||||||
* backlog for max_write_behind.
|
* backlog for max_write_behind.
|
||||||
@ -2494,6 +2498,7 @@ backlog_store(struct mddev *mddev, const char *buf, size_t len)
|
|||||||
if (!has_write_mostly) {
|
if (!has_write_mostly) {
|
||||||
pr_warn_ratelimited("%s: can't set backlog, no write mostly device available\n",
|
pr_warn_ratelimited("%s: can't set backlog, no write mostly device available\n",
|
||||||
mdname(mddev));
|
mdname(mddev));
|
||||||
|
mddev_unlock(mddev);
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2509,6 +2514,8 @@ backlog_store(struct mddev *mddev, const char *buf, size_t len)
|
|||||||
}
|
}
|
||||||
if (old_mwb != backlog)
|
if (old_mwb != backlog)
|
||||||
md_bitmap_update_sb(mddev->bitmap);
|
md_bitmap_update_sb(mddev->bitmap);
|
||||||
|
|
||||||
|
mddev_unlock(mddev);
|
||||||
return len;
|
return len;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user