From 2f98f3edfcfe8bb471f8f74b7fec7062e6864c32 Mon Sep 17 00:00:00 2001 From: Dan Williams Date: Mon, 24 Sep 2007 10:06:13 -0700 Subject: [PATCH] --- yaml --- r: 65125 b: refs/heads/master c: e4d84909dd48b5e5806a5d18b881e1ca1610ba9b h: refs/heads/master i: 65123: 9c17801a58704337dc0aa2d1fcd20a691be86297 v: v3 --- [refs] | 2 +- trunk/drivers/md/raid5.c | 17 +++++++---------- 2 files changed, 8 insertions(+), 11 deletions(-) diff --git a/[refs] b/[refs] index c6af0108eb1d..4244025232ec 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 6247cdc2cd334dad0ea5428245a7d8f4b075f21e +refs/heads/master: e4d84909dd48b5e5806a5d18b881e1ca1610ba9b diff --git a/trunk/drivers/md/raid5.c b/trunk/drivers/md/raid5.c index 4d63773ee73a..f96dea975fa5 100644 --- a/trunk/drivers/md/raid5.c +++ b/trunk/drivers/md/raid5.c @@ -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); }