Message ID | 20230820090949.2874537-2-yukuai1@huaweicloud.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | md: make rdev addition and removal independent from daemon thread | expand |
On Sun, Aug 20, 2023 at 5:13 PM Yu Kuai <yukuai1@huaweicloud.com> wrote: > > From: Yu Kuai <yukuai3@huawei.com> > > 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> > --- > drivers/md/md.c | 10 ++++++---- > 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 5c3c19b8d509..90815be1e80f 100644 > --- a/drivers/md/md.c > +++ b/drivers/md/md.c > @@ -631,13 +631,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) > { > @@ -662,6 +662,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); > > @@ -9245,7 +9248,7 @@ static int remove_and_add_spares(struct mddev *mddev, > > 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")); > @@ -9458,8 +9461,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 9bcb77bca963..64d05cb65287 100644 > --- a/drivers/md/md.h > +++ b/drivers/md/md.h > @@ -450,7 +450,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 > -- > 2.39.2 > Reviewed-by: Xiao Ni <xni@redhat.com>
diff --git a/drivers/md/md.c b/drivers/md/md.c index 5c3c19b8d509..90815be1e80f 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c @@ -631,13 +631,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) { @@ -662,6 +662,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); @@ -9245,7 +9248,7 @@ static int remove_and_add_spares(struct mddev *mddev, 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")); @@ -9458,8 +9461,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 9bcb77bca963..64d05cb65287 100644 --- a/drivers/md/md.h +++ b/drivers/md/md.h @@ -450,7 +450,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