Skip to content
  • Jonathan Brassow's avatar
    dm raid: fix incorrect status output at the end of a "recover" process · 41dcf197
    Jonathan Brassow authored
    
    
    There are three important fields that indicate the overall health and
    status of an array: dev_health, sync_ratio, and sync_action.  They tell
    us the condition of the devices in the array, and the degree to which
    the array is synchronized.
    
    This commit fixes a condition that is reported incorrectly.  When a member
    of the array is being rebuilt or a new device is added, the "recover"
    process is used to synchronize it with the rest of the array.  When the
    process is complete, but the sync thread hasn't yet been reaped, it is
    possible for the state of MD to be:
     mddev->recovery = [ MD_RECOVERY_RUNNING MD_RECOVERY_RECOVER MD_RECOVERY_DONE ]
     curr_resync_completed = <max dev size> (but not MaxSector)
     and all rdevs to be In_sync.
    This causes the 'array_in_sync' output parameter that is passed to
    rs_get_progress() to be computed incorrectly and reported as 'false' --
    or not in-sync.  This in turn causes the dev_health status characters to
    be reported as all 'a', rather than the proper 'A'.
    
    This can cause erroneous output for several seconds at a time when tools
    will want to be checking the condition due to events that are raised at
    the end of a sync process.  Fix this by properly calculating the
    'array_in_sync' return parameter in rs_get_progress().
    
    Also, remove an unnecessary intermediate 'recovery_cp' variable in
    rs_get_progress().
    
    Signed-off-by: default avatarJonathan Brassow <jbrassow@redhat.com>
    Signed-off-by: default avatarMike Snitzer <snitzer@redhat.com>
    41dcf197