|
@@ -514,7 +514,7 @@ static void ops_complete_biofill(void *stripe_head_ref)
|
|
|
struct stripe_head *sh = stripe_head_ref;
|
|
|
struct bio *return_bi = NULL;
|
|
|
raid5_conf_t *conf = sh->raid_conf;
|
|
|
- int i, more_to_read = 0;
|
|
|
+ int i;
|
|
|
|
|
|
pr_debug("%s: stripe %llu\n", __FUNCTION__,
|
|
|
(unsigned long long)sh->sector);
|
|
@@ -522,16 +522,14 @@ static void ops_complete_biofill(void *stripe_head_ref)
|
|
|
/* clear completed biofills */
|
|
|
for (i = sh->disks; i--; ) {
|
|
|
struct r5dev *dev = &sh->dev[i];
|
|
|
- /* check if this stripe has new incoming reads */
|
|
|
- if (dev->toread)
|
|
|
- more_to_read++;
|
|
|
|
|
|
/* acknowledge completion of a biofill operation */
|
|
|
- /* and check if we need to reply to a read request
|
|
|
- */
|
|
|
- if (test_bit(R5_Wantfill, &dev->flags) && !dev->toread) {
|
|
|
+ /* and check if we need to reply to a read request,
|
|
|
+ * new R5_Wantfill requests are held off until
|
|
|
+ * !test_bit(STRIPE_OP_BIOFILL, &sh->ops.pending)
|
|
|
+ */
|
|
|
+ if (test_and_clear_bit(R5_Wantfill, &dev->flags)) {
|
|
|
struct bio *rbi, *rbi2;
|
|
|
- clear_bit(R5_Wantfill, &dev->flags);
|
|
|
|
|
|
/* The access to dev->read is outside of the
|
|
|
* spin_lock_irq(&conf->device_lock), but is protected
|
|
@@ -558,8 +556,7 @@ static void ops_complete_biofill(void *stripe_head_ref)
|
|
|
|
|
|
return_io(return_bi);
|
|
|
|
|
|
- if (more_to_read)
|
|
|
- set_bit(STRIPE_HANDLE, &sh->state);
|
|
|
+ set_bit(STRIPE_HANDLE, &sh->state);
|
|
|
release_stripe(sh);
|
|
|
}
|
|
|
|