The patch titled md: Fix 'rdev->nr_pending' count when retrying barrier requests has been added to the -mm tree. Its filename is md-fix-rdev-nr_pending-count-when-retrying-barrier-requests.patch See http://www.zip.com.au/~akpm/linux/patches/stuff/added-to-mm.txt to find out what to do about this From: NeilBrown <neilb@xxxxxxx> When retrying a failed BIO_RW_BARRIER request, we need to keep the reference in ->nr_pending over the whole retry. Currently, we only hold the reference if the failed request is the *last* one to finish - which is silly, because it would normally be the first to finish. So move the rdev_dec_pending call up into the didn't-fail branch. As the rdev isn't used in the later code, calling rdev_dec_pending earlier doesn't hurt. Signed-off-by: Neil Brown <neilb@xxxxxxx> Signed-off-by: Andrew Morton <akpm@xxxxxxxx> --- drivers/md/raid1.c | 9 ++++----- 1 files changed, 4 insertions(+), 5 deletions(-) diff -puN drivers/md/raid1.c~md-fix-rdev-nr_pending-count-when-retrying-barrier-requests drivers/md/raid1.c --- 25/drivers/md/raid1.c~md-fix-rdev-nr_pending-count-when-retrying-barrier-requests Fri Apr 28 16:41:09 2006 +++ 25-akpm/drivers/md/raid1.c Fri Apr 28 16:41:09 2006 @@ -319,6 +319,7 @@ static int raid1_end_write_request(struc set_bit(BarriersNotsupp, &conf->mirrors[mirror].rdev->flags); set_bit(R1BIO_BarrierRetry, &r1_bio->state); r1_bio->mddev->barriers_work = 0; + /* Don't rdev_dec_pending in this branch - keep it for the retry */ } else { /* * this branch is our 'one mirror IO has finished' event handler: @@ -365,6 +366,7 @@ static int raid1_end_write_request(struc } } } + rdev_dec_pending(conf->mirrors[mirror].rdev, conf->mddev); } /* * @@ -374,11 +376,9 @@ static int raid1_end_write_request(struc if (atomic_dec_and_test(&r1_bio->remaining)) { if (test_bit(R1BIO_BarrierRetry, &r1_bio->state)) { reschedule_retry(r1_bio); - /* Don't dec_pending yet, we want to hold - * the reference over the retry - */ goto out; } + /* it really is the end of this request */ if (test_bit(R1BIO_BehindIO, &r1_bio->state)) { /* free extra copy of the data pages */ int i = bio->bi_vcnt; @@ -393,8 +393,6 @@ static int raid1_end_write_request(struc md_write_end(r1_bio->mddev); raid_end_bio_io(r1_bio); } - - rdev_dec_pending(conf->mirrors[mirror].rdev, conf->mddev); out: if (to_put) bio_put(to_put); @@ -1414,6 +1412,7 @@ static void raid1d(mddev_t *mddev) * Better resubmit without the barrier. * We know which devices to resubmit for, because * all others have had their bios[] entry cleared. + * We already have a nr_pending reference on these rdevs. */ int i; clear_bit(R1BIO_BarrierRetry, &r1_bio->state); _ Patches currently in -mm which might be from neilb@xxxxxxx are md-avoid-oops-when-attempting-to-fix-read-errors-on-raid10.patch md-fixed-refcounting-locking-when-attempting-read-error-correction-in-raid10.patch md-change-enotsupp-to-eopnotsupp.patch md-improve-detection-of-lack-of-barrier-support-in-raid1.patch md-fix-rdev-nr_pending-count-when-retrying-barrier-requests.patch fix-dcache-race-during-umount.patch fix-dcache-race-during-umount-fix.patch prune_one_dentry-tweaks.patch remove-softlockup-from-invalidate_mapping_pages.patch make-address_space_operations-invalidatepage-return-void-reiser4.patch md-dm-reduce-stack-usage-with-stacked-block-devices.patch - To unsubscribe from this list: send the line "unsubscribe mm-commits" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html