configfs.c (8be98d2f2a0a262f8bf8a0bc1fdf522b3c7aab17) configfs.c (ab7a2737ac5acd7d485ca45d8772497717fbc781)
1// SPDX-License-Identifier: GPL-2.0
2/*
3 * Configfs interface for the NVMe target.
4 * Copyright (c) 2015-2016 HGST, a Western Digital Company.
5 */
6#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
7#include <linux/kernel.h>
8#include <linux/module.h>

--- 993 unchanged lines hidden (view full) ---

1002 NVME_MINOR(subsys->ver),
1003 NVME_TERTIARY(subsys->ver));
1004
1005 return snprintf(page, PAGE_SIZE, "%llu.%llu\n",
1006 NVME_MAJOR(subsys->ver),
1007 NVME_MINOR(subsys->ver));
1008}
1009
1// SPDX-License-Identifier: GPL-2.0
2/*
3 * Configfs interface for the NVMe target.
4 * Copyright (c) 2015-2016 HGST, a Western Digital Company.
5 */
6#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
7#include <linux/kernel.h>
8#include <linux/module.h>

--- 993 unchanged lines hidden (view full) ---

1002 NVME_MINOR(subsys->ver),
1003 NVME_TERTIARY(subsys->ver));
1004
1005 return snprintf(page, PAGE_SIZE, "%llu.%llu\n",
1006 NVME_MAJOR(subsys->ver),
1007 NVME_MINOR(subsys->ver));
1008}
1009
1010static ssize_t nvmet_subsys_attr_version_store(struct config_item *item,
1011 const char *page, size_t count)
1010static ssize_t
1011nvmet_subsys_attr_version_store_locked(struct nvmet_subsys *subsys,
1012 const char *page, size_t count)
1012{
1013{
1013 struct nvmet_subsys *subsys = to_subsys(item);
1014 int major, minor, tertiary = 0;
1015 int ret;
1016
1014 int major, minor, tertiary = 0;
1015 int ret;
1016
1017 if (subsys->subsys_discovered) {
1018 if (NVME_TERTIARY(subsys->ver))
1019 pr_err("Can't set version number. %llu.%llu.%llu is already assigned\n",
1020 NVME_MAJOR(subsys->ver),
1021 NVME_MINOR(subsys->ver),
1022 NVME_TERTIARY(subsys->ver));
1023 else
1024 pr_err("Can't set version number. %llu.%llu is already assigned\n",
1025 NVME_MAJOR(subsys->ver),
1026 NVME_MINOR(subsys->ver));
1027 return -EINVAL;
1028 }
1029
1017 /* passthru subsystems use the underlying controller's version */
1030 /* passthru subsystems use the underlying controller's version */
1018 if (nvmet_passthru_ctrl(subsys))
1031 if (nvmet_is_passthru_subsys(subsys))
1019 return -EINVAL;
1020
1021 ret = sscanf(page, "%d.%d.%d\n", &major, &minor, &tertiary);
1022 if (ret != 2 && ret != 3)
1023 return -EINVAL;
1024
1032 return -EINVAL;
1033
1034 ret = sscanf(page, "%d.%d.%d\n", &major, &minor, &tertiary);
1035 if (ret != 2 && ret != 3)
1036 return -EINVAL;
1037
1025 down_write(&nvmet_config_sem);
1026 subsys->ver = NVME_VS(major, minor, tertiary);
1038 subsys->ver = NVME_VS(major, minor, tertiary);
1027 up_write(&nvmet_config_sem);
1028
1029 return count;
1030}
1039
1040 return count;
1041}
1042
1043static ssize_t nvmet_subsys_attr_version_store(struct config_item *item,
1044 const char *page, size_t count)
1045{
1046 struct nvmet_subsys *subsys = to_subsys(item);
1047 ssize_t ret;
1048
1049 down_write(&nvmet_config_sem);
1050 mutex_lock(&subsys->lock);
1051 ret = nvmet_subsys_attr_version_store_locked(subsys, page, count);
1052 mutex_unlock(&subsys->lock);
1053 up_write(&nvmet_config_sem);
1054
1055 return ret;
1056}
1031CONFIGFS_ATTR(nvmet_subsys_, attr_version);
1032
1057CONFIGFS_ATTR(nvmet_subsys_, attr_version);
1058
1059/* See Section 1.5 of NVMe 1.4 */
1060static bool nvmet_is_ascii(const char c)
1061{
1062 return c >= 0x20 && c <= 0x7e;
1063}
1064
1033static ssize_t nvmet_subsys_attr_serial_show(struct config_item *item,
1034 char *page)
1035{
1036 struct nvmet_subsys *subsys = to_subsys(item);
1037
1065static ssize_t nvmet_subsys_attr_serial_show(struct config_item *item,
1066 char *page)
1067{
1068 struct nvmet_subsys *subsys = to_subsys(item);
1069
1038 return snprintf(page, PAGE_SIZE, "%llx\n", subsys->serial);
1070 return snprintf(page, PAGE_SIZE, "%s\n", subsys->serial);
1039}
1040
1071}
1072
1041static ssize_t nvmet_subsys_attr_serial_store(struct config_item *item,
1042 const char *page, size_t count)
1073static ssize_t
1074nvmet_subsys_attr_serial_store_locked(struct nvmet_subsys *subsys,
1075 const char *page, size_t count)
1043{
1076{
1044 u64 serial;
1077 int pos, len = strcspn(page, "\n");
1045
1078
1046 if (sscanf(page, "%llx\n", &serial) != 1)
1079 if (subsys->subsys_discovered) {
1080 pr_err("Can't set serial number. %s is already assigned\n",
1081 subsys->serial);
1047 return -EINVAL;
1082 return -EINVAL;
1083 }
1048
1084
1085 if (!len || len > NVMET_SN_MAX_SIZE) {
1086 pr_err("Serial Number can not be empty or exceed %d Bytes\n",
1087 NVMET_SN_MAX_SIZE);
1088 return -EINVAL;
1089 }
1090
1091 for (pos = 0; pos < len; pos++) {
1092 if (!nvmet_is_ascii(page[pos])) {
1093 pr_err("Serial Number must contain only ASCII strings\n");
1094 return -EINVAL;
1095 }
1096 }
1097
1098 memcpy_and_pad(subsys->serial, NVMET_SN_MAX_SIZE, page, len, ' ');
1099
1100 return count;
1101}
1102
1103static ssize_t nvmet_subsys_attr_serial_store(struct config_item *item,
1104 const char *page, size_t count)
1105{
1106 struct nvmet_subsys *subsys = to_subsys(item);
1107 ssize_t ret;
1108
1049 down_write(&nvmet_config_sem);
1109 down_write(&nvmet_config_sem);
1050 to_subsys(item)->serial = serial;
1110 mutex_lock(&subsys->lock);
1111 ret = nvmet_subsys_attr_serial_store_locked(subsys, page, count);
1112 mutex_unlock(&subsys->lock);
1051 up_write(&nvmet_config_sem);
1052
1113 up_write(&nvmet_config_sem);
1114
1053 return count;
1115 return ret;
1054}
1055CONFIGFS_ATTR(nvmet_subsys_, attr_serial);
1056
1057static ssize_t nvmet_subsys_attr_cntlid_min_show(struct config_item *item,
1058 char *page)
1059{
1060 return snprintf(page, PAGE_SIZE, "%u\n", to_subsys(item)->cntlid_min);
1061}

--- 51 unchanged lines hidden (view full) ---

1113 return -EINVAL;
1114}
1115CONFIGFS_ATTR(nvmet_subsys_, attr_cntlid_max);
1116
1117static ssize_t nvmet_subsys_attr_model_show(struct config_item *item,
1118 char *page)
1119{
1120 struct nvmet_subsys *subsys = to_subsys(item);
1116}
1117CONFIGFS_ATTR(nvmet_subsys_, attr_serial);
1118
1119static ssize_t nvmet_subsys_attr_cntlid_min_show(struct config_item *item,
1120 char *page)
1121{
1122 return snprintf(page, PAGE_SIZE, "%u\n", to_subsys(item)->cntlid_min);
1123}

--- 51 unchanged lines hidden (view full) ---

1175 return -EINVAL;
1176}
1177CONFIGFS_ATTR(nvmet_subsys_, attr_cntlid_max);
1178
1179static ssize_t nvmet_subsys_attr_model_show(struct config_item *item,
1180 char *page)
1181{
1182 struct nvmet_subsys *subsys = to_subsys(item);
1121 int ret;
1122
1183
1123 mutex_lock(&subsys->lock);
1124 ret = snprintf(page, PAGE_SIZE, "%s\n", subsys->model_number ?
1125 subsys->model_number : NVMET_DEFAULT_CTRL_MODEL);
1126 mutex_unlock(&subsys->lock);
1127
1128 return ret;
1184 return snprintf(page, PAGE_SIZE, "%s\n", subsys->model_number);
1129}
1130
1185}
1186
1131/* See Section 1.5 of NVMe 1.4 */
1132static bool nvmet_is_ascii(const char c)
1133{
1134 return c >= 0x20 && c <= 0x7e;
1135}
1136
1137static ssize_t nvmet_subsys_attr_model_store_locked(struct nvmet_subsys *subsys,
1138 const char *page, size_t count)
1139{
1140 int pos = 0, len;
1141
1187static ssize_t nvmet_subsys_attr_model_store_locked(struct nvmet_subsys *subsys,
1188 const char *page, size_t count)
1189{
1190 int pos = 0, len;
1191
1142 if (subsys->model_number) {
1192 if (subsys->subsys_discovered) {
1143 pr_err("Can't set model number. %s is already assigned\n",
1144 subsys->model_number);
1145 return -EINVAL;
1146 }
1147
1148 len = strcspn(page, "\n");
1149 if (!len)
1150 return -EINVAL;

--- 547 unchanged lines hidden ---
1193 pr_err("Can't set model number. %s is already assigned\n",
1194 subsys->model_number);
1195 return -EINVAL;
1196 }
1197
1198 len = strcspn(page, "\n");
1199 if (!len)
1200 return -EINVAL;

--- 547 unchanged lines hidden ---