]> git.baikalelectronics.ru Git - kernel.git/commit
md/raid1: fix request counting bug in new 'barrier' code.
authorNeilBrown <neilb@suse.de>
Tue, 14 Jan 2014 00:56:14 +0000 (11:56 +1100)
committerNeilBrown <neilb@suse.de>
Tue, 14 Jan 2014 05:44:07 +0000 (16:44 +1100)
commitdf28afc53012c4284428a81fd0619a4e98acdfc2
treeee863ef2f3ad13a39b71b083b6e2a5617c518124
parentc291342e41d558b46088e53420d1bf4ac926740b
md/raid1: fix request counting bug in new 'barrier' code.

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: Bruno Wolff III <bruno@wolff.to>
URL: https://bugzilla.kernel.org/show_bug.cgi?id=68061
Fixes: e392bfc1d3ad94b1774445ed8d2d5cc893c0d378
Cc: majianpeng <majianpeng@gmail.com>
Signed-off-by: NeilBrown <neilb@suse.de>
drivers/md/raid1.c