nvmet: make discovery NQN configurable
TPAR8013 allows for unique discovery NQNs, so make the discovery controller NQN configurable by exposing a subsys attribute 'discovery_nqn'. Signed-off-by: Hannes Reinecke <hare@suse.de> Reviewed-by: Chaitanya Kulkarni <kch@nvidia.com> Reviewed-by: Himanshu Madhani <himanshu.madhani@oracle.com> Signed-off-by: Christoph Hellwig <hch@lst.de>
This commit is contained in:
parent
c7d792f9b8
commit
626851e922
2 changed files with 41 additions and 1 deletions
|
@ -1233,6 +1233,44 @@ static ssize_t nvmet_subsys_attr_model_store(struct config_item *item,
|
||||||
}
|
}
|
||||||
CONFIGFS_ATTR(nvmet_subsys_, attr_model);
|
CONFIGFS_ATTR(nvmet_subsys_, attr_model);
|
||||||
|
|
||||||
|
static ssize_t nvmet_subsys_attr_discovery_nqn_show(struct config_item *item,
|
||||||
|
char *page)
|
||||||
|
{
|
||||||
|
return snprintf(page, PAGE_SIZE, "%s\n",
|
||||||
|
nvmet_disc_subsys->subsysnqn);
|
||||||
|
}
|
||||||
|
|
||||||
|
static ssize_t nvmet_subsys_attr_discovery_nqn_store(struct config_item *item,
|
||||||
|
const char *page, size_t count)
|
||||||
|
{
|
||||||
|
struct nvmet_subsys *subsys = to_subsys(item);
|
||||||
|
char *subsysnqn;
|
||||||
|
int len;
|
||||||
|
|
||||||
|
len = strcspn(page, "\n");
|
||||||
|
if (!len)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
subsysnqn = kmemdup_nul(page, len, GFP_KERNEL);
|
||||||
|
if (!subsysnqn)
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The discovery NQN must be different from subsystem NQN.
|
||||||
|
*/
|
||||||
|
if (!strcmp(subsysnqn, subsys->subsysnqn)) {
|
||||||
|
kfree(subsysnqn);
|
||||||
|
return -EBUSY;
|
||||||
|
}
|
||||||
|
down_write(&nvmet_config_sem);
|
||||||
|
kfree(nvmet_disc_subsys->subsysnqn);
|
||||||
|
nvmet_disc_subsys->subsysnqn = subsysnqn;
|
||||||
|
up_write(&nvmet_config_sem);
|
||||||
|
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
CONFIGFS_ATTR(nvmet_subsys_, attr_discovery_nqn);
|
||||||
|
|
||||||
#ifdef CONFIG_BLK_DEV_INTEGRITY
|
#ifdef CONFIG_BLK_DEV_INTEGRITY
|
||||||
static ssize_t nvmet_subsys_attr_pi_enable_show(struct config_item *item,
|
static ssize_t nvmet_subsys_attr_pi_enable_show(struct config_item *item,
|
||||||
char *page)
|
char *page)
|
||||||
|
@ -1262,6 +1300,7 @@ static struct configfs_attribute *nvmet_subsys_attrs[] = {
|
||||||
&nvmet_subsys_attr_attr_cntlid_min,
|
&nvmet_subsys_attr_attr_cntlid_min,
|
||||||
&nvmet_subsys_attr_attr_cntlid_max,
|
&nvmet_subsys_attr_attr_cntlid_max,
|
||||||
&nvmet_subsys_attr_attr_model,
|
&nvmet_subsys_attr_attr_model,
|
||||||
|
&nvmet_subsys_attr_attr_discovery_nqn,
|
||||||
#ifdef CONFIG_BLK_DEV_INTEGRITY
|
#ifdef CONFIG_BLK_DEV_INTEGRITY
|
||||||
&nvmet_subsys_attr_attr_pi_enable,
|
&nvmet_subsys_attr_attr_pi_enable,
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -1493,7 +1493,8 @@ static struct nvmet_subsys *nvmet_find_get_subsys(struct nvmet_port *port,
|
||||||
if (!port)
|
if (!port)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
if (!strcmp(NVME_DISC_SUBSYS_NAME, subsysnqn)) {
|
if (!strcmp(NVME_DISC_SUBSYS_NAME, subsysnqn) ||
|
||||||
|
!strcmp(nvmet_disc_subsys->subsysnqn, subsysnqn)) {
|
||||||
if (!kref_get_unless_zero(&nvmet_disc_subsys->ref))
|
if (!kref_get_unless_zero(&nvmet_disc_subsys->ref))
|
||||||
return NULL;
|
return NULL;
|
||||||
return nvmet_disc_subsys;
|
return nvmet_disc_subsys;
|
||||||
|
|
Loading…
Add table
Reference in a new issue