• NeilBrown's avatar
    md/raid1: add failfast handling for reads. · 2e52d449
    NeilBrown authored
    If a device is marked FailFast and it is not the only device
    we can read from, we mark the bio with REQ_FAILFAST_* flags.
    
    If this does fail, we don't try read repair but just allow
    failure.  If it was the last device it doesn't fail of
    course, so the retry happens on the same device - this time
    without FAILFAST.  A subsequent failure will not retry but
    will just pass up the error.
    
    During resync we may use FAILFAST requests and on a failure
    we will simply use the other device(s).
    
    During recovery we will only use FAILFAST in the unusual
    case were there are multiple places to read from - i.e. if
    there are > 2 devices.  If we get a failure we will fail the
    device and complete the resync/recovery with remaining
    devices.
    
    The new R1BIO_FailFast flag is set on read reqest to suggest
    the a FAILFAST request might be acceptable.  The rdev needs
    to have FailFast set as well for the read to actually use
    REQ_FAILFAST_*.
    
    We need to know there are at least two working devices
    before we can set R1BIO_FailFast, so we mustn't stop looking
    at the first device we find.  So the "min_pending == 0"
    handling to not exit early, but too always choose the
    best_pending_disk if min_pending == 0.
    
    The spinlocked region in raid1_error() in enlarged to ensure
    that if two bios, reading from two different devices, fail
    at the same time, then there is no risk that both devices
    will be marked faulty, leaving zero "In_sync" devices.
    Signed-off-by: default avatarNeilBrown <neilb@suse.com>
    Signed-off-by: default avatarShaohua Li <shli@fb.com>
    2e52d449
raid1.c 89.3 KB