• NeilBrown's avatar
    md: restart recovery cleanly after device failure. · dfc70645
    NeilBrown authored
    When we get any IO error during a recovery (rebuilding a spare), we abort
    the recovery and restart it.
    
    For RAID6 (and multi-drive RAID1) it may not be best to restart at the
    beginning: when multiple failures can be tolerated, the recovery may be
    able to continue and re-doing all that has already been done doesn't make
    sense.
    
    We already have the infrastructure to record where a recovery is up to
    and restart from there, but it is not being used properly.
    This is because:
      - We sometimes abort with MD_RECOVERY_ERR rather than just MD_RECOVERY_INTR,
        which causes the recovery not be be checkpointed.
      - We remove spares and then re-added them which loses important state
        information.
    
    The distinction between MD_RECOVERY_ERR and MD_RECOVERY_INTR really isn't
    needed.  If there is an error, the relevant drive will be marked as
    Faulty, and that is enough to ensure correct handling of the error.  So we
    first remove MD_RECOVERY_ERR, changing some of the uses of it to
    MD_RECOVERY_INTR.
    
    Then we cause the attempt to remove a non-faulty device from an array to
    fail (unless recovery is impossible as the array is too degraded).  Then
    when remove_and_add_spares attempts to remove the devices on which
    recovery can continue, it will fail, they will remain in place, and
    recovery will continue on them as desired.
    
    Issue:  If we are halfway through rebuilding a spare and another drive
    fails, and a new spare is immediately available,  do we want to:
     1/ complete the current rebuild, then go back and rebuild the new spare or
     2/ restart the rebuild from the start and rebuild both devices in
        parallel.
    
    Both options can be argued for.  The code currently takes option 2 as
      a/ this requires least code change
      b/ this results in a minimally-degraded array in minimal time.
    
    Cc: "Eivind Sarto" <ivan@kasenna.com>
    Signed-off-by: default avatarNeil Brown <neilb@suse.de>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    dfc70645
raid1.c 59.5 KB