From: Nilay Shroff <nilay@linux.ibm.com>
To: John Garry <john.g.garry@oracle.com>,
hch@lst.de, kbusch@kernel.org, sagi@grimberg.me, axboe@fb.com,
martin.petersen@oracle.com,
james.bottomley@hansenpartnership.com, hare@suse.com
Cc: jmeneghi@redhat.com, linux-nvme@lists.infradead.org,
linux-scsi@vger.kernel.org, michael.christie@oracle.com,
snitzer@kernel.org, bmarzins@redhat.com,
dm-devel@lists.linux.dev, linux-block@vger.kernel.org,
linux-kernel@vger.kernel.org
Subject: Re: [PATCH 04/13] libmultipath: Add bio handling
Date: Mon, 2 Mar 2026 18:09:38 +0530 [thread overview]
Message-ID: <a6ffe0f5-7ec3-423c-8702-cf4248fdc168@linux.ibm.com> (raw)
In-Reply-To: <20260225153225.1031169-5-john.g.garry@oracle.com>
On 2/25/26 9:02 PM, John Garry wrote:
> Add support to submit a bio per-path. In addition, for failover, add
> support to requeue a failed bio.
>
> NVMe has almost like-for-like equivalents here:
> - nvme_available_path() -> mpath_available_path()
> - nvme_requeue_work() -> mpath_requeue_work()
> - nvme_ns_head_submit_bio() -> mpath_bdev_submit_bio()
>
> For failover, a driver may want to re-submit a bio, so add support to
> clone a bio prior to submission.
>
> A bio which is submitted to a per-path device has flag REQ_MPATH set,
> same as what is done for NVMe with REQ_NVME_MPATH.
>
> Signed-off-by: John Garry<john.g.garry@oracle.com>
> ---
> include/linux/multipath.h | 15 +++++++
> lib/multipath.c | 92 ++++++++++++++++++++++++++++++++++++++-
> 2 files changed, 106 insertions(+), 1 deletion(-)
>
> diff --git a/include/linux/multipath.h b/include/linux/multipath.h
> index c964a1aba9c42..d557fb9bab4c9 100644
> --- a/include/linux/multipath.h
> +++ b/include/linux/multipath.h
> @@ -3,6 +3,7 @@
> #define _LIBMULTIPATH_H
>
> #include <linux/blkdev.h>
> +#include <linux/blk-mq.h>
> #include <linux/srcu.h>
>
> extern const struct block_device_operations mpath_ops;
> @@ -40,10 +41,12 @@ struct mpath_device {
> };
>
> struct mpath_head_template {
> + bool (*available_path)(struct mpath_device *, bool *);
> bool (*is_disabled)(struct mpath_device *);
> bool (*is_optimized)(struct mpath_device *);
> enum mpath_access_state (*get_access_state)(struct mpath_device *);
> enum mpath_iopolicy_e (*get_iopolicy)(struct mpath_head *);
> + struct bio *(*clone_bio)(struct bio *);
> const struct attribute_group **device_groups;
> };
>
> @@ -56,12 +59,23 @@ struct mpath_head {
>
> struct kref ref;
>
> + struct bio_list requeue_list; /* list for requeing bio */
> + spinlock_t requeue_lock;
> + struct work_struct requeue_work; /* work struct for requeue */
> +
> unsigned long flags;
> struct mpath_device __rcu *current_path[MAX_NUMNODES];
> const struct mpath_head_template *mpdt;
> void *drvdata;
> };
>
> +#define REQ_MPATH REQ_DRV
> +
> +static inline bool is_mpath_request(struct request *req)
> +{
> + return req->cmd_flags & REQ_MPATH;
> +}
> +
> static inline struct mpath_disk *mpath_bd_device_to_disk(struct device *dev)
> {
> return dev_get_drvdata(dev);
> @@ -82,6 +96,7 @@ int mpath_set_iopolicy(const char *val, int *iopolicy);
> int mpath_get_iopolicy(char *buf, int iopolicy);
> int mpath_get_head(struct mpath_head *mpath_head);
> void mpath_put_head(struct mpath_head *mpath_head);
> +void mpath_requeue_work(struct work_struct *work);
> struct mpath_head *mpath_alloc_head(void);
> void mpath_put_disk(struct mpath_disk *mpath_disk);
> void mpath_remove_disk(struct mpath_disk *mpath_disk);
> diff --git a/lib/multipath.c b/lib/multipath.c
> index 65a0d2d2bf524..b494b35e8dccc 100644
> --- a/lib/multipath.c
> +++ b/lib/multipath.c
> @@ -5,6 +5,7 @@
> */
> #include <linux/module.h>
> #include <linux/multipath.h>
> +#include <trace/events/block.h>
>
> static struct mpath_device *mpath_find_path(struct mpath_head *mpath_head);
>
> @@ -227,7 +228,6 @@ static struct mpath_device *mpath_numa_path(struct mpath_head *mpath_head,
> return mpath_device;
> }
>
> -__maybe_unused
> static struct mpath_device *mpath_find_path(struct mpath_head *mpath_head)
> {
> enum mpath_iopolicy_e iopolicy =
> @@ -243,6 +243,66 @@ static struct mpath_device *mpath_find_path(struct mpath_head *mpath_head)
> }
> }
>
> +static bool mpath_available_path(struct mpath_head *mpath_head)
> +{
> + struct mpath_device *mpath_device;
> +
> + if (!test_bit(MPATH_HEAD_DISK_LIVE, &mpath_head->flags))
> + return false;
> +
> + list_for_each_entry_srcu(mpath_device, &mpath_head->dev_list, siblings,
> + srcu_read_lock_held(&mpath_head->srcu)) {
> + bool available = false;
> +
> + if (!mpath_head->mpdt->available_path(mpath_device,
> + &available))
> + continue;
> + if (available)
> + return true;
> + }
> +
> + return false;
> +}
IMO, we may further simplify the callback ->available_path() to return
true or false instead of passing the result in a separate @available
argument.
Thanks,
--Nilay
next prev parent reply other threads:[~2026-03-02 12:39 UTC|newest]
Thread overview: 61+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-02-25 15:32 [PATCH 00/13] libmultipath: a generic multipath lib for block drivers John Garry
2026-02-25 15:32 ` [PATCH 01/13] libmultipath: Add initial framework John Garry
2026-03-02 12:08 ` Nilay Shroff
2026-03-02 12:21 ` John Garry
2026-02-25 15:32 ` [PATCH 02/13] libmultipath: Add basic gendisk support John Garry
2026-02-26 2:16 ` Benjamin Marzinski
2026-02-26 9:04 ` John Garry
2026-03-02 12:31 ` Nilay Shroff
2026-03-02 15:39 ` John Garry
2026-03-03 12:39 ` Nilay Shroff
2026-03-03 12:59 ` John Garry
2026-03-03 12:13 ` Markus Elfring
2026-02-25 15:32 ` [PATCH 03/13] libmultipath: Add path selection support John Garry
2026-02-26 3:37 ` Benjamin Marzinski
2026-02-26 9:26 ` John Garry
2026-03-02 12:36 ` Nilay Shroff
2026-03-02 15:11 ` John Garry
2026-03-03 11:01 ` Nilay Shroff
2026-03-03 12:41 ` John Garry
2026-03-04 10:26 ` Nilay Shroff
2026-03-04 11:09 ` John Garry
2026-04-14 10:03 ` John Garry
2026-04-14 11:43 ` Nilay Shroff
2026-04-14 13:10 ` John Garry
2026-03-04 13:10 ` Nilay Shroff
2026-03-04 14:38 ` John Garry
2026-02-25 15:32 ` [PATCH 04/13] libmultipath: Add bio handling John Garry
2026-03-02 12:39 ` Nilay Shroff [this message]
2026-03-02 15:52 ` John Garry
2026-03-03 14:00 ` Nilay Shroff
2026-02-25 15:32 ` [PATCH 05/13] libmultipath: Add support for mpath_device management John Garry
2026-02-25 15:32 ` [PATCH 06/13] libmultipath: Add cdev support John Garry
2026-02-25 15:32 ` [PATCH 07/13] libmultipath: Add delayed removal support John Garry
2026-03-02 12:41 ` Nilay Shroff
2026-03-02 15:54 ` John Garry
2026-04-08 11:28 ` John Garry
2026-04-08 15:41 ` Hannes Reinecke
2026-04-08 16:28 ` John Garry
2026-04-09 6:37 ` Nilay Shroff
2026-04-09 13:00 ` John Garry
2026-04-10 7:06 ` Nilay Shroff
2026-04-10 8:55 ` John Garry
2026-04-10 9:09 ` Nilay Shroff
2026-04-10 9:49 ` John Garry
2026-04-10 10:51 ` Nilay Shroff
2026-04-10 11:49 ` John Garry
2026-02-25 15:32 ` [PATCH 08/13] libmultipath: Add sysfs helpers John Garry
2026-02-27 19:05 ` Benjamin Marzinski
2026-03-02 11:11 ` John Garry
2026-02-25 15:32 ` [PATCH 09/13] libmultipath: Add PR support John Garry
2026-02-25 15:49 ` Keith Busch
2026-02-25 16:52 ` John Garry
2026-02-27 18:12 ` Benjamin Marzinski
2026-03-02 10:45 ` John Garry
2026-02-25 15:32 ` [PATCH 10/13] libmultipath: Add mpath_bdev_report_zones() John Garry
2026-02-25 15:32 ` [PATCH 11/13] libmultipath: Add support for block device IOCTL John Garry
2026-02-27 19:52 ` Benjamin Marzinski
2026-03-02 11:19 ` John Garry
2026-04-09 15:20 ` John Garry
2026-02-25 15:32 ` [PATCH 12/13] libmultipath: Add mpath_bdev_getgeo() John Garry
2026-02-25 15:32 ` [PATCH 13/13] libmultipath: Add mpath_bdev_get_unique_id() John Garry
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=a6ffe0f5-7ec3-423c-8702-cf4248fdc168@linux.ibm.com \
--to=nilay@linux.ibm.com \
--cc=axboe@fb.com \
--cc=bmarzins@redhat.com \
--cc=dm-devel@lists.linux.dev \
--cc=hare@suse.com \
--cc=hch@lst.de \
--cc=james.bottomley@hansenpartnership.com \
--cc=jmeneghi@redhat.com \
--cc=john.g.garry@oracle.com \
--cc=kbusch@kernel.org \
--cc=linux-block@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-nvme@lists.infradead.org \
--cc=linux-scsi@vger.kernel.org \
--cc=martin.petersen@oracle.com \
--cc=michael.christie@oracle.com \
--cc=sagi@grimberg.me \
--cc=snitzer@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.