md: cleanup mddev_create/destroy_serial_pool()

Now that except for stopping the array, all the callers already suspend
the array, there is no need to suspend anymore, hence remove the second
parameter.

Signed-off-by: Yu Kuai <yukuai3@huawei.com>
Signed-off-by: Song Liu <song@kernel.org>
Link: https://lore.kernel.org/r/20231010151958.145896-15-yukuai1@huaweicloud.com
This commit is contained in:
Yu Kuai 2023-10-10 23:19:53 +08:00 committed by Song Liu
parent 58226942ad
commit b4128c00a6
3 changed files with 17 additions and 31 deletions

View File

@ -1861,7 +1861,7 @@ void md_bitmap_destroy(struct mddev *mddev)
md_bitmap_wait_behind_writes(mddev); md_bitmap_wait_behind_writes(mddev);
if (!mddev->serialize_policy) if (!mddev->serialize_policy)
mddev_destroy_serial_pool(mddev, NULL, true); mddev_destroy_serial_pool(mddev, NULL);
mutex_lock(&mddev->bitmap_info.mutex); mutex_lock(&mddev->bitmap_info.mutex);
spin_lock(&mddev->lock); spin_lock(&mddev->lock);
@ -1977,7 +1977,7 @@ int md_bitmap_load(struct mddev *mddev)
goto out; goto out;
rdev_for_each(rdev, mddev) rdev_for_each(rdev, mddev)
mddev_create_serial_pool(mddev, rdev, true); mddev_create_serial_pool(mddev, rdev);
if (mddev_is_clustered(mddev)) if (mddev_is_clustered(mddev))
md_cluster_ops->load_bitmaps(mddev, mddev->bitmap_info.nodes); md_cluster_ops->load_bitmaps(mddev, mddev->bitmap_info.nodes);
@ -2562,11 +2562,11 @@ backlog_store(struct mddev *mddev, const char *buf, size_t len)
if (!backlog && mddev->serial_info_pool) { if (!backlog && mddev->serial_info_pool) {
/* serial_info_pool is not needed if backlog is zero */ /* serial_info_pool is not needed if backlog is zero */
if (!mddev->serialize_policy) if (!mddev->serialize_policy)
mddev_destroy_serial_pool(mddev, NULL, true); mddev_destroy_serial_pool(mddev, NULL);
} else if (backlog && !mddev->serial_info_pool) { } else if (backlog && !mddev->serial_info_pool) {
/* serial_info_pool is needed since backlog is not zero */ /* serial_info_pool is needed since backlog is not zero */
rdev_for_each(rdev, mddev) rdev_for_each(rdev, mddev)
mddev_create_serial_pool(mddev, rdev, true); mddev_create_serial_pool(mddev, rdev);
} }
if (old_mwb != backlog) if (old_mwb != backlog)
md_bitmap_update_sb(mddev->bitmap); md_bitmap_update_sb(mddev->bitmap);

View File

@ -206,8 +206,7 @@ static int rdev_need_serial(struct md_rdev *rdev)
* 1. rdev is the first device which return true from rdev_enable_serial. * 1. rdev is the first device which return true from rdev_enable_serial.
* 2. rdev is NULL, means we want to enable serialization for all rdevs. * 2. rdev is NULL, means we want to enable serialization for all rdevs.
*/ */
void mddev_create_serial_pool(struct mddev *mddev, struct md_rdev *rdev, void mddev_create_serial_pool(struct mddev *mddev, struct md_rdev *rdev)
bool is_suspend)
{ {
int ret = 0; int ret = 0;
@ -215,15 +214,12 @@ void mddev_create_serial_pool(struct mddev *mddev, struct md_rdev *rdev,
!test_bit(CollisionCheck, &rdev->flags)) !test_bit(CollisionCheck, &rdev->flags))
return; return;
if (!is_suspend)
mddev_suspend(mddev);
if (!rdev) if (!rdev)
ret = rdevs_init_serial(mddev); ret = rdevs_init_serial(mddev);
else else
ret = rdev_init_serial(rdev); ret = rdev_init_serial(rdev);
if (ret) if (ret)
goto abort; return;
if (mddev->serial_info_pool == NULL) { if (mddev->serial_info_pool == NULL) {
/* /*
@ -238,10 +234,6 @@ void mddev_create_serial_pool(struct mddev *mddev, struct md_rdev *rdev,
pr_err("can't alloc memory pool for serialization\n"); pr_err("can't alloc memory pool for serialization\n");
} }
} }
abort:
if (!is_suspend)
mddev_resume(mddev);
} }
/* /*
@ -250,8 +242,7 @@ abort:
* 2. when bitmap is destroyed while policy is not enabled. * 2. when bitmap is destroyed while policy is not enabled.
* 3. for disable policy, the pool is destroyed only when no rdev needs it. * 3. for disable policy, the pool is destroyed only when no rdev needs it.
*/ */
void mddev_destroy_serial_pool(struct mddev *mddev, struct md_rdev *rdev, void mddev_destroy_serial_pool(struct mddev *mddev, struct md_rdev *rdev)
bool is_suspend)
{ {
if (rdev && !test_bit(CollisionCheck, &rdev->flags)) if (rdev && !test_bit(CollisionCheck, &rdev->flags))
return; return;
@ -260,8 +251,6 @@ void mddev_destroy_serial_pool(struct mddev *mddev, struct md_rdev *rdev,
struct md_rdev *temp; struct md_rdev *temp;
int num = 0; /* used to track if other rdevs need the pool */ int num = 0; /* used to track if other rdevs need the pool */
if (!is_suspend)
mddev_suspend(mddev);
rdev_for_each(temp, mddev) { rdev_for_each(temp, mddev) {
if (!rdev) { if (!rdev) {
if (!mddev->serialize_policy || if (!mddev->serialize_policy ||
@ -283,8 +272,6 @@ void mddev_destroy_serial_pool(struct mddev *mddev, struct md_rdev *rdev,
mempool_destroy(mddev->serial_info_pool); mempool_destroy(mddev->serial_info_pool);
mddev->serial_info_pool = NULL; mddev->serial_info_pool = NULL;
} }
if (!is_suspend)
mddev_resume(mddev);
} }
} }
@ -2557,7 +2544,7 @@ static int bind_rdev_to_array(struct md_rdev *rdev, struct mddev *mddev)
pr_debug("md: bind<%s>\n", b); pr_debug("md: bind<%s>\n", b);
if (mddev->raid_disks) if (mddev->raid_disks)
mddev_create_serial_pool(mddev, rdev, true); mddev_create_serial_pool(mddev, rdev);
if ((err = kobject_add(&rdev->kobj, &mddev->kobj, "dev-%s", b))) if ((err = kobject_add(&rdev->kobj, &mddev->kobj, "dev-%s", b)))
goto fail; goto fail;
@ -2610,7 +2597,7 @@ static void md_kick_rdev_from_array(struct md_rdev *rdev)
bd_unlink_disk_holder(rdev->bdev, rdev->mddev->gendisk); bd_unlink_disk_holder(rdev->bdev, rdev->mddev->gendisk);
list_del_rcu(&rdev->same_set); list_del_rcu(&rdev->same_set);
pr_debug("md: unbind<%pg>\n", rdev->bdev); pr_debug("md: unbind<%pg>\n", rdev->bdev);
mddev_destroy_serial_pool(rdev->mddev, rdev, false); mddev_destroy_serial_pool(rdev->mddev, rdev);
rdev->mddev = NULL; rdev->mddev = NULL;
sysfs_remove_link(&rdev->kobj, "block"); sysfs_remove_link(&rdev->kobj, "block");
sysfs_put(rdev->sysfs_state); sysfs_put(rdev->sysfs_state);
@ -3077,11 +3064,11 @@ state_store(struct md_rdev *rdev, const char *buf, size_t len)
} }
} else if (cmd_match(buf, "writemostly")) { } else if (cmd_match(buf, "writemostly")) {
set_bit(WriteMostly, &rdev->flags); set_bit(WriteMostly, &rdev->flags);
mddev_create_serial_pool(rdev->mddev, rdev, true); mddev_create_serial_pool(rdev->mddev, rdev);
need_update_sb = true; need_update_sb = true;
err = 0; err = 0;
} else if (cmd_match(buf, "-writemostly")) { } else if (cmd_match(buf, "-writemostly")) {
mddev_destroy_serial_pool(rdev->mddev, rdev, true); mddev_destroy_serial_pool(rdev->mddev, rdev);
clear_bit(WriteMostly, &rdev->flags); clear_bit(WriteMostly, &rdev->flags);
need_update_sb = true; need_update_sb = true;
err = 0; err = 0;
@ -5591,9 +5578,9 @@ serialize_policy_store(struct mddev *mddev, const char *buf, size_t len)
} }
if (value) if (value)
mddev_create_serial_pool(mddev, NULL, true); mddev_create_serial_pool(mddev, NULL);
else else
mddev_destroy_serial_pool(mddev, NULL, true); mddev_destroy_serial_pool(mddev, NULL);
mddev->serialize_policy = value; mddev->serialize_policy = value;
unlock: unlock:
mddev_unlock_and_resume(mddev); mddev_unlock_and_resume(mddev);
@ -6359,7 +6346,7 @@ static void __md_stop_writes(struct mddev *mddev)
} }
/* disable policy to guarantee rdevs free resources for serialization */ /* disable policy to guarantee rdevs free resources for serialization */
mddev->serialize_policy = 0; mddev->serialize_policy = 0;
mddev_destroy_serial_pool(mddev, NULL, true); mddev_destroy_serial_pool(mddev, NULL);
} }
void md_stop_writes(struct mddev *mddev) void md_stop_writes(struct mddev *mddev)

View File

@ -817,10 +817,9 @@ extern void __mddev_resume(struct mddev *mddev);
extern void md_reload_sb(struct mddev *mddev, int raid_disk); extern void md_reload_sb(struct mddev *mddev, int raid_disk);
extern void md_update_sb(struct mddev *mddev, int force); extern void md_update_sb(struct mddev *mddev, int force);
extern void mddev_create_serial_pool(struct mddev *mddev, struct md_rdev *rdev, extern void mddev_create_serial_pool(struct mddev *mddev, struct md_rdev *rdev);
bool is_suspend); extern void mddev_destroy_serial_pool(struct mddev *mddev,
extern void mddev_destroy_serial_pool(struct mddev *mddev, struct md_rdev *rdev, struct md_rdev *rdev);
bool is_suspend);
struct md_rdev *md_find_rdev_nr_rcu(struct mddev *mddev, int nr); struct md_rdev *md_find_rdev_nr_rcu(struct mddev *mddev, int nr);
struct md_rdev *md_find_rdev_rcu(struct mddev *mddev, dev_t dev); struct md_rdev *md_find_rdev_rcu(struct mddev *mddev, dev_t dev);