diff options
author | Shaohua Li <shli@fb.com> | 2016-03-14 14:49:32 -0400 |
---|---|---|
committer | Shaohua Li <shli@fb.com> | 2016-03-17 17:27:01 -0400 |
commit | 23ddba80ebe836476bb2fa1f5ef305dd1c63dc0b (patch) | |
tree | 087fe99d5d520c7caaeefaa9784329f720a41b0c /drivers/md | |
parent | ccfc7bf1f09d6190ef86693ddc761d5fe3fa47cb (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.c | 7 |
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)) { |