md/raid5:When exec md_wait_for_blocked_rdev in ops_run_io,we must atomic_inc(&rdev->nr_pending).
PATCH 1/1 md/raid5:When exec md_wait_for_blocked_rdev in ops_run_io,we must atomic_inc(&rdev->nr_pending).
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.
--- drivers/md/raid5.c | 6 ++++++ 1 files changed, 6 insertions(+), 0 deletions(-)
drivers/md/raid5.c +6 -0
@@ -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);
Signature · 6 lines
1.7.5.4 -------------- majianpeng
Quoted 16 lines · On Mon, 11 Jun 2012 11:23:56 +0800 majianpeng <[email protected]> wrote:
In
ops_run_io(), if callmd_wait_for_blocked_rdevwhich it decnr_pending, therdev->nr_pendingwill dec again in else-statement. So thenr_pengingis error and we can't remove this device.Signed-off-by majianpeng <[email protected]>--- drivers/md/raid5.c | 6 ++++++ 1 files changed, 6 insertions(+), 0 deletions(-)drivers/md/raid5.c +0
-0@@ -607,6 +607,12 @@ static void ops_run_io(struct stripe_head *sh, struct stripe_head_state *s)md_check_recovery (conf->mddev); }
drivers/md/raid5.c static void ops_run_io(struct stripe_head *sh, struct stripe_head_state *s) · line 618
Quoted 10 lines
drivers/md/raid5.c +6
-0md_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