Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

nvmet: use type-name map for address family

Right now nvmet_addr_adrfam_[store|show]() uses switch and if else
ladder for address family to string and reverse mapping which also
repeats the strings in show and store function.

With addition of generic nvmet_type_name_map structure we can now get rid
of the switch and if else ladder and string duplication.

Also, we add a newline in before found label in nvmet_addr_trtype_store()
which keeps goto label code consistent with
nvmet_allowed_hosts_drop_link(), nvmet_port_subsys_drop_link() and
nvmet_ana_group_ana_state_store().

Signed-off-by: Chaitanya Kulkarni <chaitanya.kulkarni@wdc.com>
Signed-off-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Jens Axboe <axboe@kernel.dk>

authored by

Chaitanya Kulkarni and committed by
Jens Axboe
7e764179 45e2f3c2

+27 -24
+27 -24
drivers/nvme/target/configfs.c
··· 32 32 { NVMF_TRTYPE_LOOP, "loop" }, 33 33 }; 34 34 35 + static const struct nvmet_type_name_map nvmet_addr_family[] = { 36 + { NVMF_ADDR_FAMILY_PCI, "pcie" }, 37 + { NVMF_ADDR_FAMILY_IP4, "ipv4" }, 38 + { NVMF_ADDR_FAMILY_IP6, "ipv6" }, 39 + { NVMF_ADDR_FAMILY_IB, "ib" }, 40 + { NVMF_ADDR_FAMILY_FC, "fc" }, 41 + }; 42 + 35 43 /* 36 44 * nvmet_port Generic ConfigFS definitions. 37 45 * Used in any place in the ConfigFS tree that refers to an address. 38 46 */ 39 - static ssize_t nvmet_addr_adrfam_show(struct config_item *item, 40 - char *page) 47 + static ssize_t nvmet_addr_adrfam_show(struct config_item *item, char *page) 41 48 { 42 - switch (to_nvmet_port(item)->disc_addr.adrfam) { 43 - case NVMF_ADDR_FAMILY_IP4: 44 - return sprintf(page, "ipv4\n"); 45 - case NVMF_ADDR_FAMILY_IP6: 46 - return sprintf(page, "ipv6\n"); 47 - case NVMF_ADDR_FAMILY_IB: 48 - return sprintf(page, "ib\n"); 49 - case NVMF_ADDR_FAMILY_FC: 50 - return sprintf(page, "fc\n"); 51 - default: 52 - return sprintf(page, "\n"); 49 + u8 adrfam = to_nvmet_port(item)->disc_addr.adrfam; 50 + int i; 51 + 52 + for (i = 1; i < ARRAY_SIZE(nvmet_addr_family); i++) { 53 + if (nvmet_addr_family[i].type == adrfam) 54 + return sprintf(page, "%s\n", nvmet_addr_family[i].name); 53 55 } 56 + 57 + return sprintf(page, "\n"); 54 58 } 55 59 56 60 static ssize_t nvmet_addr_adrfam_store(struct config_item *item, 57 61 const char *page, size_t count) 58 62 { 59 63 struct nvmet_port *port = to_nvmet_port(item); 64 + int i; 60 65 61 66 if (port->enabled) { 62 67 pr_err("Cannot modify address while enabled\n"); ··· 69 64 return -EACCES; 70 65 } 71 66 72 - if (sysfs_streq(page, "ipv4")) { 73 - port->disc_addr.adrfam = NVMF_ADDR_FAMILY_IP4; 74 - } else if (sysfs_streq(page, "ipv6")) { 75 - port->disc_addr.adrfam = NVMF_ADDR_FAMILY_IP6; 76 - } else if (sysfs_streq(page, "ib")) { 77 - port->disc_addr.adrfam = NVMF_ADDR_FAMILY_IB; 78 - } else if (sysfs_streq(page, "fc")) { 79 - port->disc_addr.adrfam = NVMF_ADDR_FAMILY_FC; 80 - } else { 81 - pr_err("Invalid value '%s' for adrfam\n", page); 82 - return -EINVAL; 67 + for (i = 1; i < ARRAY_SIZE(nvmet_addr_family); i++) { 68 + if (sysfs_streq(page, nvmet_addr_family[i].name)) 69 + goto found; 83 70 } 84 71 72 + pr_err("Invalid value '%s' for adrfam\n", page); 73 + return -EINVAL; 74 + 75 + found: 76 + port->disc_addr.adrfam = i; 85 77 return count; 86 78 } 87 79 ··· 292 290 293 291 pr_err("Invalid value '%s' for trtype\n", page); 294 292 return -EINVAL; 293 + 295 294 found: 296 295 memset(&port->disc_addr.tsas, 0, NVMF_TSAS_SIZE); 297 296 port->disc_addr.trtype = nvmet_transport[i].type;