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 | 6 ++++++ 3 files changed, 11 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 e00e2842df307..b727d6b69f3df 100644 --- a/drivers/nvme/host/multipath.c +++ b/drivers/nvme/host/multipath.c @@ -1388,3 +1388,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 5de06c016b622..f3026da0f39d9 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> @@ -554,6 +555,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; @@ -581,6 +584,7 @@ enum nvme_ns_features { }; struct nvme_ns { + struct mpath_device mpath_device; struct list_head list; struct nvme_ctrl *ctrl; @@ -607,6 +611,8 @@ struct nvme_ns { struct nvme_fault_inject fault_inject; }; +#define nvme_mpath_to_ns(d) container_of(d, struct nvme_ns, mpath_device) + /* NVMe ns supports metadata actions by the controller (generate/strip) */ static inline bool nvme_ns_has_pi(struct nvme_ns_head *head) { -- 2.43.5

