[PATCH 4/6] nvme: expose subsystem type in sysfs attribute 'subtype'

Himanshu Madhani himanshu.madhani at oracle.com
Wed Sep 22 06:34:13 PDT 2021



> On Sep 21, 2021, at 10:15 AM, Hannes Reinecke <hare at suse.de> wrote:
> 
> With unique discovery controller NQNs we cannot distinguish the
> subsystem type by the NQN alone, but need to check the subsystem
> type, too.
> So expose the subsystem type in a new sysfs attribute 'subtype'.
> 
> Signed-off-by: Hannes Reinecke <hare at suse.de>
> ---
> drivers/nvme/host/core.c | 27 +++++++++++++++++++++++++++
> drivers/nvme/host/nvme.h |  1 +
> 2 files changed, 28 insertions(+)
> 
> diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c
> index e486845d2c7e..1ed1b7be2812 100644
> --- a/drivers/nvme/host/core.c
> +++ b/drivers/nvme/host/core.c
> @@ -2598,6 +2598,24 @@ static ssize_t nvme_subsys_show_nqn(struct device *dev,
> }
> static SUBSYS_ATTR_RO(subsysnqn, S_IRUGO, nvme_subsys_show_nqn);
> 
> +static ssize_t nvme_subsys_show_subtype(struct device *dev,
> +				    struct device_attribute *attr,
> +				    char *buf)
> +{
> +	struct nvme_subsystem *subsys =
> +		container_of(dev, struct nvme_subsystem, dev);
> +
> +	switch (subsys->subtype) {
> +	case NVME_NQN_DISC:
> +		return sysfs_emit(buf, "discovery\n");
> +	case NVME_NQN_NVME:
> +		return sysfs_emit(buf, "nvm\n");
> +	default:
> +		return sysfs_emit(buf, "reserved\n");
> +	}
> +}
> +static SUBSYS_ATTR_RO(subtype, S_IRUGO, nvme_subsys_show_subtype);
> +
> #define nvme_subsys_show_str_function(field)				\
> static ssize_t subsys_##field##_show(struct device *dev,		\
> 			    struct device_attribute *attr, char *buf)	\
> @@ -2618,6 +2636,7 @@ static struct attribute *nvme_subsys_attrs[] = {
> 	&subsys_attr_serial.attr,
> 	&subsys_attr_firmware_rev.attr,
> 	&subsys_attr_subsysnqn.attr,
> +	&subsys_attr_subtype.attr,
> #ifdef CONFIG_NVME_MULTIPATH
> 	&subsys_attr_iopolicy.attr,
> #endif
> @@ -2688,6 +2707,14 @@ static int nvme_init_subsystem(struct nvme_ctrl *ctrl, struct nvme_id_ctrl *id)
> 	memcpy(subsys->firmware_rev, id->fr, sizeof(subsys->firmware_rev));
> 	subsys->vendor_id = le16_to_cpu(id->vid);
> 	subsys->cmic = id->cmic;
> +
> +	/* Versions prior to 1.4 don't necessarily report a valid type */
> +	if (id->cntrltype == NVME_CTRL_DISC ||
> +	    !strcmp(subsys->subnqn, NVME_DISC_SUBSYS_NAME))
> +		subsys->subtype = NVME_NQN_DISC;
> +	else
> +		subsys->subtype = NVME_NQN_NVME;
> +
> 	subsys->awupf = le16_to_cpu(id->awupf);
> #ifdef CONFIG_NVME_MULTIPATH
> 	subsys->iopolicy = NVME_IOPOLICY_NUMA;
> diff --git a/drivers/nvme/host/nvme.h b/drivers/nvme/host/nvme.h
> index 9871c0c9374c..2c7a77f600f8 100644
> --- a/drivers/nvme/host/nvme.h
> +++ b/drivers/nvme/host/nvme.h
> @@ -366,6 +366,7 @@ struct nvme_subsystem {
> 	char			model[40];
> 	char			firmware_rev[8];
> 	u8			cmic;
> +	enum nvme_subsys_type	subtype;
> 	u16			vendor_id;
> 	u16			awupf;	/* 0's based awupf value. */
> 	struct ida		ns_ida;
> -- 
> 2.29.2
> 
> 
> _______________________________________________
> Linux-nvme mailing list
> Linux-nvme at lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/linux-nvme

Looks Good. 

Reviewed-by: Himanshu Madhani <himanshu.madhani at oracle.com>

--
Himanshu Madhani	 Oracle Linux Engineering




More information about the Linux-nvme mailing list