static int md_notify_reboot(struct notifier_block *this,
                            unsigned long code, void *x)
 {
-       struct list_head *tmp;
-       struct mddev *mddev;
+       struct mddev *mddev, *n;
        int need_delay = 0;
 
-       for_each_mddev(mddev, tmp) {
+       spin_lock(&all_mddevs_lock);
+       list_for_each_entry_safe(mddev, n, &all_mddevs, all_mddevs) {
+               mddev_get(mddev);
+               spin_unlock(&all_mddevs_lock);
                if (mddev_trylock(mddev)) {
                        if (mddev->pers)
                                __md_stop_writes(mddev);
                        mddev_unlock(mddev);
                }
                need_delay = 1;
+               mddev_put(mddev);
+               spin_lock(&all_mddevs_lock);
        }
+       spin_unlock(&all_mddevs_lock);
+
        /*
         * certain more exotic SCSI devices are known to be
         * volatile wrt too early system reboots. While the