@@ -579,8 +579,12 @@ static void submit_flushes(struct work_struct *ws)
579579 rcu_read_lock ();
580580 }
581581 rcu_read_unlock ();
582- if (atomic_dec_and_test (& mddev -> flush_pending ))
582+ if (atomic_dec_and_test (& mddev -> flush_pending )) {
583+ /* The pair is percpu_ref_get() from md_flush_request() */
584+ percpu_ref_put (& mddev -> active_io );
585+
583586 queue_work (md_wq , & mddev -> flush_work );
587+ }
584588}
585589
586590static void md_submit_flush_data (struct work_struct * ws )
@@ -8788,12 +8792,16 @@ void md_do_sync(struct md_thread *thread)
87888792 int ret ;
87898793
87908794 /* just incase thread restarts... */
8791- if (test_bit (MD_RECOVERY_DONE , & mddev -> recovery ) ||
8792- test_bit (MD_RECOVERY_WAIT , & mddev -> recovery ))
8795+ if (test_bit (MD_RECOVERY_DONE , & mddev -> recovery ))
87938796 return ;
8794- if (!md_is_rdwr (mddev )) {/* never try to sync a read-only array */
8797+
8798+ if (test_bit (MD_RECOVERY_INTR , & mddev -> recovery ))
8799+ goto skip ;
8800+
8801+ if (test_bit (MD_RECOVERY_WAIT , & mddev -> recovery ) ||
8802+ !md_is_rdwr (mddev )) {/* never try to sync a read-only array */
87958803 set_bit (MD_RECOVERY_INTR , & mddev -> recovery );
8796- return ;
8804+ goto skip ;
87978805 }
87988806
87998807 if (mddev_is_clustered (mddev )) {
@@ -9368,13 +9376,19 @@ static void md_start_sync(struct work_struct *ws)
93689376 struct mddev * mddev = container_of (ws , struct mddev , sync_work );
93699377 int spares = 0 ;
93709378 bool suspend = false;
9379+ char * name ;
93719380
9372- if (md_spares_need_change (mddev ))
9381+ /*
9382+ * If reshape is still in progress, spares won't be added or removed
9383+ * from conf until reshape is done.
9384+ */
9385+ if (mddev -> reshape_position == MaxSector &&
9386+ md_spares_need_change (mddev )) {
93739387 suspend = true;
9388+ mddev_suspend (mddev , false);
9389+ }
93749390
9375- suspend ? mddev_suspend_and_lock_nointr (mddev ) :
9376- mddev_lock_nointr (mddev );
9377-
9391+ mddev_lock_nointr (mddev );
93789392 if (!md_is_rdwr (mddev )) {
93799393 /*
93809394 * On a read-only array we can:
@@ -9400,8 +9414,10 @@ static void md_start_sync(struct work_struct *ws)
94009414 if (spares )
94019415 md_bitmap_write_all (mddev -> bitmap );
94029416
9417+ name = test_bit (MD_RECOVERY_RESHAPE , & mddev -> recovery ) ?
9418+ "reshape" : "resync" ;
94039419 rcu_assign_pointer (mddev -> sync_thread ,
9404- md_register_thread (md_do_sync , mddev , "resync" ));
9420+ md_register_thread (md_do_sync , mddev , name ));
94059421 if (!mddev -> sync_thread ) {
94069422 pr_warn ("%s: could not start resync thread...\n" ,
94079423 mdname (mddev ));
@@ -9445,6 +9461,20 @@ static void md_start_sync(struct work_struct *ws)
94459461 sysfs_notify_dirent_safe (mddev -> sysfs_action );
94469462}
94479463
9464+ static void unregister_sync_thread (struct mddev * mddev )
9465+ {
9466+ if (!test_bit (MD_RECOVERY_DONE , & mddev -> recovery )) {
9467+ /* resync/recovery still happening */
9468+ clear_bit (MD_RECOVERY_NEEDED , & mddev -> recovery );
9469+ return ;
9470+ }
9471+
9472+ if (WARN_ON_ONCE (!mddev -> sync_thread ))
9473+ return ;
9474+
9475+ md_reap_sync_thread (mddev );
9476+ }
9477+
94489478/*
94499479 * This routine is regularly called by all per-raid-array threads to
94509480 * deal with generic issues like resync and super-block update.
@@ -9469,9 +9499,6 @@ static void md_start_sync(struct work_struct *ws)
94699499 */
94709500void md_check_recovery (struct mddev * mddev )
94719501{
9472- if (READ_ONCE (mddev -> suspended ))
9473- return ;
9474-
94759502 if (mddev -> bitmap )
94769503 md_bitmap_daemon_work (mddev );
94779504
@@ -9485,7 +9512,8 @@ void md_check_recovery(struct mddev *mddev)
94859512 }
94869513
94879514 if (!md_is_rdwr (mddev ) &&
9488- !test_bit (MD_RECOVERY_NEEDED , & mddev -> recovery ))
9515+ !test_bit (MD_RECOVERY_NEEDED , & mddev -> recovery ) &&
9516+ !test_bit (MD_RECOVERY_DONE , & mddev -> recovery ))
94899517 return ;
94909518 if ( ! (
94919519 (mddev -> sb_flags & ~ (1 <<MD_SB_CHANGE_PENDING )) ||
@@ -9507,8 +9535,7 @@ void md_check_recovery(struct mddev *mddev)
95079535 struct md_rdev * rdev ;
95089536
95099537 if (test_bit (MD_RECOVERY_RUNNING , & mddev -> recovery )) {
9510- /* sync_work already queued. */
9511- clear_bit (MD_RECOVERY_NEEDED , & mddev -> recovery );
9538+ unregister_sync_thread (mddev );
95129539 goto unlock ;
95139540 }
95149541
@@ -9571,16 +9598,7 @@ void md_check_recovery(struct mddev *mddev)
95719598 * still set.
95729599 */
95739600 if (test_bit (MD_RECOVERY_RUNNING , & mddev -> recovery )) {
9574- if (!test_bit (MD_RECOVERY_DONE , & mddev -> recovery )) {
9575- /* resync/recovery still happening */
9576- clear_bit (MD_RECOVERY_NEEDED , & mddev -> recovery );
9577- goto unlock ;
9578- }
9579-
9580- if (WARN_ON_ONCE (!mddev -> sync_thread ))
9581- goto unlock ;
9582-
9583- md_reap_sync_thread (mddev );
9601+ unregister_sync_thread (mddev );
95849602 goto unlock ;
95859603 }
95869604
0 commit comments