• NeilBrown's avatar
    md: fix up plugging (again). · b357f04a
    NeilBrown authored
    The value returned by "mddev_check_plug" is only valid until the
    next 'schedule' as that will unplug things.  This could happen at any
    call to mempool_alloc.
    So just calling mddev_check_plug at the start doesn't really make
    sense.
    
    So call it just before, or just after, queuing things for the thread.
    As the action that happens at unplug is to wake the thread, this makes
    lots of sense.
    If we cannot add a plug (which requires a small GFP_ATOMIC alloc) we
    wake thread immediately.
    
    RAID5 is a bit different.  Requests are queued for the thread and the
    thread is woken by release_stripe.  So we don't need to wake the
    thread on failure.
    However the thread doesn't perform certain actions when there is any
    active plug, so it is important to install a plug before waking the
    thread.  So for RAID5 we install the plug *before* queuing the request
    and waking the thread.
    
    Without this patch it is possible for raid1 or raid10 to queue a
    request without then waking the thread, resulting in the array locking
    up.
    
    Also change raid10 to only flush_pending_write when there are not
    active plugs, just like raid1.
    
    This patch is suitable for 3.0 or later.  I plan to submit it to
    -stable, but I'll like to let it spend a few weeks in mainline
    first to be sure it is completely safe.
    Signed-off-by: default avatarNeilBrown <neilb@suse.de>
    b357f04a
raid5.c 172 KB