{
        mutex_init(&mddev->open_mutex);
        mutex_init(&mddev->reconfig_mutex);
-       mutex_init(&mddev->delete_mutex);
        mutex_init(&mddev->bitmap_info.mutex);
        INIT_LIST_HEAD(&mddev->disks);
        INIT_LIST_HEAD(&mddev->all_mddevs);
 
 static const struct attribute_group md_redundancy_group;
 
-static void md_free_rdev(struct mddev *mddev)
+void mddev_unlock(struct mddev *mddev)
 {
        struct md_rdev *rdev;
        struct md_rdev *tmp;
+       LIST_HEAD(delete);
 
-       mutex_lock(&mddev->delete_mutex);
-       if (list_empty(&mddev->deleting))
-               goto out;
+       if (!list_empty(&mddev->deleting))
+               list_splice_init(&mddev->deleting, &delete);
 
-       list_for_each_entry_safe(rdev, tmp, &mddev->deleting, same_set) {
-               list_del_init(&rdev->same_set);
-               kobject_del(&rdev->kobj);
-               export_rdev(rdev, mddev);
-       }
-out:
-       mutex_unlock(&mddev->delete_mutex);
-}
-
-void mddev_unlock(struct mddev *mddev)
-{
        if (mddev->to_remove) {
                /* These cannot be removed under reconfig_mutex as
                 * an access to the files will try to take reconfig_mutex
        } else
                mutex_unlock(&mddev->reconfig_mutex);
 
-       md_free_rdev(mddev);
+       list_for_each_entry_safe(rdev, tmp, &delete, same_set) {
+               list_del_init(&rdev->same_set);
+               kobject_del(&rdev->kobj);
+               export_rdev(rdev, mddev);
+       }
 
        md_wakeup_thread(mddev->thread);
        wake_up(&mddev->sb_wait);
         * reconfig_mutex is held, hence it can't be called under
         * reconfig_mutex and it's delayed to mddev_unlock().
         */
-       mutex_lock(&mddev->delete_mutex);
        list_add(&rdev->same_set, &mddev->deleting);
-       mutex_unlock(&mddev->delete_mutex);
 }
 
 static void export_array(struct mddev *mddev)