[PATCH 01/13] libmultipath: Add initial framework
Nilay Shroff
nilay at linux.ibm.com
Mon Mar 2 04:08:17 PST 2026
Hi John,
On 2/25/26 9:02 PM, John Garry wrote:
> Add initial framework for libmultipath. libmultipath is a library for
> multipath-capable block drivers, such as NVMe. The main function is to
> support path management, path selection, and failover handling.
>
> Basic support to add and remove the head structure - mpath_head - is
> included.
>
> This main purpose of this structure is to manage available paths and path
> selection. It is quite similar to the multipath functionality in
> nvme_ns_head. However a separate structure will introduced after to manage
> the multipath gendisk.
>
> Each path is represented by the mpath_device structure. It should hold a
> pointer to the per-path gendisk and also a list element for all siblings
> of paths. For NVMe, there would be a mpath_device per nvme_ns.
>
> All the libmultipath code is more or less taken from
> drivers/nvme/host/multipath.c, which was originally authored by Christoph
> Hellwig <hch at lst.de>.
>
> Signed-off-by: John Garry <john.g.garry at oracle.com>
> ---
> include/linux/multipath.h | 28 +++++++++++++++
> lib/Kconfig | 6 ++++
> lib/Makefile | 2 ++
> lib/multipath.c | 74 +++++++++++++++++++++++++++++++++++++++
> 4 files changed, 110 insertions(+)
> create mode 100644 include/linux/multipath.h
> create mode 100644 lib/multipath.c
>
> diff --git a/include/linux/multipath.h b/include/linux/multipath.h
> new file mode 100644
> index 0000000000000..18cd133b7ca21
> --- /dev/null
> +++ b/include/linux/multipath.h
> @@ -0,0 +1,28 @@
> +
> +#ifndef _LIBMULTIPATH_H
> +#define _LIBMULTIPATH_H
> +
> +#include <linux/blkdev.h>
> +#include <linux/srcu.h>
> +
> +struct mpath_device {
> + struct list_head siblings;
> + struct gendisk *disk;
> +};
> +
> +struct mpath_head {
> + struct srcu_struct srcu;
> + struct list_head dev_list; /* list of all mpath_devs */
> + struct mutex lock;
> +
> + struct kref ref;
> +
> + struct mpath_device __rcu *current_path[MAX_NUMNODES];
> + void *drvdata;
> +};
Can we use current_path[] as last element and flex array (same as what
we have today under struct nvme_ns_head) so that we don't need to
allocate array as big as MAX_NUMANODES? With flex array we can use
num_possible_nodes() which may be much smaller than MAX_NUMANODES.
Thanks,
--Nilay
More information about the Linux-nvme
mailing list