On Mon, 11 Jun 2012 11:23:56 +0800 majianpeng <majianpeng@xxxxxxxxx> wrote: > In ops_run_io(), if call md_wait_for_blocked_rdev which it dec > nr_pending, the rdev->nr_pending will dec again in else-statement. > So the nr_penging is error and we can't remove this device. > > Signed-off-by: majianpeng <majianpeng@xxxxxxxxx> > --- > drivers/md/raid5.c | 6 ++++++ > 1 files changed, 6 insertions(+), 0 deletions(-) > > diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c > index d267672..995b2de 100644 > --- a/drivers/md/raid5.c > +++ b/drivers/md/raid5.c > @@ -607,6 +607,12 @@ static void ops_run_io(struct stripe_head *sh, struct stripe_head_state *s) > md_check_recovery(conf->mddev); > } > md_wait_for_blocked_rdev(rdev, conf->mddev); > + /* > + * Because md_wait_for_blocked_rdev will dec > + * nr_pending,we must add.The real dec is in > + * else statement. > + */ > + atomic_inc(&rdev->nr_pending); > } else { > /* Acknowledged bad block - skip the write */ > rdev_dec_pending(rdev, conf->mddev); Thanks for catching this. I have moved the 'atomic_inc' to before 'md_wait_for_blocked_rdev' to make sure that the nr_pending count never goes to zero, and I tidied up the comment a little. Thanks, NeilBrown
Attachment:
signature.asc
Description: PGP signature