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;
        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
                                                        desc, mdname(mddev),
                                                        mdname(mddev2));
                                        }
-                                       mddev_put(mddev2);
+                                       spin_unlock(&all_mddevs_lock);
+
                                        if (signal_pending(current))
                                                flush_signals(current);
                                        schedule();
                                finish_wait(&resync_wait, &wq);
                        }
                }
+               spin_unlock(&all_mddevs_lock);
        } while (mddev->curr_resync < MD_RESYNC_DELAYED);
 
        j = 0;