@@ -2017,6 +2017,8 @@ static void md_update_sb(mddev_t * mddev, int force_change)
20172017 clear_bit (MD_CHANGE_PENDING , & mddev -> flags );
20182018 spin_unlock_irq (& mddev -> write_lock );
20192019 wake_up (& mddev -> sb_wait );
2020+ if (test_bit (MD_RECOVERY_RUNNING , & mddev -> recovery ))
2021+ sysfs_notify (& mddev -> kobj , NULL , "sync_completed" );
20202022
20212023}
20222024
@@ -2086,6 +2088,7 @@ state_store(mdk_rdev_t *rdev, const char *buf, size_t len)
20862088 * -writemostly - clears write_mostly
20872089 * blocked - sets the Blocked flag
20882090 * -blocked - clears the Blocked flag
2091+ * insync - sets Insync providing device isn't active
20892092 */
20902093 int err = - EINVAL ;
20912094 if (cmd_match (buf , "faulty" ) && rdev -> mddev -> pers ) {
@@ -2117,6 +2120,9 @@ state_store(mdk_rdev_t *rdev, const char *buf, size_t len)
21172120 set_bit (MD_RECOVERY_NEEDED , & rdev -> mddev -> recovery );
21182121 md_wakeup_thread (rdev -> mddev -> thread );
21192122
2123+ err = 0 ;
2124+ } else if (cmd_match (buf , "insync" ) && rdev -> raid_disk == -1 ) {
2125+ set_bit (In_sync , & rdev -> flags );
21202126 err = 0 ;
21212127 }
21222128 if (!err && rdev -> sysfs_state )
@@ -2190,7 +2196,7 @@ slot_store(mdk_rdev_t *rdev, const char *buf, size_t len)
21902196 } else if (rdev -> mddev -> pers ) {
21912197 mdk_rdev_t * rdev2 ;
21922198 /* Activating a spare .. or possibly reactivating
2193- * if we every get bitmaps working here.
2199+ * if we ever get bitmaps working here.
21942200 */
21952201
21962202 if (rdev -> raid_disk != -1 )
@@ -3482,12 +3488,15 @@ sync_completed_show(mddev_t *mddev, char *page)
34823488{
34833489 unsigned long max_sectors , resync ;
34843490
3491+ if (!test_bit (MD_RECOVERY_RUNNING , & mddev -> recovery ))
3492+ return sprintf (page , "none\n" );
3493+
34853494 if (test_bit (MD_RECOVERY_SYNC , & mddev -> recovery ))
34863495 max_sectors = mddev -> resync_max_sectors ;
34873496 else
34883497 max_sectors = mddev -> dev_sectors ;
34893498
3490- resync = ( mddev -> curr_resync - atomic_read ( & mddev -> recovery_active )) ;
3499+ resync = mddev -> curr_resync_completed ;
34913500 return sprintf (page , "%lu / %lu\n" , resync , max_sectors );
34923501}
34933502
@@ -6334,26 +6343,31 @@ void md_do_sync(mddev_t *mddev)
63346343 sector_t sectors ;
63356344
63366345 skipped = 0 ;
6337- if (j >= mddev -> resync_max ) {
6338- sysfs_notify (& mddev -> kobj , NULL , "sync_completed" );
6339- wait_event (mddev -> recovery_wait ,
6340- mddev -> resync_max > j
6341- || kthread_should_stop ());
6342- }
6343- if (kthread_should_stop ())
6344- goto interrupted ;
63456346
6346- if (mddev -> curr_resync > mddev -> curr_resync_completed &&
6347- (mddev -> curr_resync - mddev -> curr_resync_completed )
6348- > (max_sectors >> 4 )) {
6347+ if ((mddev -> curr_resync > mddev -> curr_resync_completed &&
6348+ (mddev -> curr_resync - mddev -> curr_resync_completed )
6349+ > (max_sectors >> 4 )) ||
6350+ (j - mddev -> curr_resync_completed )* 2
6351+ >= mddev -> resync_max - mddev -> curr_resync_completed
6352+ ) {
63496353 /* time to update curr_resync_completed */
63506354 blk_unplug (mddev -> queue );
63516355 wait_event (mddev -> recovery_wait ,
63526356 atomic_read (& mddev -> recovery_active ) == 0 );
63536357 mddev -> curr_resync_completed =
63546358 mddev -> curr_resync ;
63556359 set_bit (MD_CHANGE_CLEAN , & mddev -> flags );
6360+ sysfs_notify (& mddev -> kobj , NULL , "sync_completed" );
63566361 }
6362+
6363+ if (j >= mddev -> resync_max )
6364+ wait_event (mddev -> recovery_wait ,
6365+ mddev -> resync_max > j
6366+ || kthread_should_stop ());
6367+
6368+ if (kthread_should_stop ())
6369+ goto interrupted ;
6370+
63576371 sectors = mddev -> pers -> sync_request (mddev , j , & skipped ,
63586372 currspeed < speed_min (mddev ));
63596373 if (sectors == 0 ) {
@@ -6461,6 +6475,7 @@ void md_do_sync(mddev_t *mddev)
64616475
64626476 skip :
64636477 mddev -> curr_resync = 0 ;
6478+ mddev -> curr_resync_completed = 0 ;
64646479 mddev -> resync_min = 0 ;
64656480 mddev -> resync_max = MaxSector ;
64666481 sysfs_notify (& mddev -> kobj , NULL , "sync_completed" );
0 commit comments