mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-06-23 23:21:46 +00:00
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: NeilBrown <neilb@suse.de>
This commit is contained in:
parent
d0852df543
commit
b15a9dbdbf
1 changed files with 5 additions and 1 deletions
|
@ -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);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue