Commit b15a9dbd authored by NeilBrown's avatar NeilBrown

md/raid5: Ensure a batch member is not handled prematurely.

If a stripe is a member of a batch, but not the head, it must
not be handled separately from the rest of the batch.

'clear_batch_ready()' handles this requirement to some
extent but not completely.  If a member is passed to handle_stripe()
a second time it returns '0' indicating the stripe can be handled,
which is wrong.
So add an extra test.
Signed-off-by: default avatarNeilBrown <neilb@suse.de>
parent d0852df5
...@@ -4200,9 +4200,13 @@ static void analyse_stripe(struct stripe_head *sh, struct stripe_head_state *s) ...@@ -4200,9 +4200,13 @@ static void analyse_stripe(struct stripe_head *sh, struct stripe_head_state *s)
static int clear_batch_ready(struct stripe_head *sh) static int clear_batch_ready(struct stripe_head *sh)
{ {
/* Return '1' if this is a member of batch, or
* '0' if it is a lone stripe or a head which can now be
* handled.
*/
struct stripe_head *tmp; struct stripe_head *tmp;
if (!test_and_clear_bit(STRIPE_BATCH_READY, &sh->state)) if (!test_and_clear_bit(STRIPE_BATCH_READY, &sh->state))
return 0; return (sh->batch_head && sh->batch_head != sh);
spin_lock(&sh->stripe_lock); spin_lock(&sh->stripe_lock);
if (!sh->batch_head) { if (!sh->batch_head) {
spin_unlock(&sh->stripe_lock); spin_unlock(&sh->stripe_lock);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment