|
@@ -650,8 +650,45 @@ out_unlock:
|
|
|
|
|
|
CONFIGFS_ATTR(nvmet_subsys_, attr_allow_any_host);
|
|
|
|
|
|
+static ssize_t nvmet_subsys_version_show(struct config_item *item,
|
|
|
+ char *page)
|
|
|
+{
|
|
|
+ struct nvmet_subsys *subsys = to_subsys(item);
|
|
|
+
|
|
|
+ if (NVME_TERTIARY(subsys->ver))
|
|
|
+ return snprintf(page, PAGE_SIZE, "%d.%d.%d\n",
|
|
|
+ (int)NVME_MAJOR(subsys->ver),
|
|
|
+ (int)NVME_MINOR(subsys->ver),
|
|
|
+ (int)NVME_TERTIARY(subsys->ver));
|
|
|
+ else
|
|
|
+ return snprintf(page, PAGE_SIZE, "%d.%d\n",
|
|
|
+ (int)NVME_MAJOR(subsys->ver),
|
|
|
+ (int)NVME_MINOR(subsys->ver));
|
|
|
+}
|
|
|
+
|
|
|
+static ssize_t nvmet_subsys_version_store(struct config_item *item,
|
|
|
+ const char *page, size_t count)
|
|
|
+{
|
|
|
+ struct nvmet_subsys *subsys = to_subsys(item);
|
|
|
+ int major, minor, tertiary = 0;
|
|
|
+ int ret;
|
|
|
+
|
|
|
+
|
|
|
+ ret = sscanf(page, "%d.%d.%d\n", &major, &minor, &tertiary);
|
|
|
+ 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;
|
|
|
+}
|
|
|
+CONFIGFS_ATTR(nvmet_subsys_, version);
|
|
|
+
|
|
|
static struct configfs_attribute *nvmet_subsys_attrs[] = {
|
|
|
&nvmet_subsys_attr_attr_allow_any_host,
|
|
|
+ &nvmet_subsys_attr_version,
|
|
|
NULL,
|
|
|
};
|
|
|
|