bdev/nvme: Add function to allocate bdev/nvme device.
Change-Id: I246d6427e8adfb53f041776eff6d547a6f9604a6 Signed-off-by: Cunyin Chang <cunyin.chang@intel.com>
This commit is contained in:
parent
fd63bcdca8
commit
6c067d0e9f
@ -77,6 +77,7 @@ struct nvme_blockdev {
|
|||||||
struct spdk_nvme_ctrlr *ctrlr;
|
struct spdk_nvme_ctrlr *ctrlr;
|
||||||
struct nvme_device *dev;
|
struct nvme_device *dev;
|
||||||
struct spdk_nvme_ns *ns;
|
struct spdk_nvme_ns *ns;
|
||||||
|
bool allocated;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct nvme_io_channel {
|
struct nvme_io_channel {
|
||||||
@ -111,7 +112,6 @@ struct nvme_probe_ctx {
|
|||||||
};
|
};
|
||||||
|
|
||||||
static struct nvme_blockdev g_blockdev[NVME_MAX_BLOCKDEVS];
|
static struct nvme_blockdev g_blockdev[NVME_MAX_BLOCKDEVS];
|
||||||
static int g_blockdev_index_max = 0;
|
|
||||||
static int nvme_controller_index = 0;
|
static int nvme_controller_index = 0;
|
||||||
static int num_controllers = -1;
|
static int num_controllers = -1;
|
||||||
static int g_reset_controller_on_timeout = 0;
|
static int g_reset_controller_on_timeout = 0;
|
||||||
@ -566,7 +566,7 @@ 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 prev_index_max, i;
|
int i;
|
||||||
size_t j;
|
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) {
|
||||||
@ -579,20 +579,21 @@ spdk_bdev_nvme_create(struct spdk_nvme_transport_id *trid,
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
prev_index_max = g_blockdev_index_max;
|
|
||||||
|
|
||||||
if (spdk_nvme_probe(trid, &probe_ctx, probe_cb, attach_cb, NULL)) {
|
if (spdk_nvme_probe(trid, &probe_ctx, probe_cb, attach_cb, NULL)) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
assert((g_blockdev_index_max - prev_index_max) <= (int)*count);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* 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 (i = prev_index_max, j = 0; i < g_blockdev_index_max; i++, j++) {
|
for (j = 0, i = 0; i < NVME_MAX_BLOCKDEVS; i++) {
|
||||||
|
if (g_blockdev[i].allocated) {
|
||||||
|
if (spdk_pci_addr_compare(&probe_ctx.whitelist[0], &g_blockdev[i].dev->pci_addr) == 0) {
|
||||||
names[j] = g_blockdev[i].disk.name;
|
names[j] = g_blockdev[i].disk.name;
|
||||||
|
j++;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
*count = j;
|
*count = j;
|
||||||
|
|
||||||
@ -685,6 +686,20 @@ nvme_library_fini(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static struct nvme_blockdev *
|
||||||
|
allocate_nvme_blockdev(void)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i < NVME_MAX_BLOCKDEVS; i++) {
|
||||||
|
if (g_blockdev[i].allocated == false) {
|
||||||
|
g_blockdev[i].allocated = true;
|
||||||
|
return &g_blockdev[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
nvme_ctrlr_initialize_blockdevs(struct nvme_device *nvme_dev, int ctrlr_id)
|
nvme_ctrlr_initialize_blockdevs(struct nvme_device *nvme_dev, int ctrlr_id)
|
||||||
{
|
{
|
||||||
@ -705,11 +720,11 @@ nvme_ctrlr_initialize_blockdevs(struct nvme_device *nvme_dev, int ctrlr_id)
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (g_blockdev_index_max >= NVME_MAX_BLOCKDEVS) {
|
bdev = allocate_nvme_blockdev();
|
||||||
|
if (bdev == NULL) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
bdev = &g_blockdev[g_blockdev_index_max];
|
|
||||||
bdev->ctrlr = ctrlr;
|
bdev->ctrlr = ctrlr;
|
||||||
bdev->dev = nvme_dev;
|
bdev->dev = nvme_dev;
|
||||||
bdev->ns = ns;
|
bdev->ns = ns;
|
||||||
@ -739,8 +754,6 @@ nvme_ctrlr_initialize_blockdevs(struct nvme_device *nvme_dev, int ctrlr_id)
|
|||||||
bdev->disk.ctxt = bdev;
|
bdev->disk.ctxt = bdev;
|
||||||
bdev->disk.fn_table = &nvmelib_fn_table;
|
bdev->disk.fn_table = &nvmelib_fn_table;
|
||||||
spdk_bdev_register(&bdev->disk);
|
spdk_bdev_register(&bdev->disk);
|
||||||
|
|
||||||
g_blockdev_index_max++;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user