• NeilBrown's avatar
    md/raid1: extend spinlock to protect raid1_end_read_request against inconsistencies · 2411ca5d
    NeilBrown authored
    commit 423f04d6 upstream.
    
    raid1_end_read_request() assumes that the In_sync bits are consistent
    with the ->degaded count.
    raid1_spare_active updates the In_sync bit before the ->degraded count
    and so exposes an inconsistency, as does error()
    So extend the spinlock in raid1_spare_active() and error() to hide those
    inconsistencies.
    
    This should probably be part of
      Commit: 34cab6f4 ("md/raid1: fix test for 'was read error from
      last working device'.")
    as it addresses the same issue.  It fixes the same bug and should go
    to -stable for same reasons.
    
    Fixes: 76073054 ("md/raid1: clean up read_balance.")
    Signed-off-by: default avatarNeilBrown <neilb@suse.com>
    [lizf: Backported to 3.4: adjust context]
    Signed-off-by: default avatarZefan Li <lizefan@huawei.com>
    2411ca5d
raid1.c 79.3 KB