• NeilBrown's avatar
    md/raid1,raid10: fix deadlock with freeze_array() · 71192d46
    NeilBrown authored
    commit ee0b0244 upstream.
    
    When raid1/raid10 needs to fix a read error, it first drains
    all pending requests by calling freeze_array().
    This calls flush_pending_writes() if it needs to sleep,
    but some writes may be pending in a per-process plug rather
    than in the per-array request queue.
    
    When raid1{,0}_unplug() moves the request from the per-process
    plug to the per-array request queue (from which
    flush_pending_writes() can flush them), it needs to wake up
    freeze_array(), or freeze_array() will never flush them and so
    it will block forever.
    
    So add the requires wake_up() calls.
    
    This bug was introduced by commit
       f54a9d0e
    for raid1 and a similar commit for RAID10, and so has been present
    since linux-3.6.  As the bug causes a deadlock I believe this fix is
    suitable for -stable.
    Reported-by: default avatarTregaron Bayly <tbayly@bluehost.com>
    Tested-by: default avatarTregaron Bayly <tbayly@bluehost.com>
    Signed-off-by: default avatarNeilBrown <neilb@suse.de>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    71192d46
raid10.c 128 KB