raid5: fix clearing of biofill operations (try2)
PATCH 1/1 raid5: fix clearing of biofill operations (try2)
Neil,
The following patch fixes a case where STRIPE_OP_BIOFILL can be counted twice causing sh->ops.count to get out of sync thus triggering a BUG() statement. The patch applies cleanly on top of 2.6.23 and 2.6.24-rc.
--
Dan
---snip---
raid5: fix clearing of biofill operations (try2)
From: Dan Williams <[email protected]>
ops_complete_biofill() runs outside of spin_lock(&sh->lock) and clears the 'pending' and 'ack' bits. Since the test_and_ack_op() macro only checks against 'complete' it can get an inconsistent snapshot of pending work.
Move the clearing of these bits to handle_stripe5(), under the lock.
---
drivers/md/raid5.c | 17 ++++++++++++++--- 1 files changed, 14 insertions(+), 3 deletions(-)
drivers/md/raid5.c +14 -3
@@ -377,7 +377,12 @@ static unsigned long get_stripe_work(struct stripe_head *sh) ack++; sh->ops.count -= ack; -BUG_ON (sh->ops.count <0 ); +if (unlikely (sh->ops.count <0 )) { +printk (KERN_ERR "pending: %#lx ops.pending: %#lx ops.ack: %#lx " +"ops.complete: %#lx\n" , pending, sh->ops.pending, + sh->ops.ack, sh->ops.complete); +BUG (); + }return pending; }
@@ -551,8 +556,7 @@ static void ops_complete_biofill(void *stripe_head_ref) } } } -clear_bit (STRIPE_OP_BIOFILL , &sh->ops.ack); -clear_bit (STRIPE_OP_BIOFILL , &sh->ops.pending); +set_bit (STRIPE_OP_BIOFILL , &sh->ops.complete);return_io (return_bi);
@@ -2630,6 +2634,13 @@ static void handle_stripe5(struct stripe_head *sh) s.expanded =test_bit (STRIPE_EXPAND_READY , &sh->state);/* Now to look around and see what can be done */ +/* clean-up completed biofill operations */ +if (test_bit (STRIPE_OP_BIOFILL , &sh->ops.complete)) { +clear_bit (STRIPE_OP_BIOFILL , &sh->ops.pending); +clear_bit (STRIPE_OP_BIOFILL , &sh->ops.ack); +clear_bit (STRIPE_OP_BIOFILL , &sh->ops.complete); + } +rcu_read_lock ();for (i=disks; i--; ) {mdk_rdev_t *rdev;
-
To unsubscribe from this list: send the line "unsubscribe linux-raid" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html