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 --- |