aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/md
diff options
context:
space:
mode:
authorShaohua Li <shli@fb.com>2016-03-14 14:49:32 -0400
committerShaohua Li <shli@fb.com>2016-03-17 17:27:01 -0400
commit23ddba80ebe836476bb2fa1f5ef305dd1c63dc0b (patch)
tree087fe99d5d520c7caaeefaa9784329f720a41b0c /drivers/md
parentccfc7bf1f09d6190ef86693ddc761d5fe3fa47cb (diff)
raid10: include bio_end_io_list in nr_queued to prevent freeze_array hang
This is the raid10 counterpart of the bug fixed by Nate (raid1: include bio_end_io_list in nr_queued to prevent freeze_array hang) Fixes: 95af587e95(md/raid10: ensure device failure recorded before write request returns) Cc: stable@vger.kernel.org (V4.3+) Cc: Nate Dailey <nate.dailey@stratus.com> Signed-off-by: Shaohua Li <shli@fb.com>
Diffstat (limited to 'drivers/md')
-rw-r--r--drivers/md/raid10.c7
1 files changed, 5 insertions, 2 deletions
diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c
index 1c1447dd3417..e3fd725d5c4d 100644
--- a/drivers/md/raid10.c
+++ b/drivers/md/raid10.c
@@ -2664,6 +2664,7 @@ static void handle_write_completed(struct r10conf *conf, struct r10bio *r10_bio)
2664 if (fail) { 2664 if (fail) {
2665 spin_lock_irq(&conf->device_lock); 2665 spin_lock_irq(&conf->device_lock);
2666 list_add(&r10_bio->retry_list, &conf->bio_end_io_list); 2666 list_add(&r10_bio->retry_list, &conf->bio_end_io_list);
2667 conf->nr_queued++;
2667 spin_unlock_irq(&conf->device_lock); 2668 spin_unlock_irq(&conf->device_lock);
2668 md_wakeup_thread(conf->mddev->thread); 2669 md_wakeup_thread(conf->mddev->thread);
2669 } else { 2670 } else {
@@ -2691,8 +2692,10 @@ static void raid10d(struct md_thread *thread)
2691 LIST_HEAD(tmp); 2692 LIST_HEAD(tmp);
2692 spin_lock_irqsave(&conf->device_lock, flags); 2693 spin_lock_irqsave(&conf->device_lock, flags);
2693 if (!test_bit(MD_CHANGE_PENDING, &mddev->flags)) { 2694 if (!test_bit(MD_CHANGE_PENDING, &mddev->flags)) {
2694 list_add(&tmp, &conf->bio_end_io_list); 2695 while (!list_empty(&conf->bio_end_io_list)) {
2695 list_del_init(&conf->bio_end_io_list); 2696 list_move(conf->bio_end_io_list.prev, &tmp);
2697 conf->nr_queued--;
2698 }
2696 } 2699 }
2697 spin_unlock_irqrestore(&conf->device_lock, flags); 2700 spin_unlock_irqrestore(&conf->device_lock, flags);
2698 while (!list_empty(&tmp)) { 2701 while (!list_empty(&tmp)) {