}
 EXPORT_SYMBOL_GPL(mddev_suspend);
 
-void mddev_resume(struct mddev *mddev)
+static void __mddev_resume(struct mddev *mddev, bool recovery_needed)
 {
        lockdep_assert_not_held(&mddev->reconfig_mutex);
 
        percpu_ref_resurrect(&mddev->active_io);
        wake_up(&mddev->sb_wait);
 
-       set_bit(MD_RECOVERY_NEEDED, &mddev->recovery);
+       if (recovery_needed)
+               set_bit(MD_RECOVERY_NEEDED, &mddev->recovery);
        md_wakeup_thread(mddev->thread);
        md_wakeup_thread(mddev->sync_thread); /* possibly kick off a reshape */
 
        mutex_unlock(&mddev->suspend_mutex);
 }
+
+void mddev_resume(struct mddev *mddev)
+{
+       return __mddev_resume(mddev, true);
+}
 EXPORT_SYMBOL_GPL(mddev_resume);
 
 /*
                goto not_running;
        }
 
-       suspend ? mddev_unlock_and_resume(mddev) : mddev_unlock(mddev);
+       mddev_unlock(mddev);
+       /*
+        * md_start_sync was triggered by MD_RECOVERY_NEEDED, so we should
+        * not set it again. Otherwise, we may cause issue like this one:
+        *     https://bugzilla.kernel.org/show_bug.cgi?id=218200
+        * Therefore, use __mddev_resume(mddev, false).
+        */
+       if (suspend)
+               __mddev_resume(mddev, false);
        md_wakeup_thread(mddev->sync_thread);
        sysfs_notify_dirent_safe(mddev->sysfs_action);
        md_new_event();
        clear_bit(MD_RECOVERY_REQUESTED, &mddev->recovery);
        clear_bit(MD_RECOVERY_CHECK, &mddev->recovery);
        clear_bit(MD_RECOVERY_RUNNING, &mddev->recovery);
-       suspend ? mddev_unlock_and_resume(mddev) : mddev_unlock(mddev);
+       mddev_unlock(mddev);
+       /*
+        * md_start_sync was triggered by MD_RECOVERY_NEEDED, so we should
+        * not set it again. Otherwise, we may cause issue like this one:
+        *     https://bugzilla.kernel.org/show_bug.cgi?id=218200
+        * Therefore, use __mddev_resume(mddev, false).
+        */
+       if (suspend)
+               __mddev_resume(mddev, false);
 
        wake_up(&resync_wait);
        if (test_and_clear_bit(MD_RECOVERY_RECOVER, &mddev->recovery) &&