diff options
author | Yu Kuai <yukuai3@huawei.com> | 2023-07-06 16:37:27 +0800 |
---|---|---|
committer | Song Liu <song@kernel.org> | 2023-07-27 00:13:30 -0700 |
commit | 44abfa6a95df425c0660d56043020b67e6d93ab8 (patch) | |
tree | 302427e26586fcb1107f64b45adf5f99fbe60f92 /drivers/md | |
parent | b4d129640f194ffc4cc64c3e97f98ae944c072e8 (diff) | |
download | linux-44abfa6a95df425c0660d56043020b67e6d93ab8.tar.gz linux-44abfa6a95df425c0660d56043020b67e6d93ab8.tar.bz2 linux-44abfa6a95df425c0660d56043020b67e6d93ab8.zip |
md/md-bitmap: hold 'reconfig_mutex' in backlog_store()
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: 10c92fca636e ("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>
Diffstat (limited to 'drivers/md')
-rw-r--r-- | drivers/md/md-bitmap.c | 7 |
1 files changed, 7 insertions, 0 deletions
diff --git a/drivers/md/md-bitmap.c b/drivers/md/md-bitmap.c index 1f3339961159..6f9ff14971f9 100644 --- a/drivers/md/md-bitmap.c +++ b/drivers/md/md-bitmap.c @@ -2546,6 +2546,10 @@ backlog_store(struct mddev *mddev, const char *buf, size_t len) if (backlog > COUNTER_MAX) return -EINVAL; + rv = mddev_lock(mddev); + if (rv) + return rv; + /* * Without write mostly device, it doesn't make sense to set * backlog for max_write_behind. @@ -2559,6 +2563,7 @@ backlog_store(struct mddev *mddev, const char *buf, size_t len) if (!has_write_mostly) { pr_warn_ratelimited("%s: can't set backlog, no write mostly device available\n", mdname(mddev)); + mddev_unlock(mddev); return -EINVAL; } @@ -2574,6 +2579,8 @@ backlog_store(struct mddev *mddev, const char *buf, size_t len) } if (old_mwb != backlog) md_bitmap_update_sb(mddev->bitmap); + + mddev_unlock(mddev); return len; } |