+++ /dev/null
-From 4fa154bcffc727f04e951f6112c01e74c6e19290 Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Wed, 27 Sep 2023 14:12:40 +0800
-Subject: md: factor out a helper from mddev_put()
-
-From: Yu Kuai <yukuai3@huawei.com>
-
-[ Upstream commit 3d8d32873c7b6d9cec5b40c2ddb8c7c55961694f ]
-
-There are no functional changes, prepare to simplify md_seq_ops in next
-patch.
-
-Signed-off-by: Yu Kuai <yukuai3@huawei.com>
-Signed-off-by: Song Liu <song@kernel.org>
-Link: https://lore.kernel.org/r/20230927061241.1552837-2-yukuai1@huaweicloud.com
-Stable-dep-of: 6ec1f0239485 ("md/md-bitmap: fix stats collection for external bitmaps")
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- drivers/md/md.c | 29 +++++++++++++++++------------
- 1 file changed, 17 insertions(+), 12 deletions(-)
-
-diff --git a/drivers/md/md.c b/drivers/md/md.c
-index 0e101e74f0ba8..fda4bf9568572 100644
---- a/drivers/md/md.c
-+++ b/drivers/md/md.c
-@@ -667,23 +667,28 @@ static inline struct mddev *mddev_get(struct mddev *mddev)
-
- static void mddev_delayed_delete(struct work_struct *ws);
-
-+static void __mddev_put(struct mddev *mddev)
-+{
-+ if (mddev->raid_disks || !list_empty(&mddev->disks) ||
-+ mddev->ctime || mddev->hold_active)
-+ return;
-+
-+ /* Array is not configured at all, and not held active, so destroy it */
-+ set_bit(MD_DELETED, &mddev->flags);
-+
-+ /*
-+ * Call queue_work inside the spinlock so that flush_workqueue() after
-+ * mddev_find will succeed in waiting for the work to be done.
-+ */
-+ queue_work(md_misc_wq, &mddev->del_work);
-+}
-+
- void mddev_put(struct mddev *mddev)
- {
- if (!atomic_dec_and_lock(&mddev->active, &all_mddevs_lock))
- return;
-- if (!mddev->raid_disks && list_empty(&mddev->disks) &&
-- mddev->ctime == 0 && !mddev->hold_active) {
-- /* Array is not configured at all, and not held active,
-- * so destroy it */
-- set_bit(MD_DELETED, &mddev->flags);
-
-- /*
-- * Call queue_work inside the spinlock so that
-- * flush_workqueue() after mddev_find will succeed in waiting
-- * for the work to be done.
-- */
-- queue_work(md_misc_wq, &mddev->del_work);
-- }
-+ __mddev_put(mddev);
- spin_unlock(&all_mddevs_lock);
- }
-
---
-2.39.5
-
+++ /dev/null
-From 2bf8b80f534f60cdc014da6571a193747823236a Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Fri, 25 Aug 2023 11:16:16 +0800
-Subject: md: use separate work_struct for md_start_sync()
-
-From: Yu Kuai <yukuai3@huawei.com>
-
-[ 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: 6ec1f0239485 ("md/md-bitmap: fix stats collection for external bitmaps")
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- 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 5e2751d42f645..0e101e74f0ba8 100644
---- a/drivers/md/md.c
-+++ b/drivers/md/md.c
-@@ -682,13 +682,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)
- {
-@@ -710,6 +710,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);
-
-@@ -9339,7 +9342,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);
-
- mddev->sync_thread = md_register_thread(md_do_sync,
- mddev,
-@@ -9547,8 +9550,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 4f0b480974552..c1258c94216ac 100644
---- a/drivers/md/md.h
-+++ b/drivers/md/md.h
-@@ -452,7 +452,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.5
-