• Mariusz Tkaczyk's avatar
    md: Set MD_BROKEN for RAID1 and RAID10 · 9631abdb
    Mariusz Tkaczyk authored
    There is no direct mechanism to determine raid failure outside
    personality. It is done by checking rdev->flags after executing
    md_error(). If "faulty" flag is not set then -EBUSY is returned to
    userspace. -EBUSY means that array will be failed after drive removal.
    
    Mdadm has special routine to handle the array failure and it is executed
    if -EBUSY is returned by md.
    
    There are at least two known reasons to not consider this mechanism
    as correct:
    1. drive can be removed even if array will be failed[1].
    2. -EBUSY seems to be wrong status. Array is not busy, but removal
       process cannot proceed safe.
    
    -EBUSY expectation cannot be removed without breaking compatibility
    with userspace. In this patch first issue is resolved by adding support
    for MD_BROKEN flag for RAID1 and RAID10. Support for RAID456 is added in
    next commit.
    
    The idea is to set the MD_BROKEN if we are sure that raid is in failed
    state now. This is done in each error_handler(). In md_error() MD_BROKEN
    flag is checked. If is set, then -EBUSY is returned to userspace.
    
    As in previous commit, it causes that #mdadm --set-faulty is able to
    fail array. Previously proposed workaround is valid if optional
    functionality[1] is disabled.
    
    [1] commit 9a567843("md: allow last device to be forcibly removed from
        RAID1/RAID10.")
    Reviewd-by: default avatarXiao Ni <xni@redhat.com>
    Signed-off-by: default avatarMariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
    Signed-off-by: default avatarSong Liu <song@kernel.org>
    9631abdb
raid10.c 145 KB