FILE
configfs.c
File preview with syntax highlighting.
linux-6.19.14/drivers/nvme/target/configfs.c
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/kstrtox.h> 8#include <linux/kernel.h> 9#include <linux/module.h> 10#include <linux/slab.h> 11#include <linux/stat.h> 12#include <linux/ctype.h> 13#include <linux/pci.h> 14#include <linux/pci-p2pdma.h> 15#ifdef CONFIG_NVME_TARGET_AUTH 16#include <linux/nvme-auth.h> 17#endif 18#include <linux/nvme-keyring.h> 19#include <crypto/hash.h> 20#include <crypto/kpp.h> 21#include <linux/nospec.h> 22 23#include "nvmet.h" 24 25static const struct config_item_type nvmet_host_type; 26static const struct config_item_type nvmet_subsys_type; 27 28static LIST_HEAD(nvmet_ports_list); 29struct list_head *nvmet_ports = &nvmet_ports_list; 30 31struct nvmet_type_name_map { 32 u8 type; 33 const char *name; 34}; 35 36static struct nvmet_type_name_map nvmet_transport[] = { 37 { NVMF_TRTYPE_RDMA, "rdma" }, 38 { NVMF_TRTYPE_FC, "fc" }, 39 { NVMF_TRTYPE_TCP, "tcp" }, 40 { NVMF_TRTYPE_PCI, "pci" }, 41 { NVMF_TRTYPE_LOOP, "loop" }, 42}; 43 44static const struct nvmet_type_name_map nvmet_addr_family[] = { 45 { NVMF_ADDR_FAMILY_PCI, "pcie" }, 46 { NVMF_ADDR_FAMILY_IP4, "ipv4" }, 47 { NVMF_ADDR_FAMILY_IP6, "ipv6" }, 48 { NVMF_ADDR_FAMILY_IB, "ib" }, 49 { NVMF_ADDR_FAMILY_FC, "fc" }, 50 { NVMF_ADDR_FAMILY_PCI, "pci" }, 51 { NVMF_ADDR_FAMILY_LOOP, "loop" }, 52}; 53 54static bool nvmet_is_port_enabled(struct nvmet_port *p, const char *caller) 55{ 56 if (p->enabled) 57 pr_err("Disable port '%u' before changing attribute in %s\n", 58 le16_to_cpu(p->disc_addr.portid), caller); 59 return p->enabled; 60} 61 62/* 63 * nvmet_port Generic ConfigFS definitions. 64 * Used in any place in the ConfigFS tree that refers to an address. 65 */ 66static ssize_t nvmet_addr_adrfam_show(struct config_item *item, char *page) 67{ 68 u8 adrfam = to_nvmet_port(item)->disc_addr.adrfam; 69 int i; 70 71 for (i = 1; i < ARRAY_SIZE(nvmet_addr_family); i++) { 72 if (nvmet_addr_family[i].type == adrfam) 73 return snprintf(page, PAGE_SIZE, "%s\n", 74 nvmet_addr_family[i].name); 75 } 76 77 return snprintf(page, PAGE_SIZE, "\n"); 78} 79 80static ssize_t nvmet_addr_adrfam_store(struct config_item *item, 81 const char *page, size_t count) 82{ 83 struct nvmet_port *port = to_nvmet_port(item); 84 int i; 85 86 if (nvmet_is_port_enabled(port, __func__)) 87 return -EACCES; 88 89 for (i = 1; i < ARRAY_SIZE(nvmet_addr_family); i++) { 90 if (sysfs_streq(page, nvmet_addr_family[i].name)) 91 goto found; 92 } 93 94 pr_err("Invalid value '%s' for adrfam\n", page); 95 return -EINVAL; 96 97found: 98 port->disc_addr.adrfam = nvmet_addr_family[i].type; 99 return count; 100} 101 102CONFIGFS_ATTR(nvmet_, addr_adrfam); 103 104static ssize_t nvmet_addr_portid_show(struct config_item *item, 105 char *page) 106{ 107 __le16 portid = to_nvmet_port(item)->disc_addr.portid; 108 109 return snprintf(page, PAGE_SIZE, "%d\n", le16_to_cpu(portid)); 110} 111 112static ssize_t nvmet_addr_portid_store(struct config_item *item, 113 const char *page, size_t count) 114{ 115 struct nvmet_port *port = to_nvmet_port(item); 116 u16 portid = 0; 117 118 if (kstrtou16(page, 0, &portid)) { 119 pr_err("Invalid value '%s' for portid\n", page); 120 return -EINVAL; 121 } 122 123 if (nvmet_is_port_enabled(port, __func__)) 124 return -EACCES; 125 126 port->disc_addr.portid = cpu_to_le16(portid); 127 return count; 128} 129 130CONFIGFS_ATTR(nvmet_, addr_portid); 131 132static ssize_t nvmet_addr_traddr_show(struct config_item *item, 133 char *page) 134{ 135 struct nvmet_port *port = to_nvmet_port(item); 136 137 return snprintf(page, PAGE_SIZE, "%s\n", port->disc_addr.traddr); 138} 139 140static ssize_t nvmet_addr_traddr_store(struct config_item *item, 141 const char *page, size_t count) 142{ 143 struct nvmet_port *port = to_nvmet_port(item); 144 145 if (count > NVMF_TRADDR_SIZE) { 146 pr_err("Invalid value '%s' for traddr\n", page); 147 return -EINVAL; 148 } 149 150 if (nvmet_is_port_enabled(port, __func__)) 151 return -EACCES; 152 153 if (sscanf(page, "%s\n", port->disc_addr.traddr) != 1) 154 return -EINVAL; 155 return count; 156} 157 158CONFIGFS_ATTR(nvmet_, addr_traddr); 159 160static const struct nvmet_type_name_map nvmet_addr_treq[] = { 161 { NVMF_TREQ_NOT_SPECIFIED, "not specified" }, 162 { NVMF_TREQ_REQUIRED, "required" }, 163 { NVMF_TREQ_NOT_REQUIRED, "not required" }, 164}; 165 166static inline u8 nvmet_port_disc_addr_treq_mask(struct nvmet_port *port) 167{ 168 return (port->disc_addr.treq & ~NVME_TREQ_SECURE_CHANNEL_MASK); 169} 170 171static ssize_t nvmet_addr_treq_show(struct config_item *item, char *page) 172{ 173 u8 treq = nvmet_port_disc_addr_treq_secure_channel(to_nvmet_port(item)); 174 int i; 175 176 for (i = 0; i < ARRAY_SIZE(nvmet_addr_treq); i++) { 177 if (treq == nvmet_addr_treq[i].type) 178 return snprintf(page, PAGE_SIZE, "%s\n", 179 nvmet_addr_treq[i].name); 180 } 181 182 return snprintf(page, PAGE_SIZE, "\n"); 183} 184 185static ssize_t nvmet_addr_treq_store(struct config_item *item, 186 const char *page, size_t count) 187{ 188 struct nvmet_port *port = to_nvmet_port(item); 189 u8 treq = nvmet_port_disc_addr_treq_mask(port); 190 int i; 191 192 if (nvmet_is_port_enabled(port, __func__)) 193 return -EACCES; 194 195 for (i = 0; i < ARRAY_SIZE(nvmet_addr_treq); i++) { 196 if (sysfs_streq(page, nvmet_addr_treq[i].name)) 197 goto found; 198 } 199 200 pr_err("Invalid value '%s' for treq\n", page); 201 return -EINVAL; 202 203found: 204 if (port->disc_addr.trtype == NVMF_TRTYPE_TCP && 205 port->disc_addr.tsas.tcp.sectype == NVMF_TCP_SECTYPE_TLS13) { 206 switch (nvmet_addr_treq[i].type) { 207 case NVMF_TREQ_NOT_SPECIFIED: 208 pr_debug("treq '%s' not allowed for TLS1.3\n", 209 nvmet_addr_treq[i].name); 210 return -EINVAL; 211 case NVMF_TREQ_NOT_REQUIRED: 212 pr_warn("Allow non-TLS connections while TLS1.3 is enabled\n"); 213 break; 214 default: 215 break; 216 } 217 } 218 treq |= nvmet_addr_treq[i].type; 219 port->disc_addr.treq = treq; 220 return count; 221} 222 223CONFIGFS_ATTR(nvmet_, addr_treq); 224 225static ssize_t nvmet_addr_trsvcid_show(struct config_item *item, 226 char *page) 227{ 228 struct nvmet_port *port = to_nvmet_port(item); 229 230 return snprintf(page, PAGE_SIZE, "%s\n", port->disc_addr.trsvcid); 231} 232 233static ssize_t nvmet_addr_trsvcid_store(struct config_item *item, 234 const char *page, size_t count) 235{ 236 struct nvmet_port *port = to_nvmet_port(item); 237 238 if (count > NVMF_TRSVCID_SIZE) { 239 pr_err("Invalid value '%s' for trsvcid\n", page); 240 return -EINVAL; 241 } 242 if (nvmet_is_port_enabled(port, __func__)) 243 return -EACCES; 244 245 if (sscanf(page, "%s\n", port->disc_addr.trsvcid) != 1) 246 return -EINVAL; 247 return count; 248} 249 250CONFIGFS_ATTR(nvmet_, addr_trsvcid); 251 252static ssize_t nvmet_param_inline_data_size_show(struct config_item *item, 253 char *page) 254{ 255 struct nvmet_port *port = to_nvmet_port(item); 256 257 return snprintf(page, PAGE_SIZE, "%d\n", port->inline_data_size); 258} 259 260static ssize_t nvmet_param_inline_data_size_store(struct config_item *item, 261 const char *page, size_t count) 262{ 263 struct nvmet_port *port = to_nvmet_port(item); 264 int ret; 265 266 if (nvmet_is_port_enabled(port, __func__)) 267 return -EACCES; 268 ret = kstrtoint(page, 0, &port->inline_data_size); 269 if (ret) { 270 pr_err("Invalid value '%s' for inline_data_size\n", page); 271 return -EINVAL; 272 } 273 return count; 274} 275 276CONFIGFS_ATTR(nvmet_, param_inline_data_size); 277 278static ssize_t nvmet_param_max_queue_size_show(struct config_item *item, 279 char *page) 280{ 281 struct nvmet_port *port = to_nvmet_port(item); 282 283 return snprintf(page, PAGE_SIZE, "%d\n", port->max_queue_size); 284} 285 286static ssize_t nvmet_param_max_queue_size_store(struct config_item *item, 287 const char *page, size_t count) 288{ 289 struct nvmet_port *port = to_nvmet_port(item); 290 int ret; 291 292 if (nvmet_is_port_enabled(port, __func__)) 293 return -EACCES; 294 ret = kstrtoint(page, 0, &port->max_queue_size); 295 if (ret) { 296 pr_err("Invalid value '%s' for max_queue_size\n", page); 297 return -EINVAL; 298 } 299 return count; 300} 301 302CONFIGFS_ATTR(nvmet_, param_max_queue_size); 303 304#ifdef CONFIG_BLK_DEV_INTEGRITY 305static ssize_t nvmet_param_pi_enable_show(struct config_item *item, 306 char *page) 307{ 308 struct nvmet_port *port = to_nvmet_port(item); 309 310 return snprintf(page, PAGE_SIZE, "%d\n", port->pi_enable); 311} 312 313static ssize_t nvmet_param_pi_enable_store(struct config_item *item, 314 const char *page, size_t count) 315{ 316 struct nvmet_port *port = to_nvmet_port(item); 317 bool val; 318 319 if (kstrtobool(page, &val)) 320 return -EINVAL; 321 322 if (nvmet_is_port_enabled(port, __func__)) 323 return -EACCES; 324 325 port->pi_enable = val; 326 return count; 327} 328 329CONFIGFS_ATTR(nvmet_, param_pi_enable); 330#endif 331 332static ssize_t nvmet_addr_trtype_show(struct config_item *item, 333 char *page) 334{ 335 struct nvmet_port *port = to_nvmet_port(item); 336 int i; 337 338 for (i = 0; i < ARRAY_SIZE(nvmet_transport); i++) { 339 if (port->disc_addr.trtype == nvmet_transport[i].type) 340 return snprintf(page, PAGE_SIZE, 341 "%s\n", nvmet_transport[i].name); 342 } 343 344 return sprintf(page, "\n"); 345} 346 347static void nvmet_port_init_tsas_rdma(struct nvmet_port *port) 348{ 349 port->disc_addr.tsas.rdma.qptype = NVMF_RDMA_QPTYPE_CONNECTED; 350 port->disc_addr.tsas.rdma.prtype = NVMF_RDMA_PRTYPE_NOT_SPECIFIED; 351 port->disc_addr.tsas.rdma.cms = NVMF_RDMA_CMS_RDMA_CM; 352} 353 354static void nvmet_port_init_tsas_tcp(struct nvmet_port *port, int sectype) 355{ 356 port->disc_addr.tsas.tcp.sectype = sectype; 357} 358 359static ssize_t nvmet_addr_trtype_store(struct config_item *item, 360 const char *page, size_t count) 361{ 362 struct nvmet_port *port = to_nvmet_port(item); 363 int i; 364 365 if (nvmet_is_port_enabled(port, __func__)) 366 return -EACCES; 367 368 for (i = 0; i < ARRAY_SIZE(nvmet_transport); i++) { 369 if (sysfs_streq(page, nvmet_transport[i].name)) 370 goto found; 371 } 372 373 pr_err("Invalid value '%s' for trtype\n", page); 374 return -EINVAL; 375 376found: 377 memset(&port->disc_addr.tsas, 0, NVMF_TSAS_SIZE); 378 port->disc_addr.trtype = nvmet_transport[i].type; 379 if (port->disc_addr.trtype == NVMF_TRTYPE_RDMA) 380 nvmet_port_init_tsas_rdma(port); 381 else if (port->disc_addr.trtype == NVMF_TRTYPE_TCP) 382 nvmet_port_init_tsas_tcp(port, NVMF_TCP_SECTYPE_NONE); 383 return count; 384} 385 386CONFIGFS_ATTR(nvmet_, addr_trtype); 387 388static const struct nvmet_type_name_map nvmet_addr_tsas_tcp[] = { 389 { NVMF_TCP_SECTYPE_NONE, "none" }, 390 { NVMF_TCP_SECTYPE_TLS13, "tls1.3" }, 391}; 392 393static const struct nvmet_type_name_map nvmet_addr_tsas_rdma[] = { 394 { NVMF_RDMA_QPTYPE_CONNECTED, "connected" }, 395 { NVMF_RDMA_QPTYPE_DATAGRAM, "datagram" }, 396}; 397 398static ssize_t nvmet_addr_tsas_show(struct config_item *item, 399 char *page) 400{ 401 struct nvmet_port *port = to_nvmet_port(item); 402 int i; 403 404 if (port->disc_addr.trtype == NVMF_TRTYPE_TCP) { 405 for (i = 0; i < ARRAY_SIZE(nvmet_addr_tsas_tcp); i++) { 406 if (port->disc_addr.tsas.tcp.sectype == nvmet_addr_tsas_tcp[i].type) 407 return sprintf(page, "%s\n", nvmet_addr_tsas_tcp[i].name); 408 } 409 } else if (port->disc_addr.trtype == NVMF_TRTYPE_RDMA) { 410 for (i = 0; i < ARRAY_SIZE(nvmet_addr_tsas_rdma); i++) { 411 if (port->disc_addr.tsas.rdma.qptype == nvmet_addr_tsas_rdma[i].type) 412 return sprintf(page, "%s\n", nvmet_addr_tsas_rdma[i].name); 413 } 414 } 415 return sprintf(page, "\n"); 416} 417 418static u8 nvmet_addr_tsas_rdma_store(const char *page) 419{ 420 int i; 421 422 for (i = 0; i < ARRAY_SIZE(nvmet_addr_tsas_rdma); i++) { 423 if (sysfs_streq(page, nvmet_addr_tsas_rdma[i].name)) 424 return nvmet_addr_tsas_rdma[i].type; 425 } 426 return NVMF_RDMA_QPTYPE_INVALID; 427} 428 429static u8 nvmet_addr_tsas_tcp_store(const char *page) 430{ 431 int i; 432 433 for (i = 0; i < ARRAY_SIZE(nvmet_addr_tsas_tcp); i++) { 434 if (sysfs_streq(page, nvmet_addr_tsas_tcp[i].name)) 435 return nvmet_addr_tsas_tcp[i].type; 436 } 437 return NVMF_TCP_SECTYPE_INVALID; 438} 439 440static ssize_t nvmet_addr_tsas_store(struct config_item *item, 441 const char *page, size_t count) 442{ 443 struct nvmet_port *port = to_nvmet_port(item); 444 u8 treq = nvmet_port_disc_addr_treq_mask(port); 445 u8 sectype, qptype; 446 447 if (nvmet_is_port_enabled(port, __func__)) 448 return -EACCES; 449 450 if (port->disc_addr.trtype == NVMF_TRTYPE_RDMA) { 451 qptype = nvmet_addr_tsas_rdma_store(page); 452 if (qptype == port->disc_addr.tsas.rdma.qptype) 453 return count; 454 } else if (port->disc_addr.trtype == NVMF_TRTYPE_TCP) { 455 sectype = nvmet_addr_tsas_tcp_store(page); 456 if (sectype != NVMF_TCP_SECTYPE_INVALID) 457 goto found; 458 } 459 460 pr_err("Invalid value '%s' for tsas\n", page); 461 return -EINVAL; 462 463found: 464 if (sectype == NVMF_TCP_SECTYPE_TLS13) { 465 if (!IS_ENABLED(CONFIG_NVME_TARGET_TCP_TLS)) { 466 pr_err("TLS is not supported\n"); 467 return -EINVAL; 468 } 469 if (!port->keyring) { 470 pr_err("TLS keyring not configured\n"); 471 return -EINVAL; 472 } 473 } 474 475 nvmet_port_init_tsas_tcp(port, sectype); 476 /* 477 * If TLS is enabled TREQ should be set to 'required' per default 478 */ 479 if (sectype == NVMF_TCP_SECTYPE_TLS13) { 480 u8 sc = nvmet_port_disc_addr_treq_secure_channel(port); 481 482 if (sc == NVMF_TREQ_NOT_SPECIFIED) 483 treq |= NVMF_TREQ_REQUIRED; 484 else 485 treq |= sc; 486 } else { 487 treq |= NVMF_TREQ_NOT_SPECIFIED; 488 } 489 port->disc_addr.treq = treq; 490 return count; 491} 492 493CONFIGFS_ATTR(nvmet_, addr_tsas); 494 495/* 496 * Namespace structures & file operation functions below 497 */ 498static ssize_t nvmet_ns_device_path_show(struct config_item *item, char *page) 499{ 500 return sprintf(page, "%s\n", to_nvmet_ns(item)->device_path); 501} 502 503static ssize_t nvmet_ns_device_path_store(struct config_item *item, 504 const char *page, size_t count) 505{ 506 struct nvmet_ns *ns = to_nvmet_ns(item); 507 struct nvmet_subsys *subsys = ns->subsys; 508 size_t len; 509 int ret; 510 511 mutex_lock(&subsys->lock); 512 ret = -EBUSY; 513 if (ns->enabled) 514 goto out_unlock; 515 516 ret = -EINVAL; 517 len = strcspn(page, "\n"); 518 if (!len) 519 goto out_unlock; 520 521 kfree(ns->device_path); 522 ret = -ENOMEM; 523 ns->device_path = kmemdup_nul(page, len, GFP_KERNEL); 524 if (!ns->device_path) 525 goto out_unlock; 526 527 mutex_unlock(&subsys->lock); 528 return count; 529 530out_unlock: 531 mutex_unlock(&subsys->lock); 532 return ret; 533} 534 535CONFIGFS_ATTR(nvmet_ns_, device_path); 536 537#ifdef CONFIG_PCI_P2PDMA 538static ssize_t nvmet_ns_p2pmem_show(struct config_item *item, char *page) 539{ 540 struct nvmet_ns *ns = to_nvmet_ns(item); 541 542 return pci_p2pdma_enable_show(page, ns->p2p_dev, ns->use_p2pmem); 543} 544 545static ssize_t nvmet_ns_p2pmem_store(struct config_item *item, 546 const char *page, size_t count) 547{ 548 struct nvmet_ns *ns = to_nvmet_ns(item); 549 struct pci_dev *p2p_dev = NULL; 550 bool use_p2pmem; 551 int ret = count; 552 int error; 553 554 mutex_lock(&ns->subsys->lock); 555 if (ns->enabled) { 556 ret = -EBUSY; 557 goto out_unlock; 558 } 559 560 error = pci_p2pdma_enable_store(page, &p2p_dev, &use_p2pmem); 561 if (error) { 562 ret = error; 563 goto out_unlock; 564 } 565 566 ns->use_p2pmem = use_p2pmem; 567 pci_dev_put(ns->p2p_dev); 568 ns->p2p_dev = p2p_dev; 569 570out_unlock: 571 mutex_unlock(&ns->subsys->lock); 572 573 return ret; 574} 575 576CONFIGFS_ATTR(nvmet_ns_, p2pmem); 577#endif /* CONFIG_PCI_P2PDMA */ 578 579static ssize_t nvmet_ns_device_uuid_show(struct config_item *item, char *page) 580{ 581 return sprintf(page, "%pUb\n", &to_nvmet_ns(item)->uuid); 582} 583 584static ssize_t nvmet_ns_device_uuid_store(struct config_item *item, 585 const char *page, size_t count) 586{ 587 struct nvmet_ns *ns = to_nvmet_ns(item); 588 struct nvmet_subsys *subsys = ns->subsys; 589 int ret = 0; 590 591 mutex_lock(&subsys->lock); 592 if (ns->enabled) { 593 ret = -EBUSY; 594 goto out_unlock; 595 } 596 597 if (uuid_parse(page, &ns->uuid)) 598 ret = -EINVAL; 599 600out_unlock: 601 mutex_unlock(&subsys->lock); 602 return ret ? ret : count; 603} 604 605CONFIGFS_ATTR(nvmet_ns_, device_uuid); 606 607static ssize_t nvmet_ns_device_nguid_show(struct config_item *item, char *page) 608{ 609 return sprintf(page, "%pUb\n", &to_nvmet_ns(item)->nguid); 610} 611 612static ssize_t nvmet_ns_device_nguid_store(struct config_item *item, 613 const char *page, size_t count) 614{ 615 struct nvmet_ns *ns = to_nvmet_ns(item); 616 struct nvmet_subsys *subsys = ns->subsys; 617 u8 nguid[16]; 618 const char *p = page; 619 int i; 620 int ret = 0; 621 622 mutex_lock(&subsys->lock); 623 if (ns->enabled) { 624 ret = -EBUSY; 625 goto out_unlock; 626 } 627 628 for (i = 0; i < 16; i++) { 629 if (p + 2 > page + count) { 630 ret = -EINVAL; 631 goto out_unlock; 632 } 633 if (!isxdigit(p[0]) || !isxdigit(p[1])) { 634 ret = -EINVAL; 635 goto out_unlock; 636 } 637 638 nguid[i] = (hex_to_bin(p[0]) << 4) | hex_to_bin(p[1]); 639 p += 2; 640 641 if (*p == '-' || *p == ':') 642 p++; 643 } 644 645 memcpy(&ns->nguid, nguid, sizeof(nguid)); 646out_unlock: 647 mutex_unlock(&subsys->lock); 648 return ret ? ret : count; 649} 650 651CONFIGFS_ATTR(nvmet_ns_, device_nguid); 652 653static ssize_t nvmet_ns_ana_grpid_show(struct config_item *item, char *page) 654{ 655 return sprintf(page, "%u\n", to_nvmet_ns(item)->anagrpid); 656} 657 658static ssize_t nvmet_ns_ana_grpid_store(struct config_item *item, 659 const char *page, size_t count) 660{ 661 struct nvmet_ns *ns = to_nvmet_ns(item); 662 u32 oldgrpid, newgrpid; 663 int ret; 664 665 ret = kstrtou32(page, 0, &newgrpid); 666 if (ret) 667 return ret; 668 669 if (newgrpid < 1 || newgrpid > NVMET_MAX_ANAGRPS) 670 return -EINVAL; 671 672 down_write(&nvmet_ana_sem); 673 oldgrpid = ns->anagrpid; 674 newgrpid = array_index_nospec(newgrpid, NVMET_MAX_ANAGRPS); 675 nvmet_ana_group_enabled[newgrpid]++; 676 ns->anagrpid = newgrpid; 677 nvmet_ana_group_enabled[oldgrpid]--; 678 nvmet_ana_chgcnt++; 679 up_write(&nvmet_ana_sem); 680 681 nvmet_send_ana_event(ns->subsys, NULL); 682 return count; 683} 684 685CONFIGFS_ATTR(nvmet_ns_, ana_grpid); 686 687static ssize_t nvmet_ns_enable_show(struct config_item *item, char *page) 688{ 689 return sprintf(page, "%d\n", to_nvmet_ns(item)->enabled); 690} 691 692static ssize_t nvmet_ns_enable_store(struct config_item *item, 693 const char *page, size_t count) 694{ 695 struct nvmet_ns *ns = to_nvmet_ns(item); 696 bool enable; 697 int ret = 0; 698 699 if (kstrtobool(page, &enable)) 700 return -EINVAL; 701 702 /* 703 * take a global nvmet_config_sem because the disable routine has a 704 * window where it releases the subsys-lock, giving a chance to 705 * a parallel enable to concurrently execute causing the disable to 706 * have a misaccounting of the ns percpu_ref. 707 */ 708 down_write(&nvmet_config_sem); 709 if (enable) 710 ret = nvmet_ns_enable(ns); 711 else 712 nvmet_ns_disable(ns); 713 up_write(&nvmet_config_sem); 714 715 return ret ? ret : count; 716} 717 718CONFIGFS_ATTR(nvmet_ns_, enable); 719 720static ssize_t nvmet_ns_buffered_io_show(struct config_item *item, char *page) 721{ 722 return sprintf(page, "%d\n", to_nvmet_ns(item)->buffered_io); 723} 724 725static ssize_t nvmet_ns_buffered_io_store(struct config_item *item, 726 const char *page, size_t count) 727{ 728 struct nvmet_ns *ns = to_nvmet_ns(item); 729 bool val; 730 731 if (kstrtobool(page, &val)) 732 return -EINVAL; 733 734 mutex_lock(&ns->subsys->lock); 735 if (ns->enabled) { 736 pr_err("disable ns before setting buffered_io value.\n"); 737 mutex_unlock(&ns->subsys->lock); 738 return -EINVAL; 739 } 740 741 ns->buffered_io = val; 742 mutex_unlock(&ns->subsys->lock); 743 return count; 744} 745 746CONFIGFS_ATTR(nvmet_ns_, buffered_io); 747 748static ssize_t nvmet_ns_revalidate_size_store(struct config_item *item, 749 const char *page, size_t count) 750{ 751 struct nvmet_ns *ns = to_nvmet_ns(item); 752 bool val; 753 754 if (kstrtobool(page, &val)) 755 return -EINVAL; 756 757 if (!val) 758 return -EINVAL; 759 760 mutex_lock(&ns->subsys->lock); 761 if (!ns->enabled) { 762 pr_err("enable ns before revalidate.\n"); 763 mutex_unlock(&ns->subsys->lock); 764 return -EINVAL; 765 } 766 if (nvmet_ns_revalidate(ns)) 767 nvmet_ns_changed(ns->subsys, ns->nsid); 768 mutex_unlock(&ns->subsys->lock); 769 return count; 770} 771 772CONFIGFS_ATTR_WO(nvmet_ns_, revalidate_size); 773 774static ssize_t nvmet_ns_resv_enable_show(struct config_item *item, char *page) 775{ 776 return sysfs_emit(page, "%d\n", to_nvmet_ns(item)->pr.enable); 777} 778 779static ssize_t nvmet_ns_resv_enable_store(struct config_item *item, 780 const char *page, size_t count) 781{ 782 struct nvmet_ns *ns = to_nvmet_ns(item); 783 bool val; 784 785 if (kstrtobool(page, &val)) 786 return -EINVAL; 787 788 mutex_lock(&ns->subsys->lock); 789 if (ns->enabled) { 790 pr_err("the ns:%d is already enabled.\n", ns->nsid); 791 mutex_unlock(&ns->subsys->lock); 792 return -EINVAL; 793 } 794 ns->pr.enable = val; 795 mutex_unlock(&ns->subsys->lock); 796 return count; 797} 798CONFIGFS_ATTR(nvmet_ns_, resv_enable); 799 800static struct configfs_attribute *nvmet_ns_attrs[] = { 801 &nvmet_ns_attr_device_path, 802 &nvmet_ns_attr_device_nguid, 803 &nvmet_ns_attr_device_uuid, 804 &nvmet_ns_attr_ana_grpid, 805 &nvmet_ns_attr_enable, 806 &nvmet_ns_attr_buffered_io, 807 &nvmet_ns_attr_revalidate_size, 808 &nvmet_ns_attr_resv_enable, 809#ifdef CONFIG_PCI_P2PDMA 810 &nvmet_ns_attr_p2pmem, 811#endif 812 NULL, 813}; 814 815static void nvmet_ns_release(struct config_item *item) 816{ 817 struct nvmet_ns *ns = to_nvmet_ns(item); 818 819 nvmet_ns_free(ns); 820} 821 822static struct configfs_item_operations nvmet_ns_item_ops = { 823 .release = nvmet_ns_release, 824}; 825 826static const struct config_item_type nvmet_ns_type = { 827 .ct_item_ops = &nvmet_ns_item_ops, 828 .ct_attrs = nvmet_ns_attrs, 829 .ct_owner = THIS_MODULE, 830}; 831 832static struct config_group *nvmet_ns_make(struct config_group *group, 833 const char *name) 834{ 835 struct nvmet_subsys *subsys = namespaces_to_subsys(&group->cg_item); 836 struct nvmet_ns *ns; 837 int ret; 838 u32 nsid; 839 840 ret = kstrtou32(name, 0, &nsid); 841 if (ret) 842 goto out; 843 844 ret = -EINVAL; 845 if (nsid == 0 || nsid == NVME_NSID_ALL) { 846 pr_err("invalid nsid %#x", nsid); 847 goto out; 848 } 849 850 ret = -ENOMEM; 851 ns = nvmet_ns_alloc(subsys, nsid); 852 if (!ns) 853 goto out; 854 config_group_init_type_name(&ns->group, name, &nvmet_ns_type); 855 856 pr_info("adding nsid %d to subsystem %s\n", nsid, subsys->subsysnqn); 857 858 return &ns->group; 859out: 860 return ERR_PTR(ret); 861} 862 863static struct configfs_group_operations nvmet_namespaces_group_ops = { 864 .make_group = nvmet_ns_make, 865}; 866 867static const struct config_item_type nvmet_namespaces_type = { 868 .ct_group_ops = &nvmet_namespaces_group_ops, 869 .ct_owner = THIS_MODULE, 870}; 871 872#ifdef CONFIG_NVME_TARGET_PASSTHRU 873 874static ssize_t nvmet_passthru_device_path_show(struct config_item *item, 875 char *page) 876{ 877 struct nvmet_subsys *subsys = to_subsys(item->ci_parent); 878 879 return snprintf(page, PAGE_SIZE, "%s\n", subsys->passthru_ctrl_path); 880} 881 882static ssize_t nvmet_passthru_device_path_store(struct config_item *item, 883 const char *page, size_t count) 884{ 885 struct nvmet_subsys *subsys = to_subsys(item->ci_parent); 886 size_t len; 887 int ret; 888 889 mutex_lock(&subsys->lock); 890 891 ret = -EBUSY; 892 if (subsys->passthru_ctrl) 893 goto out_unlock; 894 895 ret = -EINVAL; 896 len = strcspn(page, "\n"); 897 if (!len) 898 goto out_unlock; 899 900 kfree(subsys->passthru_ctrl_path); 901 ret = -ENOMEM; 902 subsys->passthru_ctrl_path = kstrndup(page, len, GFP_KERNEL); 903 if (!subsys->passthru_ctrl_path) 904 goto out_unlock; 905 906 mutex_unlock(&subsys->lock); 907 908 return count; 909out_unlock: 910 mutex_unlock(&subsys->lock); 911 return ret; 912} 913CONFIGFS_ATTR(nvmet_passthru_, device_path); 914 915static ssize_t nvmet_passthru_enable_show(struct config_item *item, 916 char *page) 917{ 918 struct nvmet_subsys *subsys = to_subsys(item->ci_parent); 919 920 return sprintf(page, "%d\n", subsys->passthru_ctrl ? 1 : 0); 921} 922 923static ssize_t nvmet_passthru_enable_store(struct config_item *item, 924 const char *page, size_t count) 925{ 926 struct nvmet_subsys *subsys = to_subsys(item->ci_parent); 927 bool enable; 928 int ret = 0; 929 930 if (kstrtobool(page, &enable)) 931 return -EINVAL; 932 933 if (enable) 934 ret = nvmet_passthru_ctrl_enable(subsys); 935 else 936 nvmet_passthru_ctrl_disable(subsys); 937 938 return ret ? ret : count; 939} 940CONFIGFS_ATTR(nvmet_passthru_, enable); 941 942static ssize_t nvmet_passthru_admin_timeout_show(struct config_item *item, 943 char *page) 944{ 945 return sprintf(page, "%u\n", to_subsys(item->ci_parent)->admin_timeout); 946} 947 948static ssize_t nvmet_passthru_admin_timeout_store(struct config_item *item, 949 const char *page, size_t count) 950{ 951 struct nvmet_subsys *subsys = to_subsys(item->ci_parent); 952 unsigned int timeout; 953 954 if (kstrtouint(page, 0, &timeout)) 955 return -EINVAL; 956 subsys->admin_timeout = timeout; 957 return count; 958} 959CONFIGFS_ATTR(nvmet_passthru_, admin_timeout); 960 961static ssize_t nvmet_passthru_io_timeout_show(struct config_item *item, 962 char *page) 963{ 964 return sprintf(page, "%u\n", to_subsys(item->ci_parent)->io_timeout); 965} 966 967static ssize_t nvmet_passthru_io_timeout_store(struct config_item *item, 968 const char *page, size_t count) 969{ 970 struct nvmet_subsys *subsys = to_subsys(item->ci_parent); 971 unsigned int timeout; 972 973 if (kstrtouint(page, 0, &timeout)) 974 return -EINVAL; 975 subsys->io_timeout = timeout; 976 return count; 977} 978CONFIGFS_ATTR(nvmet_passthru_, io_timeout); 979 980static ssize_t nvmet_passthru_clear_ids_show(struct config_item *item, 981 char *page) 982{ 983 return sprintf(page, "%u\n", to_subsys(item->ci_parent)->clear_ids); 984} 985 986static ssize_t nvmet_passthru_clear_ids_store(struct config_item *item, 987 const char *page, size_t count) 988{ 989 struct nvmet_subsys *subsys = to_subsys(item->ci_parent); 990 unsigned int clear_ids; 991 992 if (kstrtouint(page, 0, &clear_ids)) 993 return -EINVAL; 994 subsys->clear_ids = clear_ids; 995 return count; 996} 997CONFIGFS_ATTR(nvmet_passthru_, clear_ids); 998 999static struct configfs_attribute *nvmet_passthru_attrs[] = { 1000 &nvmet_passthru_attr_device_path, 1001 &nvmet_passthru_attr_enable, 1002 &nvmet_passthru_attr_admin_timeout, 1003 &nvmet_passthru_attr_io_timeout, 1004 &nvmet_passthru_attr_clear_ids, 1005 NULL, 1006}; 1007 1008static const struct config_item_type nvmet_passthru_type = { 1009 .ct_attrs = nvmet_passthru_attrs, 1010 .ct_owner = THIS_MODULE, 1011}; 1012 1013static void nvmet_add_passthru_group(struct nvmet_subsys *subsys) 1014{ 1015 config_group_init_type_name(&subsys->passthru_group, 1016 "passthru", &nvmet_passthru_type); 1017 configfs_add_default_group(&subsys->passthru_group, 1018 &subsys->group); 1019} 1020 1021#else /* CONFIG_NVME_TARGET_PASSTHRU */ 1022 1023static void nvmet_add_passthru_group(struct nvmet_subsys *subsys) 1024{ 1025} 1026 1027#endif /* CONFIG_NVME_TARGET_PASSTHRU */ 1028 1029static int nvmet_port_subsys_allow_link(struct config_item *parent, 1030 struct config_item *target) 1031{ 1032 struct nvmet_port *port = to_nvmet_port(parent->ci_parent); 1033 struct nvmet_subsys *subsys; 1034 struct nvmet_subsys_link *link, *p; 1035 int ret; 1036 1037 if (target->ci_type != &nvmet_subsys_type) { 1038 pr_err("can only link subsystems into the subsystems dir.!\n"); 1039 return -EINVAL; 1040 } 1041 subsys = to_subsys(target); 1042 link = kmalloc(sizeof(*link), GFP_KERNEL); 1043 if (!link) 1044 return -ENOMEM; 1045 link->subsys = subsys; 1046 1047 down_write(&nvmet_config_sem); 1048 ret = -EEXIST; 1049 list_for_each_entry(p, &port->subsystems, entry) { 1050 if (p->subsys == subsys) 1051 goto out_free_link; 1052 } 1053 1054 if (list_empty(&port->subsystems)) { 1055 ret = nvmet_enable_port(port); 1056 if (ret) 1057 goto out_free_link; 1058 } 1059 1060 list_add_tail(&link->entry, &port->subsystems); 1061 nvmet_port_disc_changed(port, subsys); 1062 1063 up_write(&nvmet_config_sem); 1064 return 0; 1065 1066out_free_link: 1067 up_write(&nvmet_config_sem); 1068 kfree(link); 1069 return ret; 1070} 1071 1072static void nvmet_port_subsys_drop_link(struct config_item *parent, 1073 struct config_item *target) 1074{ 1075 struct nvmet_port *port = to_nvmet_port(parent->ci_parent); 1076 struct nvmet_subsys *subsys = to_subsys(target); 1077 struct nvmet_subsys_link *p; 1078 1079 down_write(&nvmet_config_sem); 1080 list_for_each_entry(p, &port->subsystems, entry) { 1081 if (p->subsys == subsys) 1082 goto found; 1083 } 1084 up_write(&nvmet_config_sem); 1085 return; 1086 1087found: 1088 list_del(&p->entry); 1089 nvmet_port_del_ctrls(port, subsys); 1090 nvmet_port_disc_changed(port, subsys); 1091 1092 if (list_empty(&port->subsystems)) 1093 nvmet_disable_port(port); 1094 up_write(&nvmet_config_sem); 1095 kfree(p); 1096} 1097 1098static struct configfs_item_operations nvmet_port_subsys_item_ops = { 1099 .allow_link = nvmet_port_subsys_allow_link, 1100 .drop_link = nvmet_port_subsys_drop_link, 1101}; 1102 1103static const struct config_item_type nvmet_port_subsys_type = { 1104 .ct_item_ops = &nvmet_port_subsys_item_ops, 1105 .ct_owner = THIS_MODULE, 1106}; 1107 1108static int nvmet_allowed_hosts_allow_link(struct config_item *parent, 1109 struct config_item *target) 1110{ 1111 struct nvmet_subsys *subsys = to_subsys(parent->ci_parent); 1112 struct nvmet_host *host; 1113 struct nvmet_host_link *link, *p; 1114 int ret; 1115 1116 if (target->ci_type != &nvmet_host_type) { 1117 pr_err("can only link hosts into the allowed_hosts directory!\n"); 1118 return -EINVAL; 1119 } 1120 1121 host = to_host(target); 1122 link = kmalloc(sizeof(*link), GFP_KERNEL); 1123 if (!link) 1124 return -ENOMEM; 1125 link->host = host; 1126 1127 down_write(&nvmet_config_sem); 1128 ret = -EINVAL; 1129 if (subsys->allow_any_host) { 1130 pr_err("can't add hosts when allow_any_host is set!\n"); 1131 goto out_free_link; 1132 } 1133 1134 ret = -EEXIST; 1135 list_for_each_entry(p, &subsys->hosts, entry) { 1136 if (!strcmp(nvmet_host_name(p->host), nvmet_host_name(host))) 1137 goto out_free_link; 1138 } 1139 list_add_tail(&link->entry, &subsys->hosts); 1140 nvmet_subsys_disc_changed(subsys, host); 1141 1142 up_write(&nvmet_config_sem); 1143 return 0; 1144out_free_link: 1145 up_write(&nvmet_config_sem); 1146 kfree(link); 1147 return ret; 1148} 1149 1150static void nvmet_allowed_hosts_drop_link(struct config_item *parent, 1151 struct config_item *target) 1152{ 1153 struct nvmet_subsys *subsys = to_subsys(parent->ci_parent); 1154 struct nvmet_host *host = to_host(target); 1155 struct nvmet_host_link *p; 1156 1157 down_write(&nvmet_config_sem); 1158 list_for_each_entry(p, &subsys->hosts, entry) { 1159 if (!strcmp(nvmet_host_name(p->host), nvmet_host_name(host))) 1160 goto found; 1161 } 1162 up_write(&nvmet_config_sem); 1163 return; 1164 1165found: 1166 list_del(&p->entry); 1167 nvmet_subsys_disc_changed(subsys, host); 1168 1169 up_write(&nvmet_config_sem); 1170 kfree(p); 1171} 1172 1173static struct configfs_item_operations nvmet_allowed_hosts_item_ops = { 1174 .allow_link = nvmet_allowed_hosts_allow_link, 1175 .drop_link = nvmet_allowed_hosts_drop_link, 1176}; 1177 1178static const struct config_item_type nvmet_allowed_hosts_type = { 1179 .ct_item_ops = &nvmet_allowed_hosts_item_ops, 1180 .ct_owner = THIS_MODULE, 1181}; 1182 1183static ssize_t nvmet_subsys_attr_allow_any_host_show(struct config_item *item, 1184 char *page) 1185{ 1186 return snprintf(page, PAGE_SIZE, "%d\n", 1187 to_subsys(item)->allow_any_host); 1188} 1189 1190static ssize_t nvmet_subsys_attr_allow_any_host_store(struct config_item *item, 1191 const char *page, size_t count) 1192{ 1193 struct nvmet_subsys *subsys = to_subsys(item); 1194 bool allow_any_host; 1195 int ret = 0; 1196 1197 if (kstrtobool(page, &allow_any_host)) 1198 return -EINVAL; 1199 1200 down_write(&nvmet_config_sem); 1201 if (allow_any_host && !list_empty(&subsys->hosts)) { 1202 pr_err("Can't set allow_any_host when explicit hosts are set!\n"); 1203 ret = -EINVAL; 1204 goto out_unlock; 1205 } 1206 1207 if (subsys->allow_any_host != allow_any_host) { 1208 subsys->allow_any_host = allow_any_host; 1209 nvmet_subsys_disc_changed(subsys, NULL); 1210 } 1211 1212out_unlock: 1213 up_write(&nvmet_config_sem); 1214 return ret ? ret : count; 1215} 1216 1217CONFIGFS_ATTR(nvmet_subsys_, attr_allow_any_host); 1218 1219static ssize_t nvmet_subsys_attr_version_show(struct config_item *item, 1220 char *page) 1221{ 1222 struct nvmet_subsys *subsys = to_subsys(item); 1223 1224 if (NVME_TERTIARY(subsys->ver)) 1225 return snprintf(page, PAGE_SIZE, "%llu.%llu.%llu\n", 1226 NVME_MAJOR(subsys->ver), 1227 NVME_MINOR(subsys->ver), 1228 NVME_TERTIARY(subsys->ver)); 1229 1230 return snprintf(page, PAGE_SIZE, "%llu.%llu\n", 1231 NVME_MAJOR(subsys->ver), 1232 NVME_MINOR(subsys->ver)); 1233} 1234 1235static ssize_t 1236nvmet_subsys_attr_version_store_locked(struct nvmet_subsys *subsys, 1237 const char *page, size_t count) 1238{ 1239 int major, minor, tertiary = 0; 1240 int ret; 1241 1242 if (subsys->subsys_discovered) { 1243 if (NVME_TERTIARY(subsys->ver)) 1244 pr_err("Can't set version number. %llu.%llu.%llu is already assigned\n", 1245 NVME_MAJOR(subsys->ver), 1246 NVME_MINOR(subsys->ver), 1247 NVME_TERTIARY(subsys->ver)); 1248 else 1249 pr_err("Can't set version number. %llu.%llu is already assigned\n", 1250 NVME_MAJOR(subsys->ver), 1251 NVME_MINOR(subsys->ver)); 1252 return -EINVAL; 1253 } 1254 1255 /* passthru subsystems use the underlying controller's version */ 1256 if (nvmet_is_passthru_subsys(subsys)) 1257 return -EINVAL; 1258 1259 ret = sscanf(page, "%d.%d.%d\n", &major, &minor, &tertiary); 1260 if (ret != 2 && ret != 3) 1261 return -EINVAL; 1262 1263 subsys->ver = NVME_VS(major, minor, tertiary); 1264 1265 return count; 1266} 1267 1268static ssize_t nvmet_subsys_attr_version_store(struct config_item *item, 1269 const char *page, size_t count) 1270{ 1271 struct nvmet_subsys *subsys = to_subsys(item); 1272 ssize_t ret; 1273 1274 down_write(&nvmet_config_sem); 1275 mutex_lock(&subsys->lock); 1276 ret = nvmet_subsys_attr_version_store_locked(subsys, page, count); 1277 mutex_unlock(&subsys->lock); 1278 up_write(&nvmet_config_sem); 1279 1280 return ret; 1281} 1282CONFIGFS_ATTR(nvmet_subsys_, attr_version); 1283 1284/* See Section 1.5 of NVMe 1.4 */ 1285static bool nvmet_is_ascii(const char c) 1286{ 1287 return c >= 0x20 && c <= 0x7e; 1288} 1289 1290static ssize_t nvmet_subsys_attr_serial_show(struct config_item *item, 1291 char *page) 1292{ 1293 struct nvmet_subsys *subsys = to_subsys(item); 1294 1295 return snprintf(page, PAGE_SIZE, "%.*s\n", 1296 NVMET_SN_MAX_SIZE, subsys->serial); 1297} 1298 1299static ssize_t 1300nvmet_subsys_attr_serial_store_locked(struct nvmet_subsys *subsys, 1301 const char *page, size_t count) 1302{ 1303 int pos, len = strcspn(page, "\n"); 1304 1305 if (subsys->subsys_discovered) { 1306 pr_err("Can't set serial number. %s is already assigned\n", 1307 subsys->serial); 1308 return -EINVAL; 1309 } 1310 1311 if (!len || len > NVMET_SN_MAX_SIZE) { 1312 pr_err("Serial Number can not be empty or exceed %d Bytes\n", 1313 NVMET_SN_MAX_SIZE); 1314 return -EINVAL; 1315 } 1316 1317 for (pos = 0; pos < len; pos++) { 1318 if (!nvmet_is_ascii(page[pos])) { 1319 pr_err("Serial Number must contain only ASCII strings\n"); 1320 return -EINVAL; 1321 } 1322 } 1323 1324 memcpy_and_pad(subsys->serial, NVMET_SN_MAX_SIZE, page, len, ' '); 1325 1326 return count; 1327} 1328 1329static ssize_t nvmet_subsys_attr_serial_store(struct config_item *item, 1330 const char *page, size_t count) 1331{ 1332 struct nvmet_subsys *subsys = to_subsys(item); 1333 ssize_t ret; 1334 1335 down_write(&nvmet_config_sem); 1336 mutex_lock(&subsys->lock); 1337 ret = nvmet_subsys_attr_serial_store_locked(subsys, page, count); 1338 mutex_unlock(&subsys->lock); 1339 up_write(&nvmet_config_sem); 1340 1341 return ret; 1342} 1343CONFIGFS_ATTR(nvmet_subsys_, attr_serial); 1344 1345static ssize_t nvmet_subsys_attr_cntlid_min_show(struct config_item *item, 1346 char *page) 1347{ 1348 return snprintf(page, PAGE_SIZE, "%u\n", to_subsys(item)->cntlid_min); 1349} 1350 1351static ssize_t nvmet_subsys_attr_cntlid_min_store(struct config_item *item, 1352 const char *page, size_t cnt) 1353{ 1354 u16 cntlid_min; 1355 1356 if (sscanf(page, "%hu\n", &cntlid_min) != 1) 1357 return -EINVAL; 1358 1359 if (cntlid_min == 0) 1360 return -EINVAL; 1361 1362 down_write(&nvmet_config_sem); 1363 if (cntlid_min > to_subsys(item)->cntlid_max) 1364 goto out_unlock; 1365 to_subsys(item)->cntlid_min = cntlid_min; 1366 up_write(&nvmet_config_sem); 1367 return cnt; 1368 1369out_unlock: 1370 up_write(&nvmet_config_sem); 1371 return -EINVAL; 1372} 1373CONFIGFS_ATTR(nvmet_subsys_, attr_cntlid_min); 1374 1375static ssize_t nvmet_subsys_attr_cntlid_max_show(struct config_item *item, 1376 char *page) 1377{ 1378 return snprintf(page, PAGE_SIZE, "%u\n", to_subsys(item)->cntlid_max); 1379} 1380 1381static ssize_t nvmet_subsys_attr_cntlid_max_store(struct config_item *item, 1382 const char *page, size_t cnt) 1383{ 1384 u16 cntlid_max; 1385 1386 if (sscanf(page, "%hu\n", &cntlid_max) != 1) 1387 return -EINVAL; 1388 1389 if (cntlid_max == 0) 1390 return -EINVAL; 1391 1392 down_write(&nvmet_config_sem); 1393 if (cntlid_max < to_subsys(item)->cntlid_min) 1394 goto out_unlock; 1395 to_subsys(item)->cntlid_max = cntlid_max; 1396 up_write(&nvmet_config_sem); 1397 return cnt; 1398 1399out_unlock: 1400 up_write(&nvmet_config_sem); 1401 return -EINVAL; 1402} 1403CONFIGFS_ATTR(nvmet_subsys_, attr_cntlid_max); 1404 1405static ssize_t nvmet_subsys_attr_vendor_id_show(struct config_item *item, 1406 char *page) 1407{ 1408 return snprintf(page, PAGE_SIZE, "0x%x\n", to_subsys(item)->vendor_id); 1409} 1410 1411static ssize_t nvmet_subsys_attr_vendor_id_store(struct config_item *item, 1412 const char *page, size_t count) 1413{ 1414 u16 vid; 1415 1416 if (kstrtou16(page, 0, &vid)) 1417 return -EINVAL; 1418 1419 down_write(&nvmet_config_sem); 1420 to_subsys(item)->vendor_id = vid; 1421 up_write(&nvmet_config_sem); 1422 return count; 1423} 1424CONFIGFS_ATTR(nvmet_subsys_, attr_vendor_id); 1425 1426static ssize_t nvmet_subsys_attr_subsys_vendor_id_show(struct config_item *item, 1427 char *page) 1428{ 1429 return snprintf(page, PAGE_SIZE, "0x%x\n", 1430 to_subsys(item)->subsys_vendor_id); 1431} 1432 1433static ssize_t nvmet_subsys_attr_subsys_vendor_id_store(struct config_item *item, 1434 const char *page, size_t count) 1435{ 1436 u16 ssvid; 1437 1438 if (kstrtou16(page, 0, &ssvid)) 1439 return -EINVAL; 1440 1441 down_write(&nvmet_config_sem); 1442 to_subsys(item)->subsys_vendor_id = ssvid; 1443 up_write(&nvmet_config_sem); 1444 return count; 1445} 1446CONFIGFS_ATTR(nvmet_subsys_, attr_subsys_vendor_id); 1447 1448static ssize_t nvmet_subsys_attr_model_show(struct config_item *item, 1449 char *page) 1450{ 1451 struct nvmet_subsys *subsys = to_subsys(item); 1452 1453 return snprintf(page, PAGE_SIZE, "%s\n", subsys->model_number); 1454} 1455 1456static ssize_t nvmet_subsys_attr_model_store_locked(struct nvmet_subsys *subsys, 1457 const char *page, size_t count) 1458{ 1459 int pos = 0, len; 1460 char *val; 1461 1462 if (subsys->subsys_discovered) { 1463 pr_err("Can't set model number. %s is already assigned\n", 1464 subsys->model_number); 1465 return -EINVAL; 1466 } 1467 1468 len = strcspn(page, "\n"); 1469 if (!len) 1470 return -EINVAL; 1471 1472 if (len > NVMET_MN_MAX_SIZE) { 1473 pr_err("Model number size can not exceed %d Bytes\n", 1474 NVMET_MN_MAX_SIZE); 1475 return -EINVAL; 1476 } 1477 1478 for (pos = 0; pos < len; pos++) { 1479 if (!nvmet_is_ascii(page[pos])) 1480 return -EINVAL; 1481 } 1482 1483 val = kmemdup_nul(page, len, GFP_KERNEL); 1484 if (!val) 1485 return -ENOMEM; 1486 kfree(subsys->model_number); 1487 subsys->model_number = val; 1488 return count; 1489} 1490 1491static ssize_t nvmet_subsys_attr_model_store(struct config_item *item, 1492 const char *page, size_t count) 1493{ 1494 struct nvmet_subsys *subsys = to_subsys(item); 1495 ssize_t ret; 1496 1497 down_write(&nvmet_config_sem); 1498 mutex_lock(&subsys->lock); 1499 ret = nvmet_subsys_attr_model_store_locked(subsys, page, count); 1500 mutex_unlock(&subsys->lock); 1501 up_write(&nvmet_config_sem); 1502 1503 return ret; 1504} 1505CONFIGFS_ATTR(nvmet_subsys_, attr_model); 1506 1507static ssize_t nvmet_subsys_attr_ieee_oui_show(struct config_item *item, 1508 char *page) 1509{ 1510 struct nvmet_subsys *subsys = to_subsys(item); 1511 1512 return sysfs_emit(page, "0x%06x\n", subsys->ieee_oui); 1513} 1514 1515static ssize_t nvmet_subsys_attr_ieee_oui_store_locked(struct nvmet_subsys *subsys, 1516 const char *page, size_t count) 1517{ 1518 uint32_t val = 0; 1519 int ret; 1520 1521 if (subsys->subsys_discovered) { 1522 pr_err("Can't set IEEE OUI. 0x%06x is already assigned\n", 1523 subsys->ieee_oui); 1524 return -EINVAL; 1525 } 1526 1527 ret = kstrtou32(page, 0, &val); 1528 if (ret < 0) 1529 return ret; 1530 1531 if (val >= 0x1000000) 1532 return -EINVAL; 1533 1534 subsys->ieee_oui = val; 1535 1536 return count; 1537} 1538 1539static ssize_t nvmet_subsys_attr_ieee_oui_store(struct config_item *item, 1540 const char *page, size_t count) 1541{ 1542 struct nvmet_subsys *subsys = to_subsys(item); 1543 ssize_t ret; 1544 1545 down_write(&nvmet_config_sem); 1546 mutex_lock(&subsys->lock); 1547 ret = nvmet_subsys_attr_ieee_oui_store_locked(subsys, page, count); 1548 mutex_unlock(&subsys->lock); 1549 up_write(&nvmet_config_sem); 1550 1551 return ret; 1552} 1553CONFIGFS_ATTR(nvmet_subsys_, attr_ieee_oui); 1554 1555static ssize_t nvmet_subsys_attr_firmware_show(struct config_item *item, 1556 char *page) 1557{ 1558 struct nvmet_subsys *subsys = to_subsys(item); 1559 1560 return sysfs_emit(page, "%s\n", subsys->firmware_rev); 1561} 1562 1563static ssize_t nvmet_subsys_attr_firmware_store_locked(struct nvmet_subsys *subsys, 1564 const char *page, size_t count) 1565{ 1566 int pos = 0, len; 1567 char *val; 1568 1569 if (subsys->subsys_discovered) { 1570 pr_err("Can't set firmware revision. %s is already assigned\n", 1571 subsys->firmware_rev); 1572 return -EINVAL; 1573 } 1574 1575 len = strcspn(page, "\n"); 1576 if (!len) 1577 return -EINVAL; 1578 1579 if (len > NVMET_FR_MAX_SIZE) { 1580 pr_err("Firmware revision size can not exceed %d Bytes\n", 1581 NVMET_FR_MAX_SIZE); 1582 return -EINVAL; 1583 } 1584 1585 for (pos = 0; pos < len; pos++) { 1586 if (!nvmet_is_ascii(page[pos])) 1587 return -EINVAL; 1588 } 1589 1590 val = kmemdup_nul(page, len, GFP_KERNEL); 1591 if (!val) 1592 return -ENOMEM; 1593 1594 kfree(subsys->firmware_rev); 1595 1596 subsys->firmware_rev = val; 1597 1598 return count; 1599} 1600 1601static ssize_t nvmet_subsys_attr_firmware_store(struct config_item *item, 1602 const char *page, size_t count) 1603{ 1604 struct nvmet_subsys *subsys = to_subsys(item); 1605 ssize_t ret; 1606 1607 down_write(&nvmet_config_sem); 1608 mutex_lock(&subsys->lock); 1609 ret = nvmet_subsys_attr_firmware_store_locked(subsys, page, count); 1610 mutex_unlock(&subsys->lock); 1611 up_write(&nvmet_config_sem); 1612 1613 return ret; 1614} 1615CONFIGFS_ATTR(nvmet_subsys_, attr_firmware); 1616 1617#ifdef CONFIG_BLK_DEV_INTEGRITY 1618static ssize_t nvmet_subsys_attr_pi_enable_show(struct config_item *item, 1619 char *page) 1620{ 1621 return snprintf(page, PAGE_SIZE, "%d\n", to_subsys(item)->pi_support); 1622} 1623 1624static ssize_t nvmet_subsys_attr_pi_enable_store(struct config_item *item, 1625 const char *page, size_t count) 1626{ 1627 struct nvmet_subsys *subsys = to_subsys(item); 1628 bool pi_enable; 1629 1630 if (kstrtobool(page, &pi_enable)) 1631 return -EINVAL; 1632 1633 subsys->pi_support = pi_enable; 1634 return count; 1635} 1636CONFIGFS_ATTR(nvmet_subsys_, attr_pi_enable); 1637#endif 1638 1639static ssize_t nvmet_subsys_attr_qid_max_show(struct config_item *item, 1640 char *page) 1641{ 1642 return snprintf(page, PAGE_SIZE, "%u\n", to_subsys(item)->max_qid); 1643} 1644 1645static ssize_t nvmet_subsys_attr_qid_max_store(struct config_item *item, 1646 const char *page, size_t cnt) 1647{ 1648 struct nvmet_subsys *subsys = to_subsys(item); 1649 struct nvmet_ctrl *ctrl; 1650 u16 qid_max; 1651 1652 if (sscanf(page, "%hu\n", &qid_max) != 1) 1653 return -EINVAL; 1654 1655 if (qid_max < 1 || qid_max > NVMET_NR_QUEUES) 1656 return -EINVAL; 1657 1658 down_write(&nvmet_config_sem); 1659 subsys->max_qid = qid_max; 1660 1661 /* Force reconnect */ 1662 list_for_each_entry(ctrl, &subsys->ctrls, subsys_entry) 1663 ctrl->ops->delete_ctrl(ctrl); 1664 up_write(&nvmet_config_sem); 1665 1666 return cnt; 1667} 1668CONFIGFS_ATTR(nvmet_subsys_, attr_qid_max); 1669 1670static struct configfs_attribute *nvmet_subsys_attrs[] = { 1671 &nvmet_subsys_attr_attr_allow_any_host, 1672 &nvmet_subsys_attr_attr_version, 1673 &nvmet_subsys_attr_attr_serial, 1674 &nvmet_subsys_attr_attr_cntlid_min, 1675 &nvmet_subsys_attr_attr_cntlid_max, 1676 &nvmet_subsys_attr_attr_vendor_id, 1677 &nvmet_subsys_attr_attr_subsys_vendor_id, 1678 &nvmet_subsys_attr_attr_model, 1679 &nvmet_subsys_attr_attr_qid_max, 1680 &nvmet_subsys_attr_attr_ieee_oui, 1681 &nvmet_subsys_attr_attr_firmware, 1682#ifdef CONFIG_BLK_DEV_INTEGRITY 1683 &nvmet_subsys_attr_attr_pi_enable, 1684#endif 1685 NULL, 1686}; 1687 1688/* 1689 * Subsystem structures & folder operation functions below 1690 */ 1691static void nvmet_subsys_release(struct config_item *item) 1692{ 1693 struct nvmet_subsys *subsys = to_subsys(item); 1694 1695 nvmet_subsys_del_ctrls(subsys); 1696 nvmet_subsys_put(subsys); 1697} 1698 1699static struct configfs_item_operations nvmet_subsys_item_ops = { 1700 .release = nvmet_subsys_release, 1701}; 1702 1703static const struct config_item_type nvmet_subsys_type = { 1704 .ct_item_ops = &nvmet_subsys_item_ops, 1705 .ct_attrs = nvmet_subsys_attrs, 1706 .ct_owner = THIS_MODULE, 1707}; 1708 1709static struct config_group *nvmet_subsys_make(struct config_group *group, 1710 const char *name) 1711{ 1712 struct nvmet_subsys *subsys; 1713 1714 if (sysfs_streq(name, NVME_DISC_SUBSYS_NAME)) { 1715 pr_err("can't create discovery subsystem through configfs\n"); 1716 return ERR_PTR(-EINVAL); 1717 } 1718 1719 if (sysfs_streq(name, nvmet_disc_subsys->subsysnqn)) { 1720 pr_err("can't create subsystem using unique discovery NQN\n"); 1721 return ERR_PTR(-EINVAL); 1722 } 1723 1724 subsys = nvmet_subsys_alloc(name, NVME_NQN_NVME); 1725 if (IS_ERR(subsys)) 1726 return ERR_CAST(subsys); 1727 1728 config_group_init_type_name(&subsys->group, name, &nvmet_subsys_type); 1729 1730 config_group_init_type_name(&subsys->namespaces_group, 1731 "namespaces", &nvmet_namespaces_type); 1732 configfs_add_default_group(&subsys->namespaces_group, &subsys->group); 1733 1734 config_group_init_type_name(&subsys->allowed_hosts_group, 1735 "allowed_hosts", &nvmet_allowed_hosts_type); 1736 configfs_add_default_group(&subsys->allowed_hosts_group, 1737 &subsys->group); 1738 1739 nvmet_add_passthru_group(subsys); 1740 1741 return &subsys->group; 1742} 1743 1744static struct configfs_group_operations nvmet_subsystems_group_ops = { 1745 .make_group = nvmet_subsys_make, 1746}; 1747 1748static const struct config_item_type nvmet_subsystems_type = { 1749 .ct_group_ops = &nvmet_subsystems_group_ops, 1750 .ct_owner = THIS_MODULE, 1751}; 1752 1753static ssize_t nvmet_referral_enable_show(struct config_item *item, 1754 char *page) 1755{ 1756 return snprintf(page, PAGE_SIZE, "%d\n", to_nvmet_port(item)->enabled); 1757} 1758 1759static ssize_t nvmet_referral_enable_store(struct config_item *item, 1760 const char *page, size_t count) 1761{ 1762 struct nvmet_port *parent = to_nvmet_port(item->ci_parent->ci_parent); 1763 struct nvmet_port *port = to_nvmet_port(item); 1764 bool enable; 1765 1766 if (kstrtobool(page, &enable)) 1767 goto inval; 1768 1769 if (enable) 1770 nvmet_referral_enable(parent, port); 1771 else 1772 nvmet_referral_disable(parent, port); 1773 1774 return count; 1775inval: 1776 pr_err("Invalid value '%s' for enable\n", page); 1777 return -EINVAL; 1778} 1779 1780CONFIGFS_ATTR(nvmet_referral_, enable); 1781 1782/* 1783 * Discovery Service subsystem definitions 1784 */ 1785static struct configfs_attribute *nvmet_referral_attrs[] = { 1786 &nvmet_attr_addr_adrfam, 1787 &nvmet_attr_addr_portid, 1788 &nvmet_attr_addr_treq, 1789 &nvmet_attr_addr_traddr, 1790 &nvmet_attr_addr_trsvcid, 1791 &nvmet_attr_addr_trtype, 1792 &nvmet_referral_attr_enable, 1793 NULL, 1794}; 1795 1796static void nvmet_referral_notify(struct config_group *group, 1797 struct config_item *item) 1798{ 1799 struct nvmet_port *parent = to_nvmet_port(item->ci_parent->ci_parent); 1800 struct nvmet_port *port = to_nvmet_port(item); 1801 1802 nvmet_referral_disable(parent, port); 1803} 1804 1805static void nvmet_referral_release(struct config_item *item) 1806{ 1807 struct nvmet_port *port = to_nvmet_port(item); 1808 1809 kfree(port); 1810} 1811 1812static struct configfs_item_operations nvmet_referral_item_ops = { 1813 .release = nvmet_referral_release, 1814}; 1815 1816static const struct config_item_type nvmet_referral_type = { 1817 .ct_owner = THIS_MODULE, 1818 .ct_attrs = nvmet_referral_attrs, 1819 .ct_item_ops = &nvmet_referral_item_ops, 1820}; 1821 1822static struct config_group *nvmet_referral_make( 1823 struct config_group *group, const char *name) 1824{ 1825 struct nvmet_port *port; 1826 1827 port = kzalloc(sizeof(*port), GFP_KERNEL); 1828 if (!port) 1829 return ERR_PTR(-ENOMEM); 1830 1831 INIT_LIST_HEAD(&port->entry); 1832 port->disc_addr.trtype = NVMF_TRTYPE_MAX; 1833 config_group_init_type_name(&port->group, name, &nvmet_referral_type); 1834 1835 return &port->group; 1836} 1837 1838static struct configfs_group_operations nvmet_referral_group_ops = { 1839 .make_group = nvmet_referral_make, 1840 .disconnect_notify = nvmet_referral_notify, 1841}; 1842 1843static const struct config_item_type nvmet_referrals_type = { 1844 .ct_owner = THIS_MODULE, 1845 .ct_group_ops = &nvmet_referral_group_ops, 1846}; 1847 1848static struct nvmet_type_name_map nvmet_ana_state[] = { 1849 { NVME_ANA_OPTIMIZED, "optimized" }, 1850 { NVME_ANA_NONOPTIMIZED, "non-optimized" }, 1851 { NVME_ANA_INACCESSIBLE, "inaccessible" }, 1852 { NVME_ANA_PERSISTENT_LOSS, "persistent-loss" }, 1853 { NVME_ANA_CHANGE, "change" }, 1854}; 1855 1856static ssize_t nvmet_ana_group_ana_state_show(struct config_item *item, 1857 char *page) 1858{ 1859 struct nvmet_ana_group *grp = to_ana_group(item); 1860 enum nvme_ana_state state = grp->port->ana_state[grp->grpid]; 1861 int i; 1862 1863 for (i = 0; i < ARRAY_SIZE(nvmet_ana_state); i++) { 1864 if (state == nvmet_ana_state[i].type) 1865 return sprintf(page, "%s\n", nvmet_ana_state[i].name); 1866 } 1867 1868 return sprintf(page, "\n"); 1869} 1870 1871static ssize_t nvmet_ana_group_ana_state_store(struct config_item *item, 1872 const char *page, size_t count) 1873{ 1874 struct nvmet_ana_group *grp = to_ana_group(item); 1875 enum nvme_ana_state *ana_state = grp->port->ana_state; 1876 int i; 1877 1878 for (i = 0; i < ARRAY_SIZE(nvmet_ana_state); i++) { 1879 if (sysfs_streq(page, nvmet_ana_state[i].name)) 1880 goto found; 1881 } 1882 1883 pr_err("Invalid value '%s' for ana_state\n", page); 1884 return -EINVAL; 1885 1886found: 1887 down_write(&nvmet_ana_sem); 1888 ana_state[grp->grpid] = (enum nvme_ana_state) nvmet_ana_state[i].type; 1889 nvmet_ana_chgcnt++; 1890 up_write(&nvmet_ana_sem); 1891 nvmet_port_send_ana_event(grp->port); 1892 return count; 1893} 1894 1895CONFIGFS_ATTR(nvmet_ana_group_, ana_state); 1896 1897static struct configfs_attribute *nvmet_ana_group_attrs[] = { 1898 &nvmet_ana_group_attr_ana_state, 1899 NULL, 1900}; 1901 1902static void nvmet_ana_group_release(struct config_item *item) 1903{ 1904 struct nvmet_ana_group *grp = to_ana_group(item); 1905 1906 if (grp == &grp->port->ana_default_group) 1907 return; 1908 1909 down_write(&nvmet_ana_sem); 1910 grp->port->ana_state[grp->grpid] = NVME_ANA_INACCESSIBLE; 1911 nvmet_ana_group_enabled[grp->grpid]--; 1912 up_write(&nvmet_ana_sem); 1913 1914 nvmet_port_send_ana_event(grp->port); 1915 kfree(grp); 1916} 1917 1918static struct configfs_item_operations nvmet_ana_group_item_ops = { 1919 .release = nvmet_ana_group_release, 1920}; 1921 1922static const struct config_item_type nvmet_ana_group_type = { 1923 .ct_item_ops = &nvmet_ana_group_item_ops, 1924 .ct_attrs = nvmet_ana_group_attrs, 1925 .ct_owner = THIS_MODULE, 1926}; 1927 1928static struct config_group *nvmet_ana_groups_make_group( 1929 struct config_group *group, const char *name) 1930{ 1931 struct nvmet_port *port = ana_groups_to_port(&group->cg_item); 1932 struct nvmet_ana_group *grp; 1933 u32 grpid; 1934 int ret; 1935 1936 ret = kstrtou32(name, 0, &grpid); 1937 if (ret) 1938 goto out; 1939 1940 ret = -EINVAL; 1941 if (grpid <= 1 || grpid > NVMET_MAX_ANAGRPS) 1942 goto out; 1943 1944 ret = -ENOMEM; 1945 grp = kzalloc(sizeof(*grp), GFP_KERNEL); 1946 if (!grp) 1947 goto out; 1948 grp->port = port; 1949 grp->grpid = grpid; 1950 1951 down_write(&nvmet_ana_sem); 1952 grpid = array_index_nospec(grpid, NVMET_MAX_ANAGRPS); 1953 nvmet_ana_group_enabled[grpid]++; 1954 up_write(&nvmet_ana_sem); 1955 1956 nvmet_port_send_ana_event(grp->port); 1957 1958 config_group_init_type_name(&grp->group, name, &nvmet_ana_group_type); 1959 return &grp->group; 1960out: 1961 return ERR_PTR(ret); 1962} 1963 1964static struct configfs_group_operations nvmet_ana_groups_group_ops = { 1965 .make_group = nvmet_ana_groups_make_group, 1966}; 1967 1968static const struct config_item_type nvmet_ana_groups_type = { 1969 .ct_group_ops = &nvmet_ana_groups_group_ops, 1970 .ct_owner = THIS_MODULE, 1971}; 1972 1973/* 1974 * Ports definitions. 1975 */ 1976static void nvmet_port_release(struct config_item *item) 1977{ 1978 struct nvmet_port *port = to_nvmet_port(item); 1979 1980 /* Let inflight controllers teardown complete */ 1981 flush_workqueue(nvmet_wq); 1982 list_del(&port->global_entry); 1983 1984 key_put(port->keyring); 1985 kfree(port->ana_state); 1986 kfree(port); 1987} 1988 1989static struct configfs_attribute *nvmet_port_attrs[] = { 1990 &nvmet_attr_addr_adrfam, 1991 &nvmet_attr_addr_treq, 1992 &nvmet_attr_addr_traddr, 1993 &nvmet_attr_addr_trsvcid, 1994 &nvmet_attr_addr_trtype, 1995 &nvmet_attr_addr_tsas, 1996 &nvmet_attr_param_inline_data_size, 1997 &nvmet_attr_param_max_queue_size, 1998#ifdef CONFIG_BLK_DEV_INTEGRITY 1999 &nvmet_attr_param_pi_enable, 2000#endif 2001 NULL, 2002}; 2003 2004static struct configfs_item_operations nvmet_port_item_ops = { 2005 .release = nvmet_port_release, 2006}; 2007 2008static const struct config_item_type nvmet_port_type = { 2009 .ct_attrs = nvmet_port_attrs, 2010 .ct_item_ops = &nvmet_port_item_ops, 2011 .ct_owner = THIS_MODULE, 2012}; 2013 2014static struct config_group *nvmet_ports_make(struct config_group *group, 2015 const char *name) 2016{ 2017 struct nvmet_port *port; 2018 u16 portid; 2019 u32 i; 2020 2021 if (kstrtou16(name, 0, &portid)) 2022 return ERR_PTR(-EINVAL); 2023 2024 port = kzalloc(sizeof(*port), GFP_KERNEL); 2025 if (!port) 2026 return ERR_PTR(-ENOMEM); 2027 2028 port->ana_state = kcalloc(NVMET_MAX_ANAGRPS + 1, 2029 sizeof(*port->ana_state), GFP_KERNEL); 2030 if (!port->ana_state) { 2031 kfree(port); 2032 return ERR_PTR(-ENOMEM); 2033 } 2034 2035 if (IS_ENABLED(CONFIG_NVME_TARGET_TCP_TLS) && nvme_keyring_id()) { 2036 port->keyring = key_lookup(nvme_keyring_id()); 2037 if (IS_ERR(port->keyring)) { 2038 pr_warn("NVMe keyring not available, disabling TLS\n"); 2039 port->keyring = NULL; 2040 } 2041 } 2042 2043 for (i = 1; i <= NVMET_MAX_ANAGRPS; i++) { 2044 if (i == NVMET_DEFAULT_ANA_GRPID) 2045 port->ana_state[1] = NVME_ANA_OPTIMIZED; 2046 else 2047 port->ana_state[i] = NVME_ANA_INACCESSIBLE; 2048 } 2049 2050 list_add(&port->global_entry, &nvmet_ports_list); 2051 2052 INIT_LIST_HEAD(&port->entry); 2053 INIT_LIST_HEAD(&port->subsystems); 2054 INIT_LIST_HEAD(&port->referrals); 2055 port->inline_data_size = -1; /* < 0 == let the transport choose */ 2056 port->max_queue_size = -1; /* < 0 == let the transport choose */ 2057 2058 port->disc_addr.trtype = NVMF_TRTYPE_MAX; 2059 port->disc_addr.portid = cpu_to_le16(portid); 2060 port->disc_addr.adrfam = NVMF_ADDR_FAMILY_MAX; 2061 port->disc_addr.treq = NVMF_TREQ_DISABLE_SQFLOW; 2062 config_group_init_type_name(&port->group, name, &nvmet_port_type); 2063 2064 config_group_init_type_name(&port->subsys_group, 2065 "subsystems", &nvmet_port_subsys_type); 2066 configfs_add_default_group(&port->subsys_group, &port->group); 2067 2068 config_group_init_type_name(&port->referrals_group, 2069 "referrals", &nvmet_referrals_type); 2070 configfs_add_default_group(&port->referrals_group, &port->group); 2071 2072 config_group_init_type_name(&port->ana_groups_group, 2073 "ana_groups", &nvmet_ana_groups_type); 2074 configfs_add_default_group(&port->ana_groups_group, &port->group); 2075 2076 port->ana_default_group.port = port; 2077 port->ana_default_group.grpid = NVMET_DEFAULT_ANA_GRPID; 2078 config_group_init_type_name(&port->ana_default_group.group, 2079 __stringify(NVMET_DEFAULT_ANA_GRPID), 2080 &nvmet_ana_group_type); 2081 configfs_add_default_group(&port->ana_default_group.group, 2082 &port->ana_groups_group); 2083 2084 return &port->group; 2085} 2086 2087static struct configfs_group_operations nvmet_ports_group_ops = { 2088 .make_group = nvmet_ports_make, 2089}; 2090 2091static const struct config_item_type nvmet_ports_type = { 2092 .ct_group_ops = &nvmet_ports_group_ops, 2093 .ct_owner = THIS_MODULE, 2094}; 2095 2096static struct config_group nvmet_subsystems_group; 2097static struct config_group nvmet_ports_group; 2098 2099#ifdef CONFIG_NVME_TARGET_AUTH 2100static ssize_t nvmet_host_dhchap_key_show(struct config_item *item, 2101 char *page) 2102{ 2103 u8 *dhchap_secret; 2104 ssize_t ret; 2105 2106 down_read(&nvmet_config_sem); 2107 dhchap_secret = to_host(item)->dhchap_secret; 2108 if (!dhchap_secret) 2109 ret = sprintf(page, "\n"); 2110 else 2111 ret = sprintf(page, "%s\n", dhchap_secret); 2112 up_read(&nvmet_config_sem); 2113 return ret; 2114} 2115 2116static ssize_t nvmet_host_dhchap_key_store(struct config_item *item, 2117 const char *page, size_t count) 2118{ 2119 struct nvmet_host *host = to_host(item); 2120 int ret; 2121 2122 ret = nvmet_auth_set_key(host, page, false); 2123 /* 2124 * Re-authentication is a soft state, so keep the 2125 * current authentication valid until the host 2126 * requests re-authentication. 2127 */ 2128 return ret < 0 ? ret : count; 2129} 2130 2131CONFIGFS_ATTR(nvmet_host_, dhchap_key); 2132 2133static ssize_t nvmet_host_dhchap_ctrl_key_show(struct config_item *item, 2134 char *page) 2135{ 2136 u8 *dhchap_secret = to_host(item)->dhchap_ctrl_secret; 2137 ssize_t ret; 2138 2139 down_read(&nvmet_config_sem); 2140 dhchap_secret = to_host(item)->dhchap_ctrl_secret; 2141 if (!dhchap_secret) 2142 ret = sprintf(page, "\n"); 2143 else 2144 ret = sprintf(page, "%s\n", dhchap_secret); 2145 up_read(&nvmet_config_sem); 2146 return ret; 2147} 2148 2149static ssize_t nvmet_host_dhchap_ctrl_key_store(struct config_item *item, 2150 const char *page, size_t count) 2151{ 2152 struct nvmet_host *host = to_host(item); 2153 int ret; 2154 2155 ret = nvmet_auth_set_key(host, page, true); 2156 /* 2157 * Re-authentication is a soft state, so keep the 2158 * current authentication valid until the host 2159 * requests re-authentication. 2160 */ 2161 return ret < 0 ? ret : count; 2162} 2163 2164CONFIGFS_ATTR(nvmet_host_, dhchap_ctrl_key); 2165 2166static ssize_t nvmet_host_dhchap_hash_show(struct config_item *item, 2167 char *page) 2168{ 2169 struct nvmet_host *host = to_host(item); 2170 const char *hash_name = nvme_auth_hmac_name(host->dhchap_hash_id); 2171 2172 return sprintf(page, "%s\n", hash_name ? hash_name : "none"); 2173} 2174 2175static ssize_t nvmet_host_dhchap_hash_store(struct config_item *item, 2176 const char *page, size_t count) 2177{ 2178 struct nvmet_host *host = to_host(item); 2179 u8 hmac_id; 2180 2181 hmac_id = nvme_auth_hmac_id(page); 2182 if (hmac_id == NVME_AUTH_HASH_INVALID) 2183 return -EINVAL; 2184 if (!crypto_has_shash(nvme_auth_hmac_name(hmac_id), 0, 0)) 2185 return -ENOTSUPP; 2186 host->dhchap_hash_id = hmac_id; 2187 return count; 2188} 2189 2190CONFIGFS_ATTR(nvmet_host_, dhchap_hash); 2191 2192static ssize_t nvmet_host_dhchap_dhgroup_show(struct config_item *item, 2193 char *page) 2194{ 2195 struct nvmet_host *host = to_host(item); 2196 const char *dhgroup = nvme_auth_dhgroup_name(host->dhchap_dhgroup_id); 2197 2198 return sprintf(page, "%s\n", dhgroup ? dhgroup : "none"); 2199} 2200 2201static ssize_t nvmet_host_dhchap_dhgroup_store(struct config_item *item, 2202 const char *page, size_t count) 2203{ 2204 struct nvmet_host *host = to_host(item); 2205 int dhgroup_id; 2206 2207 dhgroup_id = nvme_auth_dhgroup_id(page); 2208 if (dhgroup_id == NVME_AUTH_DHGROUP_INVALID) 2209 return -EINVAL; 2210 if (dhgroup_id != NVME_AUTH_DHGROUP_NULL) { 2211 const char *kpp = nvme_auth_dhgroup_kpp(dhgroup_id); 2212 2213 if (!crypto_has_kpp(kpp, 0, 0)) 2214 return -EINVAL; 2215 } 2216 host->dhchap_dhgroup_id = dhgroup_id; 2217 return count; 2218} 2219 2220CONFIGFS_ATTR(nvmet_host_, dhchap_dhgroup); 2221 2222static struct configfs_attribute *nvmet_host_attrs[] = { 2223 &nvmet_host_attr_dhchap_key, 2224 &nvmet_host_attr_dhchap_ctrl_key, 2225 &nvmet_host_attr_dhchap_hash, 2226 &nvmet_host_attr_dhchap_dhgroup, 2227 NULL, 2228}; 2229#endif /* CONFIG_NVME_TARGET_AUTH */ 2230 2231static void nvmet_host_release(struct config_item *item) 2232{ 2233 struct nvmet_host *host = to_host(item); 2234 2235#ifdef CONFIG_NVME_TARGET_AUTH 2236 kfree(host->dhchap_secret); 2237 kfree(host->dhchap_ctrl_secret); 2238#endif 2239 kfree(host); 2240} 2241 2242static struct configfs_item_operations nvmet_host_item_ops = { 2243 .release = nvmet_host_release, 2244}; 2245 2246static const struct config_item_type nvmet_host_type = { 2247 .ct_item_ops = &nvmet_host_item_ops, 2248#ifdef CONFIG_NVME_TARGET_AUTH 2249 .ct_attrs = nvmet_host_attrs, 2250#endif 2251 .ct_owner = THIS_MODULE, 2252}; 2253 2254static struct config_group *nvmet_hosts_make_group(struct config_group *group, 2255 const char *name) 2256{ 2257 struct nvmet_host *host; 2258 2259 host = kzalloc(sizeof(*host), GFP_KERNEL); 2260 if (!host) 2261 return ERR_PTR(-ENOMEM); 2262 2263#ifdef CONFIG_NVME_TARGET_AUTH 2264 /* Default to SHA256 */ 2265 host->dhchap_hash_id = NVME_AUTH_HASH_SHA256; 2266#endif 2267 2268 config_group_init_type_name(&host->group, name, &nvmet_host_type); 2269 2270 return &host->group; 2271} 2272 2273static struct configfs_group_operations nvmet_hosts_group_ops = { 2274 .make_group = nvmet_hosts_make_group, 2275}; 2276 2277static const struct config_item_type nvmet_hosts_type = { 2278 .ct_group_ops = &nvmet_hosts_group_ops, 2279 .ct_owner = THIS_MODULE, 2280}; 2281 2282static struct config_group nvmet_hosts_group; 2283 2284static ssize_t nvmet_root_discovery_nqn_show(struct config_item *item, 2285 char *page) 2286{ 2287 return snprintf(page, PAGE_SIZE, "%s\n", nvmet_disc_subsys->subsysnqn); 2288} 2289 2290static ssize_t nvmet_root_discovery_nqn_store(struct config_item *item, 2291 const char *page, size_t count) 2292{ 2293 struct list_head *entry; 2294 char *old_nqn, *new_nqn; 2295 size_t len; 2296 2297 len = strcspn(page, "\n"); 2298 if (!len || len > NVMF_NQN_FIELD_LEN - 1) 2299 return -EINVAL; 2300 2301 new_nqn = kstrndup(page, len, GFP_KERNEL); 2302 if (!new_nqn) 2303 return -ENOMEM; 2304 2305 down_write(&nvmet_config_sem); 2306 list_for_each(entry, &nvmet_subsystems_group.cg_children) { 2307 struct config_item *item = 2308 container_of(entry, struct config_item, ci_entry); 2309 2310 if (!strncmp(config_item_name(item), page, len)) { 2311 pr_err("duplicate NQN %s\n", config_item_name(item)); 2312 up_write(&nvmet_config_sem); 2313 kfree(new_nqn); 2314 return -EINVAL; 2315 } 2316 } 2317 old_nqn = nvmet_disc_subsys->subsysnqn; 2318 nvmet_disc_subsys->subsysnqn = new_nqn; 2319 up_write(&nvmet_config_sem); 2320 2321 kfree(old_nqn); 2322 return len; 2323} 2324 2325CONFIGFS_ATTR(nvmet_root_, discovery_nqn); 2326 2327static struct configfs_attribute *nvmet_root_attrs[] = { 2328 &nvmet_root_attr_discovery_nqn, 2329 NULL, 2330}; 2331 2332static const struct config_item_type nvmet_root_type = { 2333 .ct_attrs = nvmet_root_attrs, 2334 .ct_owner = THIS_MODULE, 2335}; 2336 2337static struct configfs_subsystem nvmet_configfs_subsystem = { 2338 .su_group = { 2339 .cg_item = { 2340 .ci_namebuf = "nvmet", 2341 .ci_type = &nvmet_root_type, 2342 }, 2343 }, 2344}; 2345 2346int __init nvmet_init_configfs(void) 2347{ 2348 int ret; 2349 2350 config_group_init(&nvmet_configfs_subsystem.su_group); 2351 mutex_init(&nvmet_configfs_subsystem.su_mutex); 2352 2353 config_group_init_type_name(&nvmet_subsystems_group, 2354 "subsystems", &nvmet_subsystems_type); 2355 configfs_add_default_group(&nvmet_subsystems_group, 2356 &nvmet_configfs_subsystem.su_group); 2357 2358 config_group_init_type_name(&nvmet_ports_group, 2359 "ports", &nvmet_ports_type); 2360 configfs_add_default_group(&nvmet_ports_group, 2361 &nvmet_configfs_subsystem.su_group); 2362 2363 config_group_init_type_name(&nvmet_hosts_group, 2364 "hosts", &nvmet_hosts_type); 2365 configfs_add_default_group(&nvmet_hosts_group, 2366 &nvmet_configfs_subsystem.su_group); 2367 2368 ret = configfs_register_subsystem(&nvmet_configfs_subsystem); 2369 if (ret) { 2370 pr_err("configfs_register_subsystem: %d\n", ret); 2371 return ret; 2372 } 2373 2374 return 0; 2375} 2376 2377void __exit nvmet_exit_configfs(void) 2378{ 2379 configfs_unregister_subsystem(&nvmet_configfs_subsystem); 2380}
~/
Read-only file preview.