@@ -490,7 +490,7 @@ int mddev_suspend(struct mddev *mddev, bool interruptible)
490490}
491491EXPORT_SYMBOL_GPL (mddev_suspend );
492492
493- void mddev_resume (struct mddev * mddev )
493+ static void __mddev_resume (struct mddev * mddev , bool recovery_needed )
494494{
495495 lockdep_assert_not_held (& mddev -> reconfig_mutex );
496496
@@ -507,12 +507,18 @@ void mddev_resume(struct mddev *mddev)
507507 percpu_ref_resurrect (& mddev -> active_io );
508508 wake_up (& mddev -> sb_wait );
509509
510- set_bit (MD_RECOVERY_NEEDED , & mddev -> recovery );
510+ if (recovery_needed )
511+ set_bit (MD_RECOVERY_NEEDED , & mddev -> recovery );
511512 md_wakeup_thread (mddev -> thread );
512513 md_wakeup_thread (mddev -> sync_thread ); /* possibly kick off a reshape */
513514
514515 mutex_unlock (& mddev -> suspend_mutex );
515516}
517+
518+ void mddev_resume (struct mddev * mddev )
519+ {
520+ return __mddev_resume (mddev , true);
521+ }
516522EXPORT_SYMBOL_GPL (mddev_resume );
517523
518524/*
@@ -4840,59 +4846,72 @@ action_show(struct mddev *mddev, char *page)
48404846 return sprintf (page , "%s\n" , type );
48414847}
48424848
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 )
48444859{
4845- if (!test_bit (MD_RECOVERY_RUNNING , & mddev -> recovery ))
4846- return ;
4860+ int sync_seq ;
48474861
4848- if (mddev_lock ( mddev ) )
4849- return ;
4862+ if (check_seq )
4863+ sync_seq = atomic_read ( & mddev -> sync_seq ) ;
48504864
4851- /*
4852- * Check again in case MD_RECOVERY_RUNNING is cleared before lock is
4853- * held.
4854- */
48554865 if (!test_bit (MD_RECOVERY_RUNNING , & mddev -> recovery )) {
4856- mddev_unlock (mddev );
4866+ if (!locked )
4867+ mddev_unlock (mddev );
48574868 return ;
48584869 }
48594870
4860- if (work_pending (& mddev -> del_work ))
4861- flush_workqueue (md_misc_wq );
4871+ mddev_unlock (mddev );
48624872
48634873 set_bit (MD_RECOVERY_INTR , & mddev -> recovery );
48644874 /*
48654875 * Thread might be blocked waiting for metadata update which will now
48664876 * never happen
48674877 */
48684878 md_wakeup_thread_directly (mddev -> sync_thread );
4879+ if (work_pending (& mddev -> sync_work ))
4880+ flush_work (& mddev -> sync_work );
48694881
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 );
48714888}
48724889
48734890static void idle_sync_thread (struct mddev * mddev )
48744891{
4875- int sync_seq = atomic_read (& mddev -> sync_seq );
4876-
48774892 mutex_lock (& mddev -> sync_mutex );
48784893 clear_bit (MD_RECOVERY_FROZEN , & mddev -> recovery );
4879- stop_sync_thread (mddev );
48804894
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+ }
48834899
4900+ stop_sync_thread (mddev , false, true);
48844901 mutex_unlock (& mddev -> sync_mutex );
48854902}
48864903
48874904static void frozen_sync_thread (struct mddev * mddev )
48884905{
48894906 mutex_lock (& mddev -> sync_mutex );
48904907 set_bit (MD_RECOVERY_FROZEN , & mddev -> recovery );
4891- stop_sync_thread (mddev );
48924908
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+ }
48954913
4914+ stop_sync_thread (mddev , false, false);
48964915 mutex_unlock (& mddev -> sync_mutex );
48974916}
48984917
@@ -6264,14 +6283,7 @@ static void md_clean(struct mddev *mddev)
62646283
62656284static void __md_stop_writes (struct mddev * mddev )
62666285{
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);
62756287 del_timer_sync (& mddev -> safemode_timer );
62766288
62776289 if (mddev -> pers && mddev -> pers -> quiesce ) {
@@ -6355,25 +6367,16 @@ static int md_set_readonly(struct mddev *mddev, struct block_device *bdev)
63556367 int err = 0 ;
63566368 int did_freeze = 0 ;
63576369
6370+ if (mddev -> external && test_bit (MD_SB_CHANGE_PENDING , & mddev -> sb_flags ))
6371+ return - EBUSY ;
6372+
63586373 if (!test_bit (MD_RECOVERY_FROZEN , & mddev -> recovery )) {
63596374 did_freeze = 1 ;
63606375 set_bit (MD_RECOVERY_FROZEN , & mddev -> recovery );
63616376 md_wakeup_thread (mddev -> thread );
63626377 }
6363- if (test_bit (MD_RECOVERY_RUNNING , & mddev -> recovery ))
6364- set_bit (MD_RECOVERY_INTR , & mddev -> recovery );
63656378
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);
63776380 wait_event (mddev -> sb_wait ,
63786381 !test_bit (MD_SB_CHANGE_PENDING , & mddev -> sb_flags ));
63796382 mddev_lock_nointr (mddev );
@@ -6383,29 +6386,30 @@ static int md_set_readonly(struct mddev *mddev, struct block_device *bdev)
63836386 mddev -> sync_thread ||
63846387 test_bit (MD_RECOVERY_RUNNING , & mddev -> recovery )) {
63856388 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- }
63916389 err = - EBUSY ;
63926390 goto out ;
63936391 }
6392+
63946393 if (mddev -> pers ) {
63956394 __md_stop_writes (mddev );
63966395
6397- err = - ENXIO ;
6398- if ( mddev -> ro == MD_RDONLY )
6396+ if ( mddev -> ro == MD_RDONLY ) {
6397+ err = - ENXIO ;
63996398 goto out ;
6399+ }
6400+
64006401 mddev -> ro = MD_RDONLY ;
64016402 set_disk_ro (mddev -> gendisk , 1 );
6403+ }
6404+
6405+ out :
6406+ if ((mddev -> pers && !err ) || did_freeze ) {
64026407 clear_bit (MD_RECOVERY_FROZEN , & mddev -> recovery );
64036408 set_bit (MD_RECOVERY_NEEDED , & mddev -> recovery );
64046409 md_wakeup_thread (mddev -> thread );
64056410 sysfs_notify_dirent_safe (mddev -> sysfs_state );
6406- err = 0 ;
64076411 }
6408- out :
6412+
64096413 mutex_unlock (& mddev -> open_mutex );
64106414 return err ;
64116415}
@@ -6426,20 +6430,8 @@ static int do_md_stop(struct mddev *mddev, int mode,
64266430 set_bit (MD_RECOVERY_FROZEN , & mddev -> recovery );
64276431 md_wakeup_thread (mddev -> thread );
64286432 }
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 );
64376433
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);
64436435
64446436 mutex_lock (& mddev -> open_mutex );
64456437 if ((mddev -> pers && atomic_read (& mddev -> openers ) > !!bdev ) ||
@@ -9403,7 +9395,15 @@ static void md_start_sync(struct work_struct *ws)
94039395 goto not_running ;
94049396 }
94059397
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);
94079407 md_wakeup_thread (mddev -> sync_thread );
94089408 sysfs_notify_dirent_safe (mddev -> sysfs_action );
94099409 md_new_event ();
@@ -9415,7 +9415,15 @@ static void md_start_sync(struct work_struct *ws)
94159415 clear_bit (MD_RECOVERY_REQUESTED , & mddev -> recovery );
94169416 clear_bit (MD_RECOVERY_CHECK , & mddev -> recovery );
94179417 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);
94199427
94209428 wake_up (& resync_wait );
94219429 if (test_and_clear_bit (MD_RECOVERY_RECOVER , & mddev -> recovery ) &&
0 commit comments