Add initial support, as follows: - Add mpath_head_template - Add mpath_device in nvme_ns - Add mpath_disk pointer to head structure
Initially all the functionality which mpath_head_template points to will be unused, until the driver fully switches to libmultipath. Otherwise it's hard to do so in a step-wise fashion without breaking functionality. Many of the libmultipath-based function added will reference the ns mpath_device, so add that now. Also add the NS head disk pointer for the same reason. Signed-off-by: John Garry <[email protected]> --- drivers/nvme/host/Kconfig | 1 + drivers/nvme/host/multipath.c | 4 ++++ drivers/nvme/host/nvme.h | 8 ++++++++ 3 files changed, 13 insertions(+) diff --git a/drivers/nvme/host/Kconfig b/drivers/nvme/host/Kconfig index 31974c7dd20c9..1b3f76e781bad 100644 --- a/drivers/nvme/host/Kconfig +++ b/drivers/nvme/host/Kconfig @@ -1,6 +1,7 @@ # SPDX-License-Identifier: GPL-2.0-only config NVME_CORE tristate + select LIBMULTIPATH config BLK_DEV_NVME tristate "NVM Express block device" diff --git a/drivers/nvme/host/multipath.c b/drivers/nvme/host/multipath.c index 9b9a657fa330f..14947736744a5 100644 --- a/drivers/nvme/host/multipath.c +++ b/drivers/nvme/host/multipath.c @@ -1496,3 +1496,7 @@ void nvme_mpath_uninit(struct nvme_ctrl *ctrl) ctrl->ana_log_buf = NULL; ctrl->ana_log_size = 0; } + +__maybe_unused +static const struct mpath_head_template mpdt = { +}; diff --git a/drivers/nvme/host/nvme.h b/drivers/nvme/host/nvme.h index 824651cc898db..3e023948015ac 100644 --- a/drivers/nvme/host/nvme.h +++ b/drivers/nvme/host/nvme.h @@ -13,6 +13,7 @@ #include <linux/blk-mq.h> #include <linux/sed-opal.h> #include <linux/fault-inject.h> +#include <linux/multipath.h> #include <linux/rcupdate.h> #include <linux/wait.h> #include <linux/t10-pi.h> @@ -560,6 +561,8 @@ struct nvme_ns_head { u16 nr_plids; u16 *plids; + + struct mpath_head mpath_head; #ifdef CONFIG_NVME_MULTIPATH struct bio_list requeue_list; spinlock_t requeue_lock; @@ -590,6 +593,7 @@ enum nvme_ns_features { }; struct nvme_ns { + struct mpath_device mpath_device; struct list_head list; struct nvme_ctrl *ctrl; @@ -620,6 +624,10 @@ struct nvme_ns { struct nvme_fault_inject fault_inject; }; +#define nvme_mpath_to_ns(d) container_of(d, struct nvme_ns, mpath_device) +#define nvme_mpath_to_ns_head(h) \ + container_of(h, struct nvme_ns_head, mpath_head) + /* NVMe ns supports metadata actions by the controller (generate/strip) */ static inline bool nvme_ns_has_pi(struct nvme_ns_head *head) { -- 2.43.7

