diff options
author | Mike Snitzer <snitzer@redhat.com> | 2020-06-11 02:03:19 +0200 |
---|---|---|
committer | Mike Snitzer <snitzer@redhat.com> | 2020-07-13 17:47:32 +0200 |
commit | f45f11868e0efeccfc1c695e56864f9032f18bdc (patch) | |
tree | 547a610e94d10b3e451a81a91d7e4538e2c24cfd /drivers/md | |
parent | dm mpath: push locking down to must_push_back_rq() (diff) | |
download | linux-f45f11868e0efeccfc1c695e56864f9032f18bdc.tar.xz linux-f45f11868e0efeccfc1c695e56864f9032f18bdc.zip |
dm mpath: factor out multipath_queue_bio
Enables further cleanup.
Signed-off-by: Mike Snitzer <snitzer@redhat.com>
Diffstat (limited to 'drivers/md')
-rw-r--r-- | drivers/md/dm-mpath.c | 26 |
1 files changed, 14 insertions, 12 deletions
diff --git a/drivers/md/dm-mpath.c b/drivers/md/dm-mpath.c index 87b6a2c98c73..4b48183c6b5c 100644 --- a/drivers/md/dm-mpath.c +++ b/drivers/md/dm-mpath.c @@ -574,6 +574,18 @@ static void multipath_release_clone(struct request *clone, * Map cloned bios (bio-based multipath) */ +static void multipath_queue_bio(struct multipath *m, struct bio *bio) +{ + unsigned long flags; + + /* Queue for the daemon to resubmit */ + spin_lock_irqsave(&m->lock, flags); + bio_list_add(&m->queued_bios, bio); + if (!test_bit(MPATHF_QUEUE_IO, &m->flags)) + queue_work(kmultipathd, &m->process_queued_bios); + spin_unlock_irqrestore(&m->lock, flags); +} + static struct pgpath *__map_bio(struct multipath *m, struct bio *bio) { struct pgpath *pgpath; @@ -590,16 +602,11 @@ static struct pgpath *__map_bio(struct multipath *m, struct bio *bio) if ((pgpath && queue_io) || (!pgpath && test_bit(MPATHF_QUEUE_IF_NO_PATH, &m->flags))) { - /* Queue for the daemon to resubmit */ - spin_lock_irqsave(&m->lock, flags); - bio_list_add(&m->queued_bios, bio); - spin_unlock_irqrestore(&m->lock, flags); + multipath_queue_bio(m, bio); /* PG_INIT_REQUIRED cannot be set without QUEUE_IO */ if (queue_io || test_bit(MPATHF_PG_INIT_REQUIRED, &m->flags)) pg_init_all_paths(m); - else if (!queue_io) - queue_work(kmultipathd, &m->process_queued_bios); return ERR_PTR(-EAGAIN); } @@ -1678,12 +1685,7 @@ static int multipath_end_io_bio(struct dm_target *ti, struct bio *clone, spin_unlock_irqrestore(&m->lock, flags); } - spin_lock_irqsave(&m->lock, flags); - bio_list_add(&m->queued_bios, clone); - if (!test_bit(MPATHF_QUEUE_IO, &m->flags)) - queue_work(kmultipathd, &m->process_queued_bios); - spin_unlock_irqrestore(&m->lock, flags); - + multipath_queue_bio(m, clone); r = DM_ENDIO_INCOMPLETE; done: if (pgpath) { |