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