@@ -490,7 +490,7 @@ int mddev_suspend(struct mddev *mddev, bool interruptible)
490
490
}
491
491
EXPORT_SYMBOL_GPL (mddev_suspend );
492
492
493
- void mddev_resume (struct mddev * mddev )
493
+ static void __mddev_resume (struct mddev * mddev , bool recovery_needed )
494
494
{
495
495
lockdep_assert_not_held (& mddev -> reconfig_mutex );
496
496
@@ -507,12 +507,18 @@ void mddev_resume(struct mddev *mddev)
507
507
percpu_ref_resurrect (& mddev -> active_io );
508
508
wake_up (& mddev -> sb_wait );
509
509
510
- set_bit (MD_RECOVERY_NEEDED , & mddev -> recovery );
510
+ if (recovery_needed )
511
+ set_bit (MD_RECOVERY_NEEDED , & mddev -> recovery );
511
512
md_wakeup_thread (mddev -> thread );
512
513
md_wakeup_thread (mddev -> sync_thread ); /* possibly kick off a reshape */
513
514
514
515
mutex_unlock (& mddev -> suspend_mutex );
515
516
}
517
+
518
+ void mddev_resume (struct mddev * mddev )
519
+ {
520
+ return __mddev_resume (mddev , true);
521
+ }
516
522
EXPORT_SYMBOL_GPL (mddev_resume );
517
523
518
524
/*
@@ -9389,7 +9395,15 @@ static void md_start_sync(struct work_struct *ws)
9389
9395
goto not_running ;
9390
9396
}
9391
9397
9392
- suspend ? mddev_unlock_and_resume (mddev ) : mddev_unlock (mddev );
9398
+ mddev_unlock (mddev );
9399
+ /*
9400
+ * md_start_sync was triggered by MD_RECOVERY_NEEDED, so we should
9401
+ * not set it again. Otherwise, we may cause issue like this one:
9402
+ * https://bugzilla.kernel.org/show_bug.cgi?id=218200
9403
+ * Therefore, use __mddev_resume(mddev, false).
9404
+ */
9405
+ if (suspend )
9406
+ __mddev_resume (mddev , false);
9393
9407
md_wakeup_thread (mddev -> sync_thread );
9394
9408
sysfs_notify_dirent_safe (mddev -> sysfs_action );
9395
9409
md_new_event ();
@@ -9401,7 +9415,15 @@ static void md_start_sync(struct work_struct *ws)
9401
9415
clear_bit (MD_RECOVERY_REQUESTED , & mddev -> recovery );
9402
9416
clear_bit (MD_RECOVERY_CHECK , & mddev -> recovery );
9403
9417
clear_bit (MD_RECOVERY_RUNNING , & mddev -> recovery );
9404
- suspend ? mddev_unlock_and_resume (mddev ) : mddev_unlock (mddev );
9418
+ mddev_unlock (mddev );
9419
+ /*
9420
+ * md_start_sync was triggered by MD_RECOVERY_NEEDED, so we should
9421
+ * not set it again. Otherwise, we may cause issue like this one:
9422
+ * https://bugzilla.kernel.org/show_bug.cgi?id=218200
9423
+ * Therefore, use __mddev_resume(mddev, false).
9424
+ */
9425
+ if (suspend )
9426
+ __mddev_resume (mddev , false);
9405
9427
9406
9428
wake_up (& resync_wait );
9407
9429
if (test_and_clear_bit (MD_RECOVERY_RECOVER , & mddev -> recovery ) &&
0 commit comments