diff options
| author | Yu Kuai <yukuai3@huawei.com> | 2023-08-25 11:16:16 +0800 |
|---|---|---|
| committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2025-02-27 04:10:44 -0800 |
| commit | 13231893fb7af29a33b5ae1de1aacbfd30e6639d (patch) | |
| tree | f01b698a34ba8394a8565fe78259655090e8e738 | |
| parent | 4534162e0916accc7bfc974a08865bebae0b5c56 (diff) | |
| download | linux-13231893fb7af29a33b5ae1de1aacbfd30e6639d.tar.gz linux-13231893fb7af29a33b5ae1de1aacbfd30e6639d.tar.bz2 linux-13231893fb7af29a33b5ae1de1aacbfd30e6639d.zip | |
md: use separate work_struct for md_start_sync()
[ Upstream commit ac619781967bd5663c29606246b50dbebd8b3473 ]
It's a little weird to borrow 'del_work' for md_start_sync(), declare
a new work_struct 'sync_work' for md_start_sync().
Signed-off-by: Yu Kuai <yukuai3@huawei.com>
Reviewed-by: Xiao Ni <xni@redhat.com>
Signed-off-by: Song Liu <song@kernel.org>
Link: https://lore.kernel.org/r/20230825031622.1530464-2-yukuai1@huaweicloud.com
Stable-dep-of: 8d28d0ddb986 ("md/md-bitmap: Synchronize bitmap_get_stats() with bitmap lifetime")
Signed-off-by: Sasha Levin <sashal@kernel.org>
| -rw-r--r-- | drivers/md/md.c | 10 | ||||
| -rw-r--r-- | drivers/md/md.h | 5 |
2 files changed, 10 insertions, 5 deletions
diff --git a/drivers/md/md.c b/drivers/md/md.c index 9bc19a5a4119..342407ea87d8 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c @@ -648,13 +648,13 @@ void mddev_put(struct mddev *mddev) * flush_workqueue() after mddev_find will succeed in waiting * for the work to be done. */ - INIT_WORK(&mddev->del_work, mddev_delayed_delete); queue_work(md_misc_wq, &mddev->del_work); } spin_unlock(&all_mddevs_lock); } static void md_safemode_timeout(struct timer_list *t); +static void md_start_sync(struct work_struct *ws); void mddev_init(struct mddev *mddev) { @@ -679,6 +679,9 @@ void mddev_init(struct mddev *mddev) mddev->resync_min = 0; mddev->resync_max = MaxSector; mddev->level = LEVEL_NONE; + + INIT_WORK(&mddev->sync_work, md_start_sync); + INIT_WORK(&mddev->del_work, mddev_delayed_delete); } EXPORT_SYMBOL_GPL(mddev_init); @@ -9333,7 +9336,7 @@ no_add: static void md_start_sync(struct work_struct *ws) { - struct mddev *mddev = container_of(ws, struct mddev, del_work); + struct mddev *mddev = container_of(ws, struct mddev, sync_work); rcu_assign_pointer(mddev->sync_thread, md_register_thread(md_do_sync, mddev, "resync")); @@ -9546,8 +9549,7 @@ void md_check_recovery(struct mddev *mddev) */ md_bitmap_write_all(mddev->bitmap); } - INIT_WORK(&mddev->del_work, md_start_sync); - queue_work(md_misc_wq, &mddev->del_work); + queue_work(md_misc_wq, &mddev->sync_work); goto unlock; } not_running: diff --git a/drivers/md/md.h b/drivers/md/md.h index f29fa8650cd0..46995558d3bd 100644 --- a/drivers/md/md.h +++ b/drivers/md/md.h @@ -453,7 +453,10 @@ struct mddev { struct kernfs_node *sysfs_degraded; /*handle for 'degraded' */ struct kernfs_node *sysfs_level; /*handle for 'level' */ - struct work_struct del_work; /* used for delayed sysfs removal */ + /* used for delayed sysfs removal */ + struct work_struct del_work; + /* used for register new sync thread */ + struct work_struct sync_work; /* "lock" protects: * flush_bio transition from NULL to !NULL |
