bdev: Add a utility function to get the nvme bdev

Change-Id: I9408533fdfe8a4bd0c8f422555a85afc93e3a568
Signed-off-by: Ben Walker <benjamin.walker@intel.com>
This commit is contained in:
Ben Walker 2017-02-28 10:56:57 -07:00 committed by Jim Harris
parent 686ca9f6c5
commit 4fa782363a

View File

@ -549,27 +549,28 @@ attach_cb(void *cb_ctx, const struct spdk_nvme_transport_id *trid,
} }
} }
static bool static struct nvme_ctrlr *
nvme_ctrlr_exists(struct spdk_pci_addr *addr) nvme_ctrlr_get(struct spdk_pci_addr *addr)
{ {
struct nvme_ctrlr *nvme_ctrlr; struct nvme_ctrlr *nvme_ctrlr;
TAILQ_FOREACH(nvme_ctrlr, &g_nvme_ctrlrs, tailq) { TAILQ_FOREACH(nvme_ctrlr, &g_nvme_ctrlrs, tailq) {
if (spdk_pci_addr_compare(&nvme_ctrlr->pci_addr, addr) == 0) { if (spdk_pci_addr_compare(&nvme_ctrlr->pci_addr, addr) == 0) {
return true; return nvme_ctrlr;
} }
} }
return false; return NULL;
} }
int int
spdk_bdev_nvme_create(struct spdk_nvme_transport_id *trid, spdk_bdev_nvme_create(struct spdk_nvme_transport_id *trid,
const char **names, size_t *count) const char **names, size_t *count)
{ {
struct nvme_probe_ctx probe_ctx; struct nvme_probe_ctx probe_ctx;
int i; struct nvme_ctrlr *nvme_ctrlr;
size_t j; int i;
size_t j;
if (spdk_pci_addr_parse(&probe_ctx.whitelist[0], trid->traddr) < 0) { if (spdk_pci_addr_parse(&probe_ctx.whitelist[0], trid->traddr) < 0) {
return -1; return -1;
@ -577,7 +578,7 @@ spdk_bdev_nvme_create(struct spdk_nvme_transport_id *trid,
probe_ctx.num_whitelist_controllers = 1; probe_ctx.num_whitelist_controllers = 1;
probe_ctx.controllers_remaining = 1; probe_ctx.controllers_remaining = 1;
if (nvme_ctrlr_exists(&probe_ctx.whitelist[0])) { if (nvme_ctrlr_get(&probe_ctx.whitelist[0]) != NULL) {
return -1; return -1;
} }
@ -585,13 +586,18 @@ spdk_bdev_nvme_create(struct spdk_nvme_transport_id *trid,
return -1; return -1;
} }
nvme_ctrlr = nvme_ctrlr_get(&probe_ctx.whitelist[0]);
if (!nvme_ctrlr) {
return -1;
}
/* /*
* Report the new bdevs that were created in this call. * Report the new bdevs that were created in this call.
* There can be more than one bdev per NVMe controller since one bdev is created per namespace. * There can be more than one bdev per NVMe controller since one bdev is created per namespace.
*/ */
for (j = 0, i = 0; i < NVME_MAX_BLOCKDEVS; i++) { for (j = 0, i = 0; i < NVME_MAX_BLOCKDEVS; i++) {
if (g_bdev[i].allocated) { if (g_bdev[i].allocated) {
if (spdk_pci_addr_compare(&probe_ctx.whitelist[0], &g_bdev[i].nvme_ctrlr->pci_addr) == 0) { if (g_bdev[i].nvme_ctrlr == nvme_ctrlr) {
names[j] = g_bdev[i].disk.name; names[j] = g_bdev[i].disk.name;
j++; j++;
} }