@@ -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
/*
@@ -4840,59 +4846,72 @@ action_show(struct mddev *mddev, char *page)
4840
4846
return sprintf (page , "%s\n" , type );
4841
4847
}
4842
4848
4843
- static void stop_sync_thread (struct mddev * mddev )
4849
+ /**
4850
+ * stop_sync_thread() - wait for sync_thread to stop if it's running.
4851
+ * @mddev: the array.
4852
+ * @locked: if set, reconfig_mutex will still be held after this function
4853
+ * return; if not set, reconfig_mutex will be released after this
4854
+ * function return.
4855
+ * @check_seq: if set, only wait for curent running sync_thread to stop, noted
4856
+ * that new sync_thread can still start.
4857
+ */
4858
+ static void stop_sync_thread (struct mddev * mddev , bool locked , bool check_seq )
4844
4859
{
4845
- if (!test_bit (MD_RECOVERY_RUNNING , & mddev -> recovery ))
4846
- return ;
4860
+ int sync_seq ;
4847
4861
4848
- if (mddev_lock ( mddev ) )
4849
- return ;
4862
+ if (check_seq )
4863
+ sync_seq = atomic_read ( & mddev -> sync_seq ) ;
4850
4864
4851
- /*
4852
- * Check again in case MD_RECOVERY_RUNNING is cleared before lock is
4853
- * held.
4854
- */
4855
4865
if (!test_bit (MD_RECOVERY_RUNNING , & mddev -> recovery )) {
4856
- mddev_unlock (mddev );
4866
+ if (!locked )
4867
+ mddev_unlock (mddev );
4857
4868
return ;
4858
4869
}
4859
4870
4860
- if (work_pending (& mddev -> del_work ))
4861
- flush_workqueue (md_misc_wq );
4871
+ mddev_unlock (mddev );
4862
4872
4863
4873
set_bit (MD_RECOVERY_INTR , & mddev -> recovery );
4864
4874
/*
4865
4875
* Thread might be blocked waiting for metadata update which will now
4866
4876
* never happen
4867
4877
*/
4868
4878
md_wakeup_thread_directly (mddev -> sync_thread );
4879
+ if (work_pending (& mddev -> sync_work ))
4880
+ flush_work (& mddev -> sync_work );
4869
4881
4870
- mddev_unlock (mddev );
4882
+ wait_event (resync_wait ,
4883
+ !test_bit (MD_RECOVERY_RUNNING , & mddev -> recovery ) ||
4884
+ (check_seq && sync_seq != atomic_read (& mddev -> sync_seq )));
4885
+
4886
+ if (locked )
4887
+ mddev_lock_nointr (mddev );
4871
4888
}
4872
4889
4873
4890
static void idle_sync_thread (struct mddev * mddev )
4874
4891
{
4875
- int sync_seq = atomic_read (& mddev -> sync_seq );
4876
-
4877
4892
mutex_lock (& mddev -> sync_mutex );
4878
4893
clear_bit (MD_RECOVERY_FROZEN , & mddev -> recovery );
4879
- stop_sync_thread (mddev );
4880
4894
4881
- wait_event (resync_wait , sync_seq != atomic_read (& mddev -> sync_seq ) ||
4882
- !test_bit (MD_RECOVERY_RUNNING , & mddev -> recovery ));
4895
+ if (mddev_lock (mddev )) {
4896
+ mutex_unlock (& mddev -> sync_mutex );
4897
+ return ;
4898
+ }
4883
4899
4900
+ stop_sync_thread (mddev , false, true);
4884
4901
mutex_unlock (& mddev -> sync_mutex );
4885
4902
}
4886
4903
4887
4904
static void frozen_sync_thread (struct mddev * mddev )
4888
4905
{
4889
4906
mutex_lock (& mddev -> sync_mutex );
4890
4907
set_bit (MD_RECOVERY_FROZEN , & mddev -> recovery );
4891
- stop_sync_thread (mddev );
4892
4908
4893
- wait_event (resync_wait , mddev -> sync_thread == NULL &&
4894
- !test_bit (MD_RECOVERY_RUNNING , & mddev -> recovery ));
4909
+ if (mddev_lock (mddev )) {
4910
+ mutex_unlock (& mddev -> sync_mutex );
4911
+ return ;
4912
+ }
4895
4913
4914
+ stop_sync_thread (mddev , false, false);
4896
4915
mutex_unlock (& mddev -> sync_mutex );
4897
4916
}
4898
4917
@@ -6264,14 +6283,7 @@ static void md_clean(struct mddev *mddev)
6264
6283
6265
6284
static void __md_stop_writes (struct mddev * mddev )
6266
6285
{
6267
- set_bit (MD_RECOVERY_FROZEN , & mddev -> recovery );
6268
- if (work_pending (& mddev -> del_work ))
6269
- flush_workqueue (md_misc_wq );
6270
- if (mddev -> sync_thread ) {
6271
- set_bit (MD_RECOVERY_INTR , & mddev -> recovery );
6272
- md_reap_sync_thread (mddev );
6273
- }
6274
-
6286
+ stop_sync_thread (mddev , true, false);
6275
6287
del_timer_sync (& mddev -> safemode_timer );
6276
6288
6277
6289
if (mddev -> pers && mddev -> pers -> quiesce ) {
@@ -6355,25 +6367,16 @@ static int md_set_readonly(struct mddev *mddev, struct block_device *bdev)
6355
6367
int err = 0 ;
6356
6368
int did_freeze = 0 ;
6357
6369
6370
+ if (mddev -> external && test_bit (MD_SB_CHANGE_PENDING , & mddev -> sb_flags ))
6371
+ return - EBUSY ;
6372
+
6358
6373
if (!test_bit (MD_RECOVERY_FROZEN , & mddev -> recovery )) {
6359
6374
did_freeze = 1 ;
6360
6375
set_bit (MD_RECOVERY_FROZEN , & mddev -> recovery );
6361
6376
md_wakeup_thread (mddev -> thread );
6362
6377
}
6363
- if (test_bit (MD_RECOVERY_RUNNING , & mddev -> recovery ))
6364
- set_bit (MD_RECOVERY_INTR , & mddev -> recovery );
6365
6378
6366
- /*
6367
- * Thread might be blocked waiting for metadata update which will now
6368
- * never happen
6369
- */
6370
- md_wakeup_thread_directly (mddev -> sync_thread );
6371
-
6372
- if (mddev -> external && test_bit (MD_SB_CHANGE_PENDING , & mddev -> sb_flags ))
6373
- return - EBUSY ;
6374
- mddev_unlock (mddev );
6375
- wait_event (resync_wait , !test_bit (MD_RECOVERY_RUNNING ,
6376
- & mddev -> recovery ));
6379
+ stop_sync_thread (mddev , false, false);
6377
6380
wait_event (mddev -> sb_wait ,
6378
6381
!test_bit (MD_SB_CHANGE_PENDING , & mddev -> sb_flags ));
6379
6382
mddev_lock_nointr (mddev );
@@ -6383,29 +6386,30 @@ static int md_set_readonly(struct mddev *mddev, struct block_device *bdev)
6383
6386
mddev -> sync_thread ||
6384
6387
test_bit (MD_RECOVERY_RUNNING , & mddev -> recovery )) {
6385
6388
pr_warn ("md: %s still in use.\n" ,mdname (mddev ));
6386
- if (did_freeze ) {
6387
- clear_bit (MD_RECOVERY_FROZEN , & mddev -> recovery );
6388
- set_bit (MD_RECOVERY_NEEDED , & mddev -> recovery );
6389
- md_wakeup_thread (mddev -> thread );
6390
- }
6391
6389
err = - EBUSY ;
6392
6390
goto out ;
6393
6391
}
6392
+
6394
6393
if (mddev -> pers ) {
6395
6394
__md_stop_writes (mddev );
6396
6395
6397
- err = - ENXIO ;
6398
- if ( mddev -> ro == MD_RDONLY )
6396
+ if ( mddev -> ro == MD_RDONLY ) {
6397
+ err = - ENXIO ;
6399
6398
goto out ;
6399
+ }
6400
+
6400
6401
mddev -> ro = MD_RDONLY ;
6401
6402
set_disk_ro (mddev -> gendisk , 1 );
6403
+ }
6404
+
6405
+ out :
6406
+ if ((mddev -> pers && !err ) || did_freeze ) {
6402
6407
clear_bit (MD_RECOVERY_FROZEN , & mddev -> recovery );
6403
6408
set_bit (MD_RECOVERY_NEEDED , & mddev -> recovery );
6404
6409
md_wakeup_thread (mddev -> thread );
6405
6410
sysfs_notify_dirent_safe (mddev -> sysfs_state );
6406
- err = 0 ;
6407
6411
}
6408
- out :
6412
+
6409
6413
mutex_unlock (& mddev -> open_mutex );
6410
6414
return err ;
6411
6415
}
@@ -6426,20 +6430,8 @@ static int do_md_stop(struct mddev *mddev, int mode,
6426
6430
set_bit (MD_RECOVERY_FROZEN , & mddev -> recovery );
6427
6431
md_wakeup_thread (mddev -> thread );
6428
6432
}
6429
- if (test_bit (MD_RECOVERY_RUNNING , & mddev -> recovery ))
6430
- set_bit (MD_RECOVERY_INTR , & mddev -> recovery );
6431
-
6432
- /*
6433
- * Thread might be blocked waiting for metadata update which will now
6434
- * never happen
6435
- */
6436
- md_wakeup_thread_directly (mddev -> sync_thread );
6437
6433
6438
- mddev_unlock (mddev );
6439
- wait_event (resync_wait , (mddev -> sync_thread == NULL &&
6440
- !test_bit (MD_RECOVERY_RUNNING ,
6441
- & mddev -> recovery )));
6442
- mddev_lock_nointr (mddev );
6434
+ stop_sync_thread (mddev , true, false);
6443
6435
6444
6436
mutex_lock (& mddev -> open_mutex );
6445
6437
if ((mddev -> pers && atomic_read (& mddev -> openers ) > !!bdev ) ||
@@ -9403,7 +9395,15 @@ static void md_start_sync(struct work_struct *ws)
9403
9395
goto not_running ;
9404
9396
}
9405
9397
9406
- 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);
9407
9407
md_wakeup_thread (mddev -> sync_thread );
9408
9408
sysfs_notify_dirent_safe (mddev -> sysfs_action );
9409
9409
md_new_event ();
@@ -9415,7 +9415,15 @@ static void md_start_sync(struct work_struct *ws)
9415
9415
clear_bit (MD_RECOVERY_REQUESTED , & mddev -> recovery );
9416
9416
clear_bit (MD_RECOVERY_CHECK , & mddev -> recovery );
9417
9417
clear_bit (MD_RECOVERY_RUNNING , & mddev -> recovery );
9418
- 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);
9419
9427
9420
9428
wake_up (& resync_wait );
9421
9429
if (test_and_clear_bit (MD_RECOVERY_RECOVER , & mddev -> recovery ) &&
0 commit comments