• NeilBrown's avatar
    md/raid1,raid10: use freeze_array in place of raise_barrier in various places. · e2d59925
    NeilBrown authored
    Various places in raid1 and raid10 are calling raise_barrier when they
    really should call freeze_array.
    The former is only intended to be called from "make_request".
    The later has extra checks for 'nr_queued' and makes a call to
    flush_pending_writes(), so it is safe to call it from within the
    management thread.
    
    Using raise_barrier will sometimes deadlock.  Using freeze_array
    should not.
    
    As 'freeze_array' currently expects one request to be pending (in
    handle_read_error - the only previous caller), we need to pass
    it the number of pending requests (extra) to ignore.
    
    The deadlock was made particularly noticeable by commits
    050b6615 (raid10) and 6b740b8d (raid1) which
    appeared in 3.4, so the fix is appropriate for any -stable
    kernel since then.
    
    This patch probably won't apply directly to some early kernels and
    will need to be applied by hand.
    
    Cc: stable@vger.kernel.org
    Reported-by: default avatarAlexander Lyakas <alex.bolshoy@gmail.com>
    Signed-off-by: default avatarNeilBrown <neilb@suse.de>
    e2d59925
raid10.c 131 KB