Commit 158d32af authored by Yu Kuai's avatar Yu Kuai Committed by Song Liu

md-bitmap: suspend array earlier in location_store()

Now that mddev_suspend() doean't rely on 'mddev->pers' to be set, it's
safe to call mddev_suspend() earlier.

This will also be helper to refactor mddev_suspend() later.
Signed-off-by: default avatarYu Kuai <yukuai3@huawei.com>
Signed-off-by: default avatarSong Liu <song@kernel.org>
Link: https://lore.kernel.org/r/20230825030956.1527023-6-yukuai1@huaweicloud.com
parent b71fe4ac
...@@ -2351,6 +2351,8 @@ location_store(struct mddev *mddev, const char *buf, size_t len) ...@@ -2351,6 +2351,8 @@ location_store(struct mddev *mddev, const char *buf, size_t len)
rv = mddev_lock(mddev); rv = mddev_lock(mddev);
if (rv) if (rv)
return rv; return rv;
mddev_suspend(mddev);
if (mddev->pers) { if (mddev->pers) {
if (mddev->recovery || mddev->sync_thread) { if (mddev->recovery || mddev->sync_thread) {
rv = -EBUSY; rv = -EBUSY;
...@@ -2365,11 +2367,8 @@ location_store(struct mddev *mddev, const char *buf, size_t len) ...@@ -2365,11 +2367,8 @@ location_store(struct mddev *mddev, const char *buf, size_t len)
rv = -EBUSY; rv = -EBUSY;
goto out; goto out;
} }
if (mddev->pers) {
mddev_suspend(mddev); md_bitmap_destroy(mddev);
md_bitmap_destroy(mddev);
mddev_resume(mddev);
}
mddev->bitmap_info.offset = 0; mddev->bitmap_info.offset = 0;
if (mddev->bitmap_info.file) { if (mddev->bitmap_info.file) {
struct file *f = mddev->bitmap_info.file; struct file *f = mddev->bitmap_info.file;
...@@ -2379,6 +2378,8 @@ location_store(struct mddev *mddev, const char *buf, size_t len) ...@@ -2379,6 +2378,8 @@ location_store(struct mddev *mddev, const char *buf, size_t len)
} else { } else {
/* No bitmap, OK to set a location */ /* No bitmap, OK to set a location */
long long offset; long long offset;
struct bitmap *bitmap;
if (strncmp(buf, "none", 4) == 0) if (strncmp(buf, "none", 4) == 0)
/* nothing to be done */; /* nothing to be done */;
else if (strncmp(buf, "file:", 5) == 0) { else if (strncmp(buf, "file:", 5) == 0) {
...@@ -2402,25 +2403,20 @@ location_store(struct mddev *mddev, const char *buf, size_t len) ...@@ -2402,25 +2403,20 @@ location_store(struct mddev *mddev, const char *buf, size_t len)
rv = -EINVAL; rv = -EINVAL;
goto out; goto out;
} }
mddev->bitmap_info.offset = offset; mddev->bitmap_info.offset = offset;
if (mddev->pers) { bitmap = md_bitmap_create(mddev, -1);
struct bitmap *bitmap; if (IS_ERR(bitmap)) {
bitmap = md_bitmap_create(mddev, -1); rv = PTR_ERR(bitmap);
mddev_suspend(mddev); goto out;
if (IS_ERR(bitmap)) }
rv = PTR_ERR(bitmap);
else { mddev->bitmap = bitmap;
mddev->bitmap = bitmap; rv = md_bitmap_load(mddev);
rv = md_bitmap_load(mddev); if (rv) {
if (rv) mddev->bitmap_info.offset = 0;
mddev->bitmap_info.offset = 0; md_bitmap_destroy(mddev);
} goto out;
if (rv) {
md_bitmap_destroy(mddev);
mddev_resume(mddev);
goto out;
}
mddev_resume(mddev);
} }
} }
} }
...@@ -2433,6 +2429,7 @@ location_store(struct mddev *mddev, const char *buf, size_t len) ...@@ -2433,6 +2429,7 @@ location_store(struct mddev *mddev, const char *buf, size_t len)
} }
rv = 0; rv = 0;
out: out:
mddev_resume(mddev);
mddev_unlock(mddev); mddev_unlock(mddev);
if (rv) if (rv)
return rv; return rv;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment