@ -2136,16 +2136,6 @@ static void sync_sbs(mddev_t * mddev, int nospares)
* with the rest of the array )
*/
mdk_rdev_t * rdev ;
/* First make sure individual recovery_offsets are correct */
list_for_each_entry ( rdev , & mddev - > disks , same_set ) {
if ( rdev - > raid_disk > = 0 & &
mddev - > delta_disks > = 0 & &
! test_bit ( In_sync , & rdev - > flags ) & &
mddev - > curr_resync_completed > rdev - > recovery_offset )
rdev - > recovery_offset = mddev - > curr_resync_completed ;
}
list_for_each_entry ( rdev , & mddev - > disks , same_set ) {
if ( rdev - > sb_events = = mddev - > events | |
( nospares & &
@ -2167,12 +2157,27 @@ static void md_update_sb(mddev_t * mddev, int force_change)
int sync_req ;
int nospares = 0 ;
mddev - > utime = get_seconds ( ) ;
if ( mddev - > external )
return ;
repeat :
/* First make sure individual recovery_offsets are correct */
list_for_each_entry ( rdev , & mddev - > disks , same_set ) {
if ( rdev - > raid_disk > = 0 & &
mddev - > delta_disks > = 0 & &
! test_bit ( In_sync , & rdev - > flags ) & &
mddev - > curr_resync_completed > rdev - > recovery_offset )
rdev - > recovery_offset = mddev - > curr_resync_completed ;
}
if ( mddev - > external | | ! mddev - > persistent ) {
clear_bit ( MD_CHANGE_DEVS , & mddev - > flags ) ;
clear_bit ( MD_CHANGE_CLEAN , & mddev - > flags ) ;
wake_up ( & mddev - > sb_wait ) ;
return ;
}
spin_lock_irq ( & mddev - > write_lock ) ;
mddev - > utime = get_seconds ( ) ;
set_bit ( MD_CHANGE_PENDING , & mddev - > flags ) ;
if ( test_and_clear_bit ( MD_CHANGE_DEVS , & mddev - > flags ) )
force_change = 1 ;
@ -2221,19 +2226,6 @@ repeat:
MD_BUG ( ) ;
mddev - > events - - ;
}
/*
* do not write anything to disk if using
* nonpersistent superblocks
*/
if ( ! mddev - > persistent ) {
if ( ! mddev - > external )
clear_bit ( MD_CHANGE_PENDING , & mddev - > flags ) ;
spin_unlock_irq ( & mddev - > write_lock ) ;
wake_up ( & mddev - > sb_wait ) ;
return ;
}
sync_sbs ( mddev , nospares ) ;
spin_unlock_irq ( & mddev - > write_lock ) ;