md/raid5: close race between STRIPE_BIT_DELAY and batching.
authorNeilBrown <neilb@suse.de>
Tue, 26 May 2015 22:43:45 +0000 (08:43 +1000)
committerNeilBrown <neilb@suse.de>
Thu, 28 May 2015 01:34:40 +0000 (11:34 +1000)
commitd0852df543e5aa7db34c1ad26d053782bcbf48f1
tree0276829b09beb6d16a4349afe2c75b3eaed80d47
parent2b6b24574256c05be145936f1493aec74c6904e5
md/raid5: close race between STRIPE_BIT_DELAY and batching.

When we add a write to a stripe we need to make sure the bitmap
bit is set.  While doing that the stripe is not locked so it could
be added to a batch after which further changes to STRIPE_BIT_DELAY
and ->bm_seq are ineffective.

So we need to hold off adding to a stripe until bitmap_startwrite has
completed at least once, and we need to avoid further changes to
STRIPE_BIT_DELAY once the stripe has been added to a batch.

If a bitmap_startwrite() completes after the stripe was added to a
batch, it will not have set the bit, only incremented a counter, so no
extra delay of the stripe is needed.

Reported-by: Shaohua Li <shli@kernel.org>
Signed-off-by: NeilBrown <neilb@suse.de>
drivers/md/raid5.c
drivers/md/raid5.h