]> www.infradead.org Git - users/hch/block.git/commitdiff
md: stop using for_each_mddev in md_do_sync
authorChristoph Hellwig <hch@lst.de>
Sat, 3 Apr 2021 16:50:04 +0000 (18:50 +0200)
committerChristoph Hellwig <hch@lst.de>
Tue, 12 Jul 2022 06:59:00 +0000 (08:59 +0200)
Just do a plain list_for_each that only grabs a mddev reference in
the case where the thread sleeps and restarts the list iteration.

Signed-off-by: Christoph Hellwig <hch@lst.de>
drivers/md/md.c

index 61eceef17d5fd95a4fce5e76901afce5a3a77431..d22608dcb25fe7916369371fe237ece256b635a4 100644 (file)
@@ -8683,7 +8683,6 @@ void md_do_sync(struct md_thread *thread)
        unsigned long update_time;
        sector_t mark_cnt[SYNC_MARKS];
        int last_mark,m;
-       struct list_head *tmp;
        sector_t last_check;
        int skipped = 0;
        struct md_rdev *rdev;
@@ -8753,7 +8752,8 @@ void md_do_sync(struct md_thread *thread)
        try_again:
                if (test_bit(MD_RECOVERY_INTR, &mddev->recovery))
                        goto skip;
-               for_each_mddev(mddev2, tmp) {
+               spin_lock(&all_mddevs_lock);
+               list_for_each_entry(mddev2, &all_mddevs, all_mddevs) {
                        if (mddev2 == mddev)
                                continue;
                        if (!mddev->parallel_resync
@@ -8783,7 +8783,8 @@ void md_do_sync(struct md_thread *thread)
                                                        desc, mdname(mddev),
                                                        mdname(mddev2));
                                        }
-                                       mddev_put(mddev2);
+                                       spin_unlock(&all_mddevs_lock);
+
                                        if (signal_pending(current))
                                                flush_signals(current);
                                        schedule();
@@ -8793,6 +8794,7 @@ void md_do_sync(struct md_thread *thread)
                                finish_wait(&resync_wait, &wq);
                        }
                }
+               spin_unlock(&all_mddevs_lock);
        } while (mddev->curr_resync < 2);
 
        j = 0;