xref: /openbmc/linux/drivers/nvme/host/sysfs.c (revision 86e281fc)
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * Sysfs interface for the NVMe core driver.
4  *
5  * Copyright (c) 2011-2014, Intel Corporation.
6  */
7 
8 #include <linux/nvme-auth.h>
9 
10 #include "nvme.h"
11 #include "fabrics.h"
12 
13 static ssize_t nvme_sysfs_reset(struct device *dev,
14 				struct device_attribute *attr, const char *buf,
15 				size_t count)
16 {
17 	struct nvme_ctrl *ctrl = dev_get_drvdata(dev);
18 	int ret;
19 
20 	ret = nvme_reset_ctrl_sync(ctrl);
21 	if (ret < 0)
22 		return ret;
23 	return count;
24 }
25 static DEVICE_ATTR(reset_controller, S_IWUSR, NULL, nvme_sysfs_reset);
26 
27 static ssize_t nvme_sysfs_rescan(struct device *dev,
28 				struct device_attribute *attr, const char *buf,
29 				size_t count)
30 {
31 	struct nvme_ctrl *ctrl = dev_get_drvdata(dev);
32 
33 	nvme_queue_scan(ctrl);
34 	return count;
35 }
36 static DEVICE_ATTR(rescan_controller, S_IWUSR, NULL, nvme_sysfs_rescan);
37 
38 static inline struct nvme_ns_head *dev_to_ns_head(struct device *dev)
39 {
40 	struct gendisk *disk = dev_to_disk(dev);
41 
42 	if (disk->fops == &nvme_bdev_ops)
43 		return nvme_get_ns_from_dev(dev)->head;
44 	else
45 		return disk->private_data;
46 }
47 
48 static ssize_t wwid_show(struct device *dev, struct device_attribute *attr,
49 		char *buf)
50 {
51 	struct nvme_ns_head *head = dev_to_ns_head(dev);
52 	struct nvme_ns_ids *ids = &head->ids;
53 	struct nvme_subsystem *subsys = head->subsys;
54 	int serial_len = sizeof(subsys->serial);
55 	int model_len = sizeof(subsys->model);
56 
57 	if (!uuid_is_null(&ids->uuid))
58 		return sysfs_emit(buf, "uuid.%pU\n", &ids->uuid);
59 
60 	if (memchr_inv(ids->nguid, 0, sizeof(ids->nguid)))
61 		return sysfs_emit(buf, "eui.%16phN\n", ids->nguid);
62 
63 	if (memchr_inv(ids->eui64, 0, sizeof(ids->eui64)))
64 		return sysfs_emit(buf, "eui.%8phN\n", ids->eui64);
65 
66 	while (serial_len > 0 && (subsys->serial[serial_len - 1] == ' ' ||
67 				  subsys->serial[serial_len - 1] == '\0'))
68 		serial_len--;
69 	while (model_len > 0 && (subsys->model[model_len - 1] == ' ' ||
70 				 subsys->model[model_len - 1] == '\0'))
71 		model_len--;
72 
73 	return sysfs_emit(buf, "nvme.%04x-%*phN-%*phN-%08x\n", subsys->vendor_id,
74 		serial_len, subsys->serial, model_len, subsys->model,
75 		head->ns_id);
76 }
77 static DEVICE_ATTR_RO(wwid);
78 
79 static ssize_t nguid_show(struct device *dev, struct device_attribute *attr,
80 		char *buf)
81 {
82 	return sysfs_emit(buf, "%pU\n", dev_to_ns_head(dev)->ids.nguid);
83 }
84 static DEVICE_ATTR_RO(nguid);
85 
86 static ssize_t uuid_show(struct device *dev, struct device_attribute *attr,
87 		char *buf)
88 {
89 	struct nvme_ns_ids *ids = &dev_to_ns_head(dev)->ids;
90 
91 	/* For backward compatibility expose the NGUID to userspace if
92 	 * we have no UUID set
93 	 */
94 	if (uuid_is_null(&ids->uuid)) {
95 		dev_warn_once(dev,
96 			"No UUID available providing old NGUID\n");
97 		return sysfs_emit(buf, "%pU\n", ids->nguid);
98 	}
99 	return sysfs_emit(buf, "%pU\n", &ids->uuid);
100 }
101 static DEVICE_ATTR_RO(uuid);
102 
103 static ssize_t eui_show(struct device *dev, struct device_attribute *attr,
104 		char *buf)
105 {
106 	return sysfs_emit(buf, "%8ph\n", dev_to_ns_head(dev)->ids.eui64);
107 }
108 static DEVICE_ATTR_RO(eui);
109 
110 static ssize_t nsid_show(struct device *dev, struct device_attribute *attr,
111 		char *buf)
112 {
113 	return sysfs_emit(buf, "%d\n", dev_to_ns_head(dev)->ns_id);
114 }
115 static DEVICE_ATTR_RO(nsid);
116 
117 static struct attribute *nvme_ns_id_attrs[] = {
118 	&dev_attr_wwid.attr,
119 	&dev_attr_uuid.attr,
120 	&dev_attr_nguid.attr,
121 	&dev_attr_eui.attr,
122 	&dev_attr_nsid.attr,
123 #ifdef CONFIG_NVME_MULTIPATH
124 	&dev_attr_ana_grpid.attr,
125 	&dev_attr_ana_state.attr,
126 #endif
127 	NULL,
128 };
129 
130 static umode_t nvme_ns_id_attrs_are_visible(struct kobject *kobj,
131 		struct attribute *a, int n)
132 {
133 	struct device *dev = container_of(kobj, struct device, kobj);
134 	struct nvme_ns_ids *ids = &dev_to_ns_head(dev)->ids;
135 
136 	if (a == &dev_attr_uuid.attr) {
137 		if (uuid_is_null(&ids->uuid) &&
138 		    !memchr_inv(ids->nguid, 0, sizeof(ids->nguid)))
139 			return 0;
140 	}
141 	if (a == &dev_attr_nguid.attr) {
142 		if (!memchr_inv(ids->nguid, 0, sizeof(ids->nguid)))
143 			return 0;
144 	}
145 	if (a == &dev_attr_eui.attr) {
146 		if (!memchr_inv(ids->eui64, 0, sizeof(ids->eui64)))
147 			return 0;
148 	}
149 #ifdef CONFIG_NVME_MULTIPATH
150 	if (a == &dev_attr_ana_grpid.attr || a == &dev_attr_ana_state.attr) {
151 		if (dev_to_disk(dev)->fops != &nvme_bdev_ops) /* per-path attr */
152 			return 0;
153 		if (!nvme_ctrl_use_ana(nvme_get_ns_from_dev(dev)->ctrl))
154 			return 0;
155 	}
156 #endif
157 	return a->mode;
158 }
159 
160 static const struct attribute_group nvme_ns_id_attr_group = {
161 	.attrs		= nvme_ns_id_attrs,
162 	.is_visible	= nvme_ns_id_attrs_are_visible,
163 };
164 
165 const struct attribute_group *nvme_ns_id_attr_groups[] = {
166 	&nvme_ns_id_attr_group,
167 	NULL,
168 };
169 
170 #define nvme_show_str_function(field)						\
171 static ssize_t  field##_show(struct device *dev,				\
172 			    struct device_attribute *attr, char *buf)		\
173 {										\
174         struct nvme_ctrl *ctrl = dev_get_drvdata(dev);				\
175         return sysfs_emit(buf, "%.*s\n",					\
176 		(int)sizeof(ctrl->subsys->field), ctrl->subsys->field);		\
177 }										\
178 static DEVICE_ATTR(field, S_IRUGO, field##_show, NULL);
179 
180 nvme_show_str_function(model);
181 nvme_show_str_function(serial);
182 nvme_show_str_function(firmware_rev);
183 
184 #define nvme_show_int_function(field)						\
185 static ssize_t  field##_show(struct device *dev,				\
186 			    struct device_attribute *attr, char *buf)		\
187 {										\
188         struct nvme_ctrl *ctrl = dev_get_drvdata(dev);				\
189         return sysfs_emit(buf, "%d\n", ctrl->field);				\
190 }										\
191 static DEVICE_ATTR(field, S_IRUGO, field##_show, NULL);
192 
193 nvme_show_int_function(cntlid);
194 nvme_show_int_function(numa_node);
195 nvme_show_int_function(queue_count);
196 nvme_show_int_function(sqsize);
197 nvme_show_int_function(kato);
198 
199 static ssize_t nvme_sysfs_delete(struct device *dev,
200 				struct device_attribute *attr, const char *buf,
201 				size_t count)
202 {
203 	struct nvme_ctrl *ctrl = dev_get_drvdata(dev);
204 
205 	if (!test_bit(NVME_CTRL_STARTED_ONCE, &ctrl->flags))
206 		return -EBUSY;
207 
208 	if (device_remove_file_self(dev, attr))
209 		nvme_delete_ctrl_sync(ctrl);
210 	return count;
211 }
212 static DEVICE_ATTR(delete_controller, S_IWUSR, NULL, nvme_sysfs_delete);
213 
214 static ssize_t nvme_sysfs_show_transport(struct device *dev,
215 					 struct device_attribute *attr,
216 					 char *buf)
217 {
218 	struct nvme_ctrl *ctrl = dev_get_drvdata(dev);
219 
220 	return sysfs_emit(buf, "%s\n", ctrl->ops->name);
221 }
222 static DEVICE_ATTR(transport, S_IRUGO, nvme_sysfs_show_transport, NULL);
223 
224 static ssize_t nvme_sysfs_show_state(struct device *dev,
225 				     struct device_attribute *attr,
226 				     char *buf)
227 {
228 	struct nvme_ctrl *ctrl = dev_get_drvdata(dev);
229 	static const char *const state_name[] = {
230 		[NVME_CTRL_NEW]		= "new",
231 		[NVME_CTRL_LIVE]	= "live",
232 		[NVME_CTRL_RESETTING]	= "resetting",
233 		[NVME_CTRL_CONNECTING]	= "connecting",
234 		[NVME_CTRL_DELETING]	= "deleting",
235 		[NVME_CTRL_DELETING_NOIO]= "deleting (no IO)",
236 		[NVME_CTRL_DEAD]	= "dead",
237 	};
238 
239 	if ((unsigned)ctrl->state < ARRAY_SIZE(state_name) &&
240 	    state_name[ctrl->state])
241 		return sysfs_emit(buf, "%s\n", state_name[ctrl->state]);
242 
243 	return sysfs_emit(buf, "unknown state\n");
244 }
245 
246 static DEVICE_ATTR(state, S_IRUGO, nvme_sysfs_show_state, NULL);
247 
248 static ssize_t nvme_sysfs_show_subsysnqn(struct device *dev,
249 					 struct device_attribute *attr,
250 					 char *buf)
251 {
252 	struct nvme_ctrl *ctrl = dev_get_drvdata(dev);
253 
254 	return sysfs_emit(buf, "%s\n", ctrl->subsys->subnqn);
255 }
256 static DEVICE_ATTR(subsysnqn, S_IRUGO, nvme_sysfs_show_subsysnqn, NULL);
257 
258 static ssize_t nvme_sysfs_show_hostnqn(struct device *dev,
259 					struct device_attribute *attr,
260 					char *buf)
261 {
262 	struct nvme_ctrl *ctrl = dev_get_drvdata(dev);
263 
264 	return sysfs_emit(buf, "%s\n", ctrl->opts->host->nqn);
265 }
266 static DEVICE_ATTR(hostnqn, S_IRUGO, nvme_sysfs_show_hostnqn, NULL);
267 
268 static ssize_t nvme_sysfs_show_hostid(struct device *dev,
269 					struct device_attribute *attr,
270 					char *buf)
271 {
272 	struct nvme_ctrl *ctrl = dev_get_drvdata(dev);
273 
274 	return sysfs_emit(buf, "%pU\n", &ctrl->opts->host->id);
275 }
276 static DEVICE_ATTR(hostid, S_IRUGO, nvme_sysfs_show_hostid, NULL);
277 
278 static ssize_t nvme_sysfs_show_address(struct device *dev,
279 					 struct device_attribute *attr,
280 					 char *buf)
281 {
282 	struct nvme_ctrl *ctrl = dev_get_drvdata(dev);
283 
284 	return ctrl->ops->get_address(ctrl, buf, PAGE_SIZE);
285 }
286 static DEVICE_ATTR(address, S_IRUGO, nvme_sysfs_show_address, NULL);
287 
288 static ssize_t nvme_ctrl_loss_tmo_show(struct device *dev,
289 		struct device_attribute *attr, char *buf)
290 {
291 	struct nvme_ctrl *ctrl = dev_get_drvdata(dev);
292 	struct nvmf_ctrl_options *opts = ctrl->opts;
293 
294 	if (ctrl->opts->max_reconnects == -1)
295 		return sysfs_emit(buf, "off\n");
296 	return sysfs_emit(buf, "%d\n",
297 			  opts->max_reconnects * opts->reconnect_delay);
298 }
299 
300 static ssize_t nvme_ctrl_loss_tmo_store(struct device *dev,
301 		struct device_attribute *attr, const char *buf, size_t count)
302 {
303 	struct nvme_ctrl *ctrl = dev_get_drvdata(dev);
304 	struct nvmf_ctrl_options *opts = ctrl->opts;
305 	int ctrl_loss_tmo, err;
306 
307 	err = kstrtoint(buf, 10, &ctrl_loss_tmo);
308 	if (err)
309 		return -EINVAL;
310 
311 	if (ctrl_loss_tmo < 0)
312 		opts->max_reconnects = -1;
313 	else
314 		opts->max_reconnects = DIV_ROUND_UP(ctrl_loss_tmo,
315 						opts->reconnect_delay);
316 	return count;
317 }
318 static DEVICE_ATTR(ctrl_loss_tmo, S_IRUGO | S_IWUSR,
319 	nvme_ctrl_loss_tmo_show, nvme_ctrl_loss_tmo_store);
320 
321 static ssize_t nvme_ctrl_reconnect_delay_show(struct device *dev,
322 		struct device_attribute *attr, char *buf)
323 {
324 	struct nvme_ctrl *ctrl = dev_get_drvdata(dev);
325 
326 	if (ctrl->opts->reconnect_delay == -1)
327 		return sysfs_emit(buf, "off\n");
328 	return sysfs_emit(buf, "%d\n", ctrl->opts->reconnect_delay);
329 }
330 
331 static ssize_t nvme_ctrl_reconnect_delay_store(struct device *dev,
332 		struct device_attribute *attr, const char *buf, size_t count)
333 {
334 	struct nvme_ctrl *ctrl = dev_get_drvdata(dev);
335 	unsigned int v;
336 	int err;
337 
338 	err = kstrtou32(buf, 10, &v);
339 	if (err)
340 		return err;
341 
342 	ctrl->opts->reconnect_delay = v;
343 	return count;
344 }
345 static DEVICE_ATTR(reconnect_delay, S_IRUGO | S_IWUSR,
346 	nvme_ctrl_reconnect_delay_show, nvme_ctrl_reconnect_delay_store);
347 
348 static ssize_t nvme_ctrl_fast_io_fail_tmo_show(struct device *dev,
349 		struct device_attribute *attr, char *buf)
350 {
351 	struct nvme_ctrl *ctrl = dev_get_drvdata(dev);
352 
353 	if (ctrl->opts->fast_io_fail_tmo == -1)
354 		return sysfs_emit(buf, "off\n");
355 	return sysfs_emit(buf, "%d\n", ctrl->opts->fast_io_fail_tmo);
356 }
357 
358 static ssize_t nvme_ctrl_fast_io_fail_tmo_store(struct device *dev,
359 		struct device_attribute *attr, const char *buf, size_t count)
360 {
361 	struct nvme_ctrl *ctrl = dev_get_drvdata(dev);
362 	struct nvmf_ctrl_options *opts = ctrl->opts;
363 	int fast_io_fail_tmo, err;
364 
365 	err = kstrtoint(buf, 10, &fast_io_fail_tmo);
366 	if (err)
367 		return -EINVAL;
368 
369 	if (fast_io_fail_tmo < 0)
370 		opts->fast_io_fail_tmo = -1;
371 	else
372 		opts->fast_io_fail_tmo = fast_io_fail_tmo;
373 	return count;
374 }
375 static DEVICE_ATTR(fast_io_fail_tmo, S_IRUGO | S_IWUSR,
376 	nvme_ctrl_fast_io_fail_tmo_show, nvme_ctrl_fast_io_fail_tmo_store);
377 
378 static ssize_t cntrltype_show(struct device *dev,
379 			      struct device_attribute *attr, char *buf)
380 {
381 	static const char * const type[] = {
382 		[NVME_CTRL_IO] = "io\n",
383 		[NVME_CTRL_DISC] = "discovery\n",
384 		[NVME_CTRL_ADMIN] = "admin\n",
385 	};
386 	struct nvme_ctrl *ctrl = dev_get_drvdata(dev);
387 
388 	if (ctrl->cntrltype > NVME_CTRL_ADMIN || !type[ctrl->cntrltype])
389 		return sysfs_emit(buf, "reserved\n");
390 
391 	return sysfs_emit(buf, type[ctrl->cntrltype]);
392 }
393 static DEVICE_ATTR_RO(cntrltype);
394 
395 static ssize_t dctype_show(struct device *dev,
396 			   struct device_attribute *attr, char *buf)
397 {
398 	static const char * const type[] = {
399 		[NVME_DCTYPE_NOT_REPORTED] = "none\n",
400 		[NVME_DCTYPE_DDC] = "ddc\n",
401 		[NVME_DCTYPE_CDC] = "cdc\n",
402 	};
403 	struct nvme_ctrl *ctrl = dev_get_drvdata(dev);
404 
405 	if (ctrl->dctype > NVME_DCTYPE_CDC || !type[ctrl->dctype])
406 		return sysfs_emit(buf, "reserved\n");
407 
408 	return sysfs_emit(buf, type[ctrl->dctype]);
409 }
410 static DEVICE_ATTR_RO(dctype);
411 
412 #ifdef CONFIG_NVME_AUTH
413 static ssize_t nvme_ctrl_dhchap_secret_show(struct device *dev,
414 		struct device_attribute *attr, char *buf)
415 {
416 	struct nvme_ctrl *ctrl = dev_get_drvdata(dev);
417 	struct nvmf_ctrl_options *opts = ctrl->opts;
418 
419 	if (!opts->dhchap_secret)
420 		return sysfs_emit(buf, "none\n");
421 	return sysfs_emit(buf, "%s\n", opts->dhchap_secret);
422 }
423 
424 static ssize_t nvme_ctrl_dhchap_secret_store(struct device *dev,
425 		struct device_attribute *attr, const char *buf, size_t count)
426 {
427 	struct nvme_ctrl *ctrl = dev_get_drvdata(dev);
428 	struct nvmf_ctrl_options *opts = ctrl->opts;
429 	char *dhchap_secret;
430 
431 	if (!ctrl->opts->dhchap_secret)
432 		return -EINVAL;
433 	if (count < 7)
434 		return -EINVAL;
435 	if (memcmp(buf, "DHHC-1:", 7))
436 		return -EINVAL;
437 
438 	dhchap_secret = kzalloc(count + 1, GFP_KERNEL);
439 	if (!dhchap_secret)
440 		return -ENOMEM;
441 	memcpy(dhchap_secret, buf, count);
442 	nvme_auth_stop(ctrl);
443 	if (strcmp(dhchap_secret, opts->dhchap_secret)) {
444 		struct nvme_dhchap_key *key, *host_key;
445 		int ret;
446 
447 		ret = nvme_auth_generate_key(dhchap_secret, &key);
448 		if (ret) {
449 			kfree(dhchap_secret);
450 			return ret;
451 		}
452 		kfree(opts->dhchap_secret);
453 		opts->dhchap_secret = dhchap_secret;
454 		host_key = ctrl->host_key;
455 		mutex_lock(&ctrl->dhchap_auth_mutex);
456 		ctrl->host_key = key;
457 		mutex_unlock(&ctrl->dhchap_auth_mutex);
458 		nvme_auth_free_key(host_key);
459 	} else
460 		kfree(dhchap_secret);
461 	/* Start re-authentication */
462 	dev_info(ctrl->device, "re-authenticating controller\n");
463 	queue_work(nvme_wq, &ctrl->dhchap_auth_work);
464 
465 	return count;
466 }
467 
468 static DEVICE_ATTR(dhchap_secret, S_IRUGO | S_IWUSR,
469 	nvme_ctrl_dhchap_secret_show, nvme_ctrl_dhchap_secret_store);
470 
471 static ssize_t nvme_ctrl_dhchap_ctrl_secret_show(struct device *dev,
472 		struct device_attribute *attr, char *buf)
473 {
474 	struct nvme_ctrl *ctrl = dev_get_drvdata(dev);
475 	struct nvmf_ctrl_options *opts = ctrl->opts;
476 
477 	if (!opts->dhchap_ctrl_secret)
478 		return sysfs_emit(buf, "none\n");
479 	return sysfs_emit(buf, "%s\n", opts->dhchap_ctrl_secret);
480 }
481 
482 static ssize_t nvme_ctrl_dhchap_ctrl_secret_store(struct device *dev,
483 		struct device_attribute *attr, const char *buf, size_t count)
484 {
485 	struct nvme_ctrl *ctrl = dev_get_drvdata(dev);
486 	struct nvmf_ctrl_options *opts = ctrl->opts;
487 	char *dhchap_secret;
488 
489 	if (!ctrl->opts->dhchap_ctrl_secret)
490 		return -EINVAL;
491 	if (count < 7)
492 		return -EINVAL;
493 	if (memcmp(buf, "DHHC-1:", 7))
494 		return -EINVAL;
495 
496 	dhchap_secret = kzalloc(count + 1, GFP_KERNEL);
497 	if (!dhchap_secret)
498 		return -ENOMEM;
499 	memcpy(dhchap_secret, buf, count);
500 	nvme_auth_stop(ctrl);
501 	if (strcmp(dhchap_secret, opts->dhchap_ctrl_secret)) {
502 		struct nvme_dhchap_key *key, *ctrl_key;
503 		int ret;
504 
505 		ret = nvme_auth_generate_key(dhchap_secret, &key);
506 		if (ret) {
507 			kfree(dhchap_secret);
508 			return ret;
509 		}
510 		kfree(opts->dhchap_ctrl_secret);
511 		opts->dhchap_ctrl_secret = dhchap_secret;
512 		ctrl_key = ctrl->ctrl_key;
513 		mutex_lock(&ctrl->dhchap_auth_mutex);
514 		ctrl->ctrl_key = key;
515 		mutex_unlock(&ctrl->dhchap_auth_mutex);
516 		nvme_auth_free_key(ctrl_key);
517 	} else
518 		kfree(dhchap_secret);
519 	/* Start re-authentication */
520 	dev_info(ctrl->device, "re-authenticating controller\n");
521 	queue_work(nvme_wq, &ctrl->dhchap_auth_work);
522 
523 	return count;
524 }
525 
526 static DEVICE_ATTR(dhchap_ctrl_secret, S_IRUGO | S_IWUSR,
527 	nvme_ctrl_dhchap_ctrl_secret_show, nvme_ctrl_dhchap_ctrl_secret_store);
528 #endif
529 
530 static struct attribute *nvme_dev_attrs[] = {
531 	&dev_attr_reset_controller.attr,
532 	&dev_attr_rescan_controller.attr,
533 	&dev_attr_model.attr,
534 	&dev_attr_serial.attr,
535 	&dev_attr_firmware_rev.attr,
536 	&dev_attr_cntlid.attr,
537 	&dev_attr_delete_controller.attr,
538 	&dev_attr_transport.attr,
539 	&dev_attr_subsysnqn.attr,
540 	&dev_attr_address.attr,
541 	&dev_attr_state.attr,
542 	&dev_attr_numa_node.attr,
543 	&dev_attr_queue_count.attr,
544 	&dev_attr_sqsize.attr,
545 	&dev_attr_hostnqn.attr,
546 	&dev_attr_hostid.attr,
547 	&dev_attr_ctrl_loss_tmo.attr,
548 	&dev_attr_reconnect_delay.attr,
549 	&dev_attr_fast_io_fail_tmo.attr,
550 	&dev_attr_kato.attr,
551 	&dev_attr_cntrltype.attr,
552 	&dev_attr_dctype.attr,
553 #ifdef CONFIG_NVME_AUTH
554 	&dev_attr_dhchap_secret.attr,
555 	&dev_attr_dhchap_ctrl_secret.attr,
556 #endif
557 	NULL
558 };
559 
560 static umode_t nvme_dev_attrs_are_visible(struct kobject *kobj,
561 		struct attribute *a, int n)
562 {
563 	struct device *dev = container_of(kobj, struct device, kobj);
564 	struct nvme_ctrl *ctrl = dev_get_drvdata(dev);
565 
566 	if (a == &dev_attr_delete_controller.attr && !ctrl->ops->delete_ctrl)
567 		return 0;
568 	if (a == &dev_attr_address.attr && !ctrl->ops->get_address)
569 		return 0;
570 	if (a == &dev_attr_hostnqn.attr && !ctrl->opts)
571 		return 0;
572 	if (a == &dev_attr_hostid.attr && !ctrl->opts)
573 		return 0;
574 	if (a == &dev_attr_ctrl_loss_tmo.attr && !ctrl->opts)
575 		return 0;
576 	if (a == &dev_attr_reconnect_delay.attr && !ctrl->opts)
577 		return 0;
578 	if (a == &dev_attr_fast_io_fail_tmo.attr && !ctrl->opts)
579 		return 0;
580 #ifdef CONFIG_NVME_AUTH
581 	if (a == &dev_attr_dhchap_secret.attr && !ctrl->opts)
582 		return 0;
583 	if (a == &dev_attr_dhchap_ctrl_secret.attr && !ctrl->opts)
584 		return 0;
585 #endif
586 
587 	return a->mode;
588 }
589 
590 const struct attribute_group nvme_dev_attrs_group = {
591 	.attrs		= nvme_dev_attrs,
592 	.is_visible	= nvme_dev_attrs_are_visible,
593 };
594 EXPORT_SYMBOL_GPL(nvme_dev_attrs_group);
595 
596 const struct attribute_group *nvme_dev_attr_groups[] = {
597 	&nvme_dev_attrs_group,
598 	NULL,
599 };
600 
601 #define SUBSYS_ATTR_RO(_name, _mode, _show)			\
602 	struct device_attribute subsys_attr_##_name = \
603 		__ATTR(_name, _mode, _show, NULL)
604 
605 static ssize_t nvme_subsys_show_nqn(struct device *dev,
606 				    struct device_attribute *attr,
607 				    char *buf)
608 {
609 	struct nvme_subsystem *subsys =
610 		container_of(dev, struct nvme_subsystem, dev);
611 
612 	return sysfs_emit(buf, "%s\n", subsys->subnqn);
613 }
614 static SUBSYS_ATTR_RO(subsysnqn, S_IRUGO, nvme_subsys_show_nqn);
615 
616 static ssize_t nvme_subsys_show_type(struct device *dev,
617 				    struct device_attribute *attr,
618 				    char *buf)
619 {
620 	struct nvme_subsystem *subsys =
621 		container_of(dev, struct nvme_subsystem, dev);
622 
623 	switch (subsys->subtype) {
624 	case NVME_NQN_DISC:
625 		return sysfs_emit(buf, "discovery\n");
626 	case NVME_NQN_NVME:
627 		return sysfs_emit(buf, "nvm\n");
628 	default:
629 		return sysfs_emit(buf, "reserved\n");
630 	}
631 }
632 static SUBSYS_ATTR_RO(subsystype, S_IRUGO, nvme_subsys_show_type);
633 
634 #define nvme_subsys_show_str_function(field)				\
635 static ssize_t subsys_##field##_show(struct device *dev,		\
636 			    struct device_attribute *attr, char *buf)	\
637 {									\
638 	struct nvme_subsystem *subsys =					\
639 		container_of(dev, struct nvme_subsystem, dev);		\
640 	return sysfs_emit(buf, "%.*s\n",				\
641 			   (int)sizeof(subsys->field), subsys->field);	\
642 }									\
643 static SUBSYS_ATTR_RO(field, S_IRUGO, subsys_##field##_show);
644 
645 nvme_subsys_show_str_function(model);
646 nvme_subsys_show_str_function(serial);
647 nvme_subsys_show_str_function(firmware_rev);
648 
649 static struct attribute *nvme_subsys_attrs[] = {
650 	&subsys_attr_model.attr,
651 	&subsys_attr_serial.attr,
652 	&subsys_attr_firmware_rev.attr,
653 	&subsys_attr_subsysnqn.attr,
654 	&subsys_attr_subsystype.attr,
655 #ifdef CONFIG_NVME_MULTIPATH
656 	&subsys_attr_iopolicy.attr,
657 #endif
658 	NULL,
659 };
660 
661 static const struct attribute_group nvme_subsys_attrs_group = {
662 	.attrs = nvme_subsys_attrs,
663 };
664 
665 const struct attribute_group *nvme_subsys_attrs_groups[] = {
666 	&nvme_subsys_attrs_group,
667 	NULL,
668 };
669