Skip to content

Commit

Permalink
nvmet: make ver stable once connection established
Browse files Browse the repository at this point in the history
Once some host has connected to the nvmf target, make sure that the
version number is stable and cannot be changed.

Signed-off-by: Max Gurtovoy <mgurtovoy@nvidia.com>
Signed-off-by: Noam Gottlieb <ngottlieb@nvidia.com>
Signed-off-by: Christoph Hellwig <hch@lst.de>
  • Loading branch information
GottliebNoam authored and Christoph Hellwig committed Jun 17, 2021
1 parent 0d148ef commit 87fd4cc
Showing 1 changed file with 31 additions and 5 deletions.
36 changes: 31 additions & 5 deletions drivers/nvme/target/configfs.c
Original file line number Diff line number Diff line change
Expand Up @@ -1007,13 +1007,26 @@ static ssize_t nvmet_subsys_attr_version_show(struct config_item *item,
NVME_MINOR(subsys->ver));
}

static ssize_t nvmet_subsys_attr_version_store(struct config_item *item,
const char *page, size_t count)
static ssize_t
nvmet_subsys_attr_version_store_locked(struct nvmet_subsys *subsys,
const char *page, size_t count)
{
struct nvmet_subsys *subsys = to_subsys(item);
int major, minor, tertiary = 0;
int ret;

if (subsys->subsys_discovered) {
if (NVME_TERTIARY(subsys->ver))
pr_err("Can't set version number. %llu.%llu.%llu is already assigned\n",
NVME_MAJOR(subsys->ver),
NVME_MINOR(subsys->ver),
NVME_TERTIARY(subsys->ver));
else
pr_err("Can't set version number. %llu.%llu is already assigned\n",
NVME_MAJOR(subsys->ver),
NVME_MINOR(subsys->ver));
return -EINVAL;
}

/* passthru subsystems use the underlying controller's version */
if (nvmet_passthru_ctrl(subsys))
return -EINVAL;
Expand All @@ -1022,12 +1035,25 @@ static ssize_t nvmet_subsys_attr_version_store(struct config_item *item,
if (ret != 2 && ret != 3)
return -EINVAL;

down_write(&nvmet_config_sem);
subsys->ver = NVME_VS(major, minor, tertiary);
up_write(&nvmet_config_sem);

return count;
}

static ssize_t nvmet_subsys_attr_version_store(struct config_item *item,
const char *page, size_t count)
{
struct nvmet_subsys *subsys = to_subsys(item);
ssize_t ret;

down_write(&nvmet_config_sem);
mutex_lock(&subsys->lock);
ret = nvmet_subsys_attr_version_store_locked(subsys, page, count);
mutex_unlock(&subsys->lock);
up_write(&nvmet_config_sem);

return ret;
}
CONFIGFS_ATTR(nvmet_subsys_, attr_version);

/* See Section 1.5 of NVMe 1.4 */
Expand Down

0 comments on commit 87fd4cc

Please sign in to comment.