• NeilBrown's avatar
    md/raid1: fix request counting bug in new 'barrier' code. · 41a336e0
    NeilBrown authored
    The new iobarrier implementation in raid1 (which keeps normal writes
    and resync activity separate) counts every request what is not before
    the current resync point in either next_window_requests or
    current_window_requests.
    It flags that the request is counted by setting ->start_next_window.
    
    allow_barrier follows this model exactly and decrements one of the
    *_window_requests if and only if ->start_next_window is set.
    
    However wait_barrier(), which increments *_window_requests uses a
    slightly different test for setting -.start_next_window (which is set
    from the return value of this function).
    So there is a possibility of the counts getting out of sync, and this
    leads to the resync hanging.
    
    So change wait_barrier() to return a non-zero value in exactly the
    same cases that it increments *_window_requests.
    
    But was introduced in 3.13-rc1.
    Reported-by: default avatarBruno Wolff III <bruno@wolff.to>
    URL: https://bugzilla.kernel.org/show_bug.cgi?id=68061
    Fixes: 79ef3a8a
    Cc: majianpeng <majianpeng@gmail.com>
    Signed-off-by: default avatarNeilBrown <neilb@suse.de>
    41a336e0
raid1.c 86.1 KB