Skip to contentSkip to conversation

md/raid5:When exec md_wait_for_blocked_rdev in ops_run_io,we must atomic_inc(&rdev->nr_pending).

PATCH In review majianpeng 2 participants 2 messages Jun 11, 2012 – Jun 27, 2012 MD RAID

lore
Share & tools
lore

majianpeng

author
#0 lore raw

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
index d267672..995b2de 100644
@@ -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
#1 lore raw
Quoted 16 lines · On Mon, 11 Jun 2012 11:23:56 +0800 majianpeng <[email protected]> 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.

---
 drivers/md/raid5.c |    6 ++++++
 1 files changed, 6 insertions(+), 0 deletions(-)
drivers/md/raid5.c +0 -0
index d267672..995b2de 100644
@@ -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 -0
 				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