* [PATCH] nvmet: implement unique discovery NQN @ 2023-12-11 8:10 hare 2023-12-11 14:15 ` Sagi Grimberg 2023-12-12 5:20 ` Chaitanya Kulkarni 0 siblings, 2 replies; 5+ messages in thread From: hare @ 2023-12-11 8:10 UTC (permalink / raw) To: Christoph Hellwig; +Cc: Sagi Grimberg, Keith Busch, linux-nvme, Hannes Reinecke From: Hannes Reinecke <hare@suse.de> Add a configfs attribute 'discovery_nqn' in the 'nvmet' configfs directory to specify the unique discovery NQN. Signed-off-by: Hannes Reinecke <hare@suse.de> --- drivers/nvme/target/configfs.c | 45 ++++++++++++++++++++++++++++++++++ drivers/nvme/target/core.c | 7 ++++++ 2 files changed, 52 insertions(+) diff --git a/drivers/nvme/target/configfs.c b/drivers/nvme/target/configfs.c index d937fe05129e..88911d0cd057 100644 --- a/drivers/nvme/target/configfs.c +++ b/drivers/nvme/target/configfs.c @@ -1587,6 +1587,11 @@ static struct config_group *nvmet_subsys_make(struct config_group *group, return ERR_PTR(-EINVAL); } + if (sysfs_streq(name, nvmet_disc_subsys->subsysnqn)) { + pr_err("can't create subsystem using unique discovery NQN\n"); + return ERR_PTR(-EINVAL); + } + subsys = nvmet_subsys_alloc(name, NVME_NQN_NVME); if (IS_ERR(subsys)) return ERR_CAST(subsys); @@ -2131,7 +2136,47 @@ static const struct config_item_type nvmet_hosts_type = { static struct config_group nvmet_hosts_group; +static ssize_t nvmet_root_discovery_nqn_show(struct config_item *item, + char *page) +{ + return sprintf(page, "%s\n", nvmet_disc_subsys->subsysnqn); +} + +static ssize_t nvmet_root_discovery_nqn_store(struct config_item *item, + const char *page, size_t count) +{ + size_t len; + struct list_head *entry; + + len = strcspn(page, "\n"); + if (!len || len > NVMF_NQN_FIELD_LEN - 1) + return -EINVAL; + + down_write(&nvmet_config_sem); + list_for_each(entry, &nvmet_subsystems_group.cg_children) { + struct config_item *item = container_of(entry, struct config_item, ci_entry); + if (!strncmp(config_item_name(item), page, len)) { + pr_err("duplicate NQN %s\n", config_item_name(item)); + up_write(&nvmet_config_sem); + return -EINVAL; + } + } + memset(nvmet_disc_subsys->subsysnqn, 0, NVMF_NQN_FIELD_LEN); + memcpy(nvmet_disc_subsys->subsysnqn, page, len); + up_write(&nvmet_config_sem); + + return len; +} + +CONFIGFS_ATTR(nvmet_root_, discovery_nqn); + +static struct configfs_attribute *nvmet_root_attrs[] = { + &nvmet_root_attr_discovery_nqn, + NULL, +}; + static const struct config_item_type nvmet_root_type = { + .ct_attrs = nvmet_root_attrs, .ct_owner = THIS_MODULE, }; diff --git a/drivers/nvme/target/core.c b/drivers/nvme/target/core.c index 3935165048e7..9c028bbedb45 100644 --- a/drivers/nvme/target/core.c +++ b/drivers/nvme/target/core.c @@ -1530,6 +1530,13 @@ static struct nvmet_subsys *nvmet_find_get_subsys(struct nvmet_port *port, } down_read(&nvmet_config_sem); + if (!strncmp(nvmet_disc_subsys->subsysnqn, subsysnqn, + NVMF_NQN_SIZE)) { + if (kref_get_unless_zero(&nvmet_disc_subsys->ref)) { + up_read(&nvmet_config_sem); + return nvmet_disc_subsys; + } + } list_for_each_entry(p, &port->subsystems, entry) { if (!strncmp(p->subsys->subsysnqn, subsysnqn, NVMF_NQN_SIZE)) { -- 2.35.3 ^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH] nvmet: implement unique discovery NQN 2023-12-11 8:10 [PATCH] nvmet: implement unique discovery NQN hare @ 2023-12-11 14:15 ` Sagi Grimberg 2023-12-11 14:57 ` Hannes Reinecke 2023-12-12 5:20 ` Chaitanya Kulkarni 1 sibling, 1 reply; 5+ messages in thread From: Sagi Grimberg @ 2023-12-11 14:15 UTC (permalink / raw) To: hare, Christoph Hellwig; +Cc: Keith Busch, linux-nvme, Hannes Reinecke So it also responds for the default discovery-nqn? On 12/11/23 10:10, hare@kernel.org wrote: > From: Hannes Reinecke <hare@suse.de> > > Add a configfs attribute 'discovery_nqn' in the 'nvmet' configfs > directory to specify the unique discovery NQN. > > Signed-off-by: Hannes Reinecke <hare@suse.de> > --- > drivers/nvme/target/configfs.c | 45 ++++++++++++++++++++++++++++++++++ > drivers/nvme/target/core.c | 7 ++++++ > 2 files changed, 52 insertions(+) > > diff --git a/drivers/nvme/target/configfs.c b/drivers/nvme/target/configfs.c > index d937fe05129e..88911d0cd057 100644 > --- a/drivers/nvme/target/configfs.c > +++ b/drivers/nvme/target/configfs.c > @@ -1587,6 +1587,11 @@ static struct config_group *nvmet_subsys_make(struct config_group *group, > return ERR_PTR(-EINVAL); > } > > + if (sysfs_streq(name, nvmet_disc_subsys->subsysnqn)) { > + pr_err("can't create subsystem using unique discovery NQN\n"); > + return ERR_PTR(-EINVAL); > + } > + > subsys = nvmet_subsys_alloc(name, NVME_NQN_NVME); > if (IS_ERR(subsys)) > return ERR_CAST(subsys); > @@ -2131,7 +2136,47 @@ static const struct config_item_type nvmet_hosts_type = { > > static struct config_group nvmet_hosts_group; > > +static ssize_t nvmet_root_discovery_nqn_show(struct config_item *item, > + char *page) > +{ > + return sprintf(page, "%s\n", nvmet_disc_subsys->subsysnqn); > +} > + > +static ssize_t nvmet_root_discovery_nqn_store(struct config_item *item, > + const char *page, size_t count) > +{ > + size_t len; > + struct list_head *entry; > + > + len = strcspn(page, "\n"); > + if (!len || len > NVMF_NQN_FIELD_LEN - 1) > + return -EINVAL; > + > + down_write(&nvmet_config_sem); > + list_for_each(entry, &nvmet_subsystems_group.cg_children) { > + struct config_item *item = container_of(entry, struct config_item, ci_entry); > + if (!strncmp(config_item_name(item), page, len)) { > + pr_err("duplicate NQN %s\n", config_item_name(item)); > + up_write(&nvmet_config_sem); > + return -EINVAL; > + } > + } > + memset(nvmet_disc_subsys->subsysnqn, 0, NVMF_NQN_FIELD_LEN); > + memcpy(nvmet_disc_subsys->subsysnqn, page, len); > + up_write(&nvmet_config_sem); > + > + return len; > +} > + > +CONFIGFS_ATTR(nvmet_root_, discovery_nqn); > + > +static struct configfs_attribute *nvmet_root_attrs[] = { > + &nvmet_root_attr_discovery_nqn, > + NULL, > +}; > + > static const struct config_item_type nvmet_root_type = { > + .ct_attrs = nvmet_root_attrs, > .ct_owner = THIS_MODULE, > }; > > diff --git a/drivers/nvme/target/core.c b/drivers/nvme/target/core.c > index 3935165048e7..9c028bbedb45 100644 > --- a/drivers/nvme/target/core.c > +++ b/drivers/nvme/target/core.c > @@ -1530,6 +1530,13 @@ static struct nvmet_subsys *nvmet_find_get_subsys(struct nvmet_port *port, > } > > down_read(&nvmet_config_sem); > + if (!strncmp(nvmet_disc_subsys->subsysnqn, subsysnqn, > + NVMF_NQN_SIZE)) { > + if (kref_get_unless_zero(&nvmet_disc_subsys->ref)) { > + up_read(&nvmet_config_sem); > + return nvmet_disc_subsys; > + } > + } > list_for_each_entry(p, &port->subsystems, entry) { > if (!strncmp(p->subsys->subsysnqn, subsysnqn, > NVMF_NQN_SIZE)) { ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH] nvmet: implement unique discovery NQN 2023-12-11 14:15 ` Sagi Grimberg @ 2023-12-11 14:57 ` Hannes Reinecke 0 siblings, 0 replies; 5+ messages in thread From: Hannes Reinecke @ 2023-12-11 14:57 UTC (permalink / raw) To: Sagi Grimberg, hare, Christoph Hellwig; +Cc: Keith Busch, linux-nvme On 12/11/23 15:15, Sagi Grimberg wrote: > So it also responds for the default discovery-nqn? > yes. Cheers, Hannes ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH] nvmet: implement unique discovery NQN 2023-12-11 8:10 [PATCH] nvmet: implement unique discovery NQN hare 2023-12-11 14:15 ` Sagi Grimberg @ 2023-12-12 5:20 ` Chaitanya Kulkarni 2023-12-12 7:05 ` Hannes Reinecke 1 sibling, 1 reply; 5+ messages in thread From: Chaitanya Kulkarni @ 2023-12-12 5:20 UTC (permalink / raw) To: hare@kernel.org Cc: Sagi Grimberg, Keith Busch, linux-nvme@lists.infradead.org, Hannes Reinecke, Christoph Hellwig On 12/11/23 00:10, hare@kernel.org wrote: > From: Hannes Reinecke <hare@suse.de> > > Add a configfs attribute 'discovery_nqn' in the 'nvmet' configfs > directory to specify the unique discovery NQN. > > Signed-off-by: Hannes Reinecke <hare@suse.de> > --- > drivers/nvme/target/configfs.c | 45 ++++++++++++++++++++++++++++++++++ > drivers/nvme/target/core.c | 7 ++++++ > 2 files changed, 52 insertions(+) > > diff --git a/drivers/nvme/target/configfs.c b/drivers/nvme/target/configfs.c > index d937fe05129e..88911d0cd057 100644 > --- a/drivers/nvme/target/configfs.c > +++ b/drivers/nvme/target/configfs.c > @@ -1587,6 +1587,11 @@ static struct config_group *nvmet_subsys_make(struct config_group *group, > return ERR_PTR(-EINVAL); > } > > + if (sysfs_streq(name, nvmet_disc_subsys->subsysnqn)) { > + pr_err("can't create subsystem using unique discovery NQN\n"); > + return ERR_PTR(-EINVAL); > + } > + > subsys = nvmet_subsys_alloc(name, NVME_NQN_NVME); > if (IS_ERR(subsys)) > return ERR_CAST(subsys); > @@ -2131,7 +2136,47 @@ static const struct config_item_type nvmet_hosts_type = { > > static struct config_group nvmet_hosts_group; > > +static ssize_t nvmet_root_discovery_nqn_show(struct config_item *item, > + char *page) > +{ > + return sprintf(page, "%s\n", nvmet_disc_subsys->subsysnqn); > +} > + > +static ssize_t nvmet_root_discovery_nqn_store(struct config_item *item, > + const char *page, size_t count) > +{ > + size_t len; > + struct list_head *entry; > + > + len = strcspn(page, "\n"); > + if (!len || len > NVMF_NQN_FIELD_LEN - 1) > + return -EINVAL; > + > + down_write(&nvmet_config_sem); > + list_for_each(entry, &nvmet_subsystems_group.cg_children) { > + struct config_item *item = container_of(entry, struct config_item, ci_entry); > + if (!strncmp(config_item_name(item), page, len)) { > + pr_err("duplicate NQN %s\n", config_item_name(item)); > + up_write(&nvmet_config_sem); > + return -EINVAL; > + } > + } > + memset(nvmet_disc_subsys->subsysnqn, 0, NVMF_NQN_FIELD_LEN); > + memcpy(nvmet_disc_subsys->subsysnqn, page, len); > + up_write(&nvmet_config_sem); > + > + return len; > +} > + > please consider something like following, it removes long line re-structures the declaration totally untested :- diff --git a/drivers/nvme/target/configfs.c b/drivers/nvme/target/configfs.c index 88911d0cd057..05d67ddfe83e 100644 --- a/drivers/nvme/target/configfs.c +++ b/drivers/nvme/target/configfs.c @@ -2145,8 +2145,8 @@ static ssize_t nvmet_root_discovery_nqn_show(struct config_item *item, static ssize_t nvmet_root_discovery_nqn_store(struct config_item *item, const char *page, size_t count) { - size_t len; struct list_head *entry; + size_t len; len = strcspn(page, "\n"); if (!len || len > NVMF_NQN_FIELD_LEN - 1) @@ -2154,7 +2154,9 @@ static ssize_t nvmet_root_discovery_nqn_store(struct config_item *item, down_write(&nvmet_config_sem); list_for_each(entry, &nvmet_subsystems_group.cg_children) { - struct config_item *item = container_of(entry, struct config_item, ci_entry); + struct config_item *item = + container_of(entry, struct config_item, ci_entry); + if (!strncmp(config_item_name(item), page, len)) { pr_err("duplicate NQN %s\n", config_item_name(item)); up_write(&nvmet_config_sem); -ck ^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH] nvmet: implement unique discovery NQN 2023-12-12 5:20 ` Chaitanya Kulkarni @ 2023-12-12 7:05 ` Hannes Reinecke 0 siblings, 0 replies; 5+ messages in thread From: Hannes Reinecke @ 2023-12-12 7:05 UTC (permalink / raw) To: Chaitanya Kulkarni, hare@kernel.org Cc: Sagi Grimberg, Keith Busch, linux-nvme@lists.infradead.org, Christoph Hellwig On 12/12/23 06:20, Chaitanya Kulkarni wrote: > On 12/11/23 00:10, hare@kernel.org wrote: >> From: Hannes Reinecke <hare@suse.de> >> >> Add a configfs attribute 'discovery_nqn' in the 'nvmet' configfs >> directory to specify the unique discovery NQN. >> >> Signed-off-by: Hannes Reinecke <hare@suse.de> >> --- >> drivers/nvme/target/configfs.c | 45 ++++++++++++++++++++++++++++++++++ >> drivers/nvme/target/core.c | 7 ++++++ >> 2 files changed, 52 insertions(+) >> >> diff --git a/drivers/nvme/target/configfs.c b/drivers/nvme/target/configfs.c >> index d937fe05129e..88911d0cd057 100644 >> --- a/drivers/nvme/target/configfs.c >> +++ b/drivers/nvme/target/configfs.c >> @@ -1587,6 +1587,11 @@ static struct config_group *nvmet_subsys_make(struct config_group *group, >> return ERR_PTR(-EINVAL); >> } >> >> + if (sysfs_streq(name, nvmet_disc_subsys->subsysnqn)) { >> + pr_err("can't create subsystem using unique discovery NQN\n"); >> + return ERR_PTR(-EINVAL); >> + } >> + >> subsys = nvmet_subsys_alloc(name, NVME_NQN_NVME); >> if (IS_ERR(subsys)) >> return ERR_CAST(subsys); >> @@ -2131,7 +2136,47 @@ static const struct config_item_type nvmet_hosts_type = { >> >> static struct config_group nvmet_hosts_group; >> >> +static ssize_t nvmet_root_discovery_nqn_show(struct config_item *item, >> + char *page) >> +{ >> + return sprintf(page, "%s\n", nvmet_disc_subsys->subsysnqn); >> +} >> + >> +static ssize_t nvmet_root_discovery_nqn_store(struct config_item *item, >> + const char *page, size_t count) >> +{ >> + size_t len; >> + struct list_head *entry; >> + >> + len = strcspn(page, "\n"); >> + if (!len || len > NVMF_NQN_FIELD_LEN - 1) >> + return -EINVAL; >> + >> + down_write(&nvmet_config_sem); >> + list_for_each(entry, &nvmet_subsystems_group.cg_children) { >> + struct config_item *item = container_of(entry, struct config_item, ci_entry); >> + if (!strncmp(config_item_name(item), page, len)) { >> + pr_err("duplicate NQN %s\n", config_item_name(item)); >> + up_write(&nvmet_config_sem); >> + return -EINVAL; >> + } >> + } >> + memset(nvmet_disc_subsys->subsysnqn, 0, NVMF_NQN_FIELD_LEN); >> + memcpy(nvmet_disc_subsys->subsysnqn, page, len); >> + up_write(&nvmet_config_sem); >> + >> + return len; >> +} >> + >> > > please consider something like following, it removes long line > re-structures the declaration totally untested :- > > diff --git a/drivers/nvme/target/configfs.c b/drivers/nvme/target/configfs.c > index 88911d0cd057..05d67ddfe83e 100644 > --- a/drivers/nvme/target/configfs.c > +++ b/drivers/nvme/target/configfs.c > @@ -2145,8 +2145,8 @@ static ssize_t > nvmet_root_discovery_nqn_show(struct config_item *item, > static ssize_t nvmet_root_discovery_nqn_store(struct config_item *item, > const char *page, size_t count) > { > - size_t len; > struct list_head *entry; > + size_t len; > > len = strcspn(page, "\n"); > if (!len || len > NVMF_NQN_FIELD_LEN - 1) > @@ -2154,7 +2154,9 @@ static ssize_t > nvmet_root_discovery_nqn_store(struct config_item *item, > > down_write(&nvmet_config_sem); > list_for_each(entry, &nvmet_subsystems_group.cg_children) { > - struct config_item *item = container_of(entry, struct > config_item, ci_entry); > + struct config_item *item = > + container_of(entry, struct config_item, ci_entry); > + > if (!strncmp(config_item_name(item), page, len)) { > pr_err("duplicate NQN %s\n", > config_item_name(item)); > up_write(&nvmet_config_sem); > > -ck > > Ok, will be resending. Cheers, Hannes -- Dr. Hannes Reinecke Kernel Storage Architect hare@suse.de +49 911 74053 688 SUSE Software Solutions GmbH, Maxfeldstr. 5, 90409 Nürnberg HRB 36809 (AG Nürnberg), GF: Ivo Totev, Andrew McDonald, Werner Knoblich ^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2023-12-12 7:06 UTC | newest] Thread overview: 5+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2023-12-11 8:10 [PATCH] nvmet: implement unique discovery NQN hare 2023-12-11 14:15 ` Sagi Grimberg 2023-12-11 14:57 ` Hannes Reinecke 2023-12-12 5:20 ` Chaitanya Kulkarni 2023-12-12 7:05 ` Hannes Reinecke
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox