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