Patch "md: separate request handling" has been added to the 4.13-stable tree
Subsystems (2)
This is a note to let you know that I've just added the patch titled
md: separate request handling
to the 4.13-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
md-separate-request-handling.patch
and it can be found in the queue-4.13 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
393debc23c7820211d1c8253dd6a8408a7628fe7Mon Sep 17 00:00:00 2001
From: Shaohua Li <[email protected]>
Date: Thu, 21 Sep 2017 10:23:35 -0700
Subject: md: separate request handling
From: Shaohua Li <[email protected]>
commit 393debc23c7820211d1c8253dd6a8408a7628fe7 upstream.
With commit cc27b0c78c79, pers->make_request could bail out without handling the bio. If that happens, we should retry. The commit fixes md_make_request but not other call sites. Separate the request handling part, so other call sites can use it.
Fix: cc27b0c78c79(md: fix deadlock between mddev_suspend() and md_write_start())
--- drivers/md/md.c | 58 +++++++++++++++++++++++++++++++------------------------- drivers/md/md.h | 1 2 files changed, 34 insertions(+), 25 deletions(-)
drivers/md/md.c +33 -25
@@ -266,6 +266,37 @@ static DEFINE_SPINLOCK(all_mddevs_lock);* call has finished, the bio has been linked into some internal structure * and so is visible to ->quiesce(), so we don't need the refcount any more. */ +void md_handle_request (struct mddev *mddev,struct bio *bio) +{ +check_suspended: +rcu_read_lock (); +if (mddev->suspended) { +DEFINE_WAIT (__wait); +for (;;) { +prepare_to_wait (&mddev->sb_wait, &__wait, +TASK_UNINTERRUPTIBLE ); +if (!mddev->suspended) +break ; +rcu_read_unlock (); +schedule (); +rcu_read_lock (); + } +finish_wait (&mddev->sb_wait, &__wait); + } +atomic_inc (&mddev->active_io); +rcu_read_unlock (); + +if (!mddev->pers->make_request (mddev, bio)) { +atomic_dec (&mddev->active_io); +wake_up (&mddev->sb_wait); + goto check_suspended; + } + +if (atomic_dec_and_test (&mddev->active_io) && mddev->suspended) +wake_up (&mddev->sb_wait); +} +EXPORT_SYMBOL (md_handle_request); +static blk_qc_t md_make_request (struct request_queue *q,struct bio *bio) {const int rw =bio_data_dir (bio);
@@ -285,23 +316,6 @@ static blk_qc_t md_make_request(struct rbio_endio (bio);return BLK_QC_T_NONE ; } -check_suspended: -rcu_read_lock (); -if (mddev->suspended) { -DEFINE_WAIT (__wait); -for (;;) { -prepare_to_wait (&mddev->sb_wait, &__wait, -TASK_UNINTERRUPTIBLE ); -if (!mddev->suspended) -break ; -rcu_read_unlock (); -schedule (); -rcu_read_lock (); - } -finish_wait (&mddev->sb_wait, &__wait); - } -atomic_inc (&mddev->active_io); -rcu_read_unlock ();/* * save the sectors now since our bio can
@@ -310,20 +324,14 @@ check_suspended: sectors =bio_sectors (bio);/* bio could be mergeable after passing to underlayer */ bio->bi_opf &= ~REQ_NOMERGE ; -if (!mddev->pers->make_request (mddev, bio)) { -atomic_dec (&mddev->active_io); -wake_up (&mddev->sb_wait); - goto check_suspended; - } + +md_handle_request (mddev, bio); cpu =part_stat_lock ();part_stat_inc (cpu, &mddev->gendisk->part0, ios[rw]);part_stat_add (cpu, &mddev->gendisk->part0, sectors[rw], sectors);part_stat_unlock (); -if (atomic_dec_and_test (&mddev->active_io) && mddev->suspended) -wake_up (&mddev->sb_wait); -return BLK_QC_T_NONE ; }
drivers/md/md.h +1 -0
@@ -686,6 +686,7 @@ extern void md_stop_writes(struct mddevextern int md_rdev_init (struct md_rdev *rdev);extern void md_rdev_clear (struct md_rdev *rdev); +extern void md_handle_request (struct mddev *mddev,struct bio *bio);extern void mddev_suspend (struct mddev *mddev);extern void mddev_resume (struct mddev *mddev); extern struct bio *bio_alloc_mddev(gfp_t gfp_mask, int nr_iovecs,
Patches currently in stable-queue which might be from [email protected] are
queue-4.13/md-separate-request-handling.patch queue-4.13/md-raid5-preserve-stripe_on_unplug_list-in-break_stripe_batch_list.patch queue-4.13/md-fix-a-race-condition-for-flush-request-handling.patch queue-4.13/md-raid5-fix-a-race-condition-in-stripe-batch.patch