···6161static void autostart_arrays(int part);6262#endif63636464+/* pers_list is a list of registered personalities protected6565+ * by pers_lock.6666+ * pers_lock does extra service to protect accesses to6767+ * mddev->thread when the mutex cannot be held.6868+ */6469static LIST_HEAD(pers_list);6570static DEFINE_SPINLOCK(pers_lock);6671···744739 } else745740 mutex_unlock(&mddev->reconfig_mutex);746741742742+ /* was we've dropped the mutex we need a spinlock to743743+ * make sur the thread doesn't disappear744744+ */745745+ spin_lock(&pers_lock);747746 md_wakeup_thread(mddev->thread);747747+ spin_unlock(&pers_lock);748748}749749750750static mdk_rdev_t * find_rdev_nr(mddev_t *mddev, int nr)···64396429 return thread;64406430}6441643164426442-void md_unregister_thread(mdk_thread_t *thread)64326432+void md_unregister_thread(mdk_thread_t **threadp)64436433{64346434+ mdk_thread_t *thread = *threadp;64446435 if (!thread)64456436 return;64466437 dprintk("interrupting MD-thread pid %d\n", task_pid_nr(thread->tsk));64386438+ /* Locking ensures that mddev_unlock does not wake_up a64396439+ * non-existent thread64406440+ */64416441+ spin_lock(&pers_lock);64426442+ *threadp = NULL;64436443+ spin_unlock(&pers_lock);6447644464486445 kthread_stop(thread->tsk);64496446 kfree(thread);···73577340 mdk_rdev_t *rdev;7358734173597342 /* resync has finished, collect result */73607360- md_unregister_thread(mddev->sync_thread);73617361- mddev->sync_thread = NULL;73437343+ md_unregister_thread(&mddev->sync_thread);73627344 if (!test_bit(MD_RECOVERY_INTR, &mddev->recovery) &&73637345 !test_bit(MD_RECOVERY_REQUESTED, &mddev->recovery)) {73647346 /* success...*/