diff options
| author | Yu Kuai <yukuai3@huawei.com> | 2023-12-05 17:42:13 +0800 |
|---|---|---|
| committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2025-02-27 04:10:53 -0800 |
| commit | 4b79bee3e3c0b66b18fbb6187d68927366c8f3b5 (patch) | |
| tree | d4c6fb0414e06f4181a46ceff7324cb5c39c7f19 | |
| parent | d6fe973c8873c998734a050f366b28facc03d32a (diff) | |
| download | linux-4b79bee3e3c0b66b18fbb6187d68927366c8f3b5.tar.gz linux-4b79bee3e3c0b66b18fbb6187d68927366c8f3b5.tar.bz2 linux-4b79bee3e3c0b66b18fbb6187d68927366c8f3b5.zip | |
md: fix missing flush of sync_work
commit f2d87a759f6841a132e845e2fafdad37385ddd30 upstream.
Commit ac619781967b ("md: use separate work_struct for md_start_sync()")
use a new sync_work to replace del_work, however, stop_sync_thread() and
__md_stop_writes() was trying to wait for sync_thread to be done, hence
they should switch to use sync_work as well.
Noted that md_start_sync() from sync_work will grab 'reconfig_mutex',
hence other contex can't held the same lock to flush work, and this will
be fixed in later patches.
Fixes: ac619781967b ("md: use separate work_struct for md_start_sync()")
Signed-off-by: Yu Kuai <yukuai3@huawei.com>
Acked-by: Xiao Ni <xni@redhat.com>
Signed-off-by: Song Liu <song@kernel.org>
Link: https://lore.kernel.org/r/20231205094215.1824240-2-yukuai1@huaweicloud.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
| -rw-r--r-- | drivers/md/md.c | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/drivers/md/md.c b/drivers/md/md.c index 534c4efd935f..240e12cfd17f 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c @@ -4836,7 +4836,7 @@ static void stop_sync_thread(struct mddev *mddev) return; } - if (work_pending(&mddev->del_work)) + if (work_pending(&mddev->sync_work)) flush_workqueue(md_misc_wq); set_bit(MD_RECOVERY_INTR, &mddev->recovery); @@ -6293,7 +6293,7 @@ static void md_clean(struct mddev *mddev) static void __md_stop_writes(struct mddev *mddev) { set_bit(MD_RECOVERY_FROZEN, &mddev->recovery); - if (work_pending(&mddev->del_work)) + if (work_pending(&mddev->sync_work)) flush_workqueue(md_misc_wq); if (mddev->sync_thread) { set_bit(MD_RECOVERY_INTR, &mddev->recovery); |
