bdev: handling duplicated bdev name

Change the return type of spdk_bdev_register related
functions and try to handle the duplicated name
issue.

Change-Id: I23af11583cf2050579d1624508306a35394bffde
Signed-off-by: Ziye Yang <optimistyzy@gmail.com>
Reviewed-on: https://review.gerrithub.io/388178
Tested-by: SPDK Automated Test System <sys_sgsw@intel.com>
Reviewed-by: Daniel Verkamp <daniel.verkamp@intel.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
Reviewed-by: Ben Walker <benjamin.walker@intel.com>
This commit is contained in:
Ziye Yang 2017-11-20 17:31:39 +08:00 committed by Jim Harris
parent 939df28e3b
commit 6802fe99f4
13 changed files with 90 additions and 21 deletions

View File

@ -382,11 +382,11 @@ struct spdk_bdev_io {
/* No members may be added after driver_ctx! */ /* No members may be added after driver_ctx! */
}; };
void spdk_bdev_register(struct spdk_bdev *bdev); int spdk_bdev_register(struct spdk_bdev *bdev);
void spdk_bdev_unregister(struct spdk_bdev *bdev, spdk_bdev_unregister_cb cb_fn, void *cb_arg); void spdk_bdev_unregister(struct spdk_bdev *bdev, spdk_bdev_unregister_cb cb_fn, void *cb_arg);
void spdk_bdev_unregister_done(struct spdk_bdev *bdev, int bdeverrno); void spdk_bdev_unregister_done(struct spdk_bdev *bdev, int bdeverrno);
void spdk_vbdev_register(struct spdk_bdev *vbdev, struct spdk_bdev **base_bdevs, int spdk_vbdev_register(struct spdk_bdev *vbdev, struct spdk_bdev **base_bdevs,
int base_bdev_count); int base_bdev_count);
void spdk_vbdev_unregister(struct spdk_bdev *vbdev, spdk_bdev_unregister_cb cb_fn, void *cb_arg); void spdk_vbdev_unregister(struct spdk_bdev *vbdev, spdk_bdev_unregister_cb cb_fn, void *cb_arg);
void spdk_bdev_module_examine_done(struct spdk_bdev_module_if *module); void spdk_bdev_module_examine_done(struct spdk_bdev_module_if *module);

View File

@ -373,6 +373,7 @@ create_aio_disk(const char *name, const char *filename, uint32_t block_size)
struct file_disk *fdisk; struct file_disk *fdisk;
uint32_t detected_block_size; uint32_t detected_block_size;
uint64_t disk_size; uint64_t disk_size;
int rc;
fdisk = calloc(sizeof(*fdisk), 1); fdisk = calloc(sizeof(*fdisk), 1);
if (!fdisk) { if (!fdisk) {
@ -450,7 +451,11 @@ create_aio_disk(const char *name, const char *filename, uint32_t block_size)
spdk_io_device_register(&fdisk->fd, bdev_aio_create_cb, bdev_aio_destroy_cb, spdk_io_device_register(&fdisk->fd, bdev_aio_create_cb, bdev_aio_destroy_cb,
sizeof(struct bdev_aio_io_channel)); sizeof(struct bdev_aio_io_channel));
spdk_bdev_register(&fdisk->disk); rc = spdk_bdev_register(&fdisk->disk);
if (rc) {
spdk_io_device_unregister(&fdisk->fd, NULL);
goto error_return;
}
TAILQ_INSERT_TAIL(&g_aio_disk_head, fdisk, link); TAILQ_INSERT_TAIL(&g_aio_disk_head, fdisk, link);
return &fdisk->disk; return &fdisk->disk;

View File

@ -1773,13 +1773,23 @@ spdk_bdev_io_get_thread(struct spdk_bdev_io *bdev_io)
return spdk_io_channel_get_thread(bdev_io->ch->channel); return spdk_io_channel_get_thread(bdev_io->ch->channel);
} }
static void static int
_spdk_bdev_register(struct spdk_bdev *bdev) _spdk_bdev_register(struct spdk_bdev *bdev)
{ {
struct spdk_bdev_module_if *module; struct spdk_bdev_module_if *module;
assert(bdev->module != NULL); assert(bdev->module != NULL);
if (!bdev->name) {
SPDK_ERRLOG("Bdev name is NULL\n");
return -EINVAL;
}
if (spdk_bdev_get_by_name(bdev->name)) {
SPDK_ERRLOG("Bdev name:%s already exists\n", bdev->name);
return -EEXIST;
}
bdev->status = SPDK_BDEV_STATUS_READY; bdev->status = SPDK_BDEV_STATUS_READY;
TAILQ_INIT(&bdev->open_descs); TAILQ_INIT(&bdev->open_descs);
@ -1802,25 +1812,33 @@ _spdk_bdev_register(struct spdk_bdev *bdev)
module->examine(bdev); module->examine(bdev);
} }
} }
return 0;
} }
void int
spdk_bdev_register(struct spdk_bdev *bdev) spdk_bdev_register(struct spdk_bdev *bdev)
{ {
_spdk_bdev_register(bdev); return _spdk_bdev_register(bdev);
} }
void int
spdk_vbdev_register(struct spdk_bdev *vbdev, struct spdk_bdev **base_bdevs, int base_bdev_count) spdk_vbdev_register(struct spdk_bdev *vbdev, struct spdk_bdev **base_bdevs, int base_bdev_count)
{ {
int i; int i, rc;
rc = _spdk_bdev_register(vbdev);
if (rc) {
return rc;
}
_spdk_bdev_register(vbdev);
for (i = 0; i < base_bdev_count; i++) { for (i = 0; i < base_bdev_count; i++) {
assert(base_bdevs[i] != NULL); assert(base_bdevs[i] != NULL);
TAILQ_INSERT_TAIL(&vbdev->base_bdevs, base_bdevs[i], base_bdev_link); TAILQ_INSERT_TAIL(&vbdev->base_bdevs, base_bdevs[i], base_bdev_link);
TAILQ_INSERT_TAIL(&base_bdevs[i]->vbdevs, vbdev, vbdev_link); TAILQ_INSERT_TAIL(&base_bdevs[i]->vbdevs, vbdev, vbdev_link);
} }
return 0;
} }
void void

View File

@ -634,6 +634,7 @@ _create_lvol_disk(struct spdk_lvol *lvol)
struct spdk_bdev *bdev; struct spdk_bdev *bdev;
struct lvol_store_bdev *lvs_bdev; struct lvol_store_bdev *lvs_bdev;
uint64_t total_size; uint64_t total_size;
int rc;
if (!lvol->old_name) { if (!lvol->old_name) {
return NULL; return NULL;
@ -668,7 +669,12 @@ _create_lvol_disk(struct spdk_lvol *lvol)
bdev->fn_table = &vbdev_lvol_fn_table; bdev->fn_table = &vbdev_lvol_fn_table;
bdev->module = SPDK_GET_BDEV_MODULE(lvol); bdev->module = SPDK_GET_BDEV_MODULE(lvol);
spdk_vbdev_register(bdev, &lvs_bdev->bdev, 1); rc = spdk_vbdev_register(bdev, &lvs_bdev->bdev, 1);
if (rc) {
free(bdev->name);
free(bdev);
return NULL;
}
return bdev; return bdev;
} }

View File

@ -370,6 +370,7 @@ static const struct spdk_bdev_fn_table malloc_fn_table = {
struct spdk_bdev *create_malloc_disk(const char *name, uint64_t num_blocks, uint32_t block_size) struct spdk_bdev *create_malloc_disk(const char *name, uint64_t num_blocks, uint32_t block_size)
{ {
struct malloc_disk *mdisk; struct malloc_disk *mdisk;
int rc;
if (block_size % 512 != 0) { if (block_size % 512 != 0) {
SPDK_ERRLOG("Block size %u is not a multiple of 512.\n", block_size); SPDK_ERRLOG("Block size %u is not a multiple of 512.\n", block_size);
@ -421,7 +422,11 @@ struct spdk_bdev *create_malloc_disk(const char *name, uint64_t num_blocks, uint
mdisk->disk.fn_table = &malloc_fn_table; mdisk->disk.fn_table = &malloc_fn_table;
mdisk->disk.module = SPDK_GET_BDEV_MODULE(malloc); mdisk->disk.module = SPDK_GET_BDEV_MODULE(malloc);
spdk_bdev_register(&mdisk->disk); rc = spdk_bdev_register(&mdisk->disk);
if (rc) {
malloc_disk_free(mdisk);
return NULL;
}
mdisk->next = g_malloc_disk_head; mdisk->next = g_malloc_disk_head;
g_malloc_disk_head = mdisk; g_malloc_disk_head = mdisk;

View File

@ -129,6 +129,7 @@ struct spdk_bdev *
create_null_bdev(const char *name, uint64_t num_blocks, uint32_t block_size) create_null_bdev(const char *name, uint64_t num_blocks, uint32_t block_size)
{ {
struct null_bdev *bdev; struct null_bdev *bdev;
int rc;
if (block_size % 512 != 0) { if (block_size % 512 != 0) {
SPDK_ERRLOG("Block size %u is not a multiple of 512.\n", block_size); SPDK_ERRLOG("Block size %u is not a multiple of 512.\n", block_size);
@ -161,7 +162,12 @@ create_null_bdev(const char *name, uint64_t num_blocks, uint32_t block_size)
bdev->bdev.fn_table = &null_fn_table; bdev->bdev.fn_table = &null_fn_table;
bdev->bdev.module = SPDK_GET_BDEV_MODULE(null); bdev->bdev.module = SPDK_GET_BDEV_MODULE(null);
spdk_bdev_register(&bdev->bdev); rc = spdk_bdev_register(&bdev->bdev);
if (rc) {
free(bdev->bdev.name);
spdk_dma_free(bdev);
return NULL;
}
TAILQ_INSERT_TAIL(&g_null_bdev_head, bdev, tailq); TAILQ_INSERT_TAIL(&g_null_bdev_head, bdev, tailq);

View File

@ -1131,7 +1131,7 @@ nvme_ctrlr_create_bdevs(struct nvme_ctrlr *nvme_ctrlr)
struct spdk_nvme_ctrlr *ctrlr = nvme_ctrlr->ctrlr; struct spdk_nvme_ctrlr *ctrlr = nvme_ctrlr->ctrlr;
struct spdk_nvme_ns *ns; struct spdk_nvme_ns *ns;
const struct spdk_nvme_ctrlr_data *cdata; const struct spdk_nvme_ctrlr_data *cdata;
int ns_id, num_ns; int ns_id, num_ns, rc;
int bdev_created = 0; int bdev_created = 0;
num_ns = spdk_nvme_ctrlr_get_num_ns(ctrlr); num_ns = spdk_nvme_ctrlr_get_num_ns(ctrlr);
@ -1176,7 +1176,12 @@ nvme_ctrlr_create_bdevs(struct nvme_ctrlr *nvme_ctrlr)
bdev->disk.ctxt = bdev; bdev->disk.ctxt = bdev;
bdev->disk.fn_table = &nvmelib_fn_table; bdev->disk.fn_table = &nvmelib_fn_table;
bdev->disk.module = SPDK_GET_BDEV_MODULE(nvme); bdev->disk.module = SPDK_GET_BDEV_MODULE(nvme);
spdk_bdev_register(&bdev->disk); rc = spdk_bdev_register(&bdev->disk);
if (rc) {
free(bdev->disk.name);
free(bdev);
break;
}
TAILQ_INSERT_TAIL(&g_nvme_bdevs, bdev, link); TAILQ_INSERT_TAIL(&g_nvme_bdevs, bdev, link);

View File

@ -295,6 +295,7 @@ spdk_create_pmem_disk(const char *pmem_file, char *name, struct spdk_bdev **bdev
uint64_t num_blocks; uint64_t num_blocks;
uint32_t block_size; uint32_t block_size;
struct pmem_disk *pdisk; struct pmem_disk *pdisk;
int rc;
if (pmemblk_check(pmem_file, 0) != 1) { if (pmemblk_check(pmem_file, 0) != 1) {
SPDK_ERRLOG("Pool '%s' check failed: %s\n", pmem_file, pmemblk_errormsg()); SPDK_ERRLOG("Pool '%s' check failed: %s\n", pmem_file, pmemblk_errormsg());
@ -353,7 +354,13 @@ spdk_create_pmem_disk(const char *pmem_file, char *name, struct spdk_bdev **bdev
pdisk->disk.fn_table = &pmem_fn_table; pdisk->disk.fn_table = &pmem_fn_table;
pdisk->disk.module = SPDK_GET_BDEV_MODULE(pmem); pdisk->disk.module = SPDK_GET_BDEV_MODULE(pmem);
spdk_bdev_register(&pdisk->disk); rc = spdk_bdev_register(&pdisk->disk);
if (rc) {
pmemblk_close(pdisk->pool);
free(pdisk->disk.name);
free(pdisk);
return rc;
}
TAILQ_INSERT_TAIL(&g_pmem_disks, pdisk, tailq); TAILQ_INSERT_TAIL(&g_pmem_disks, pdisk, tailq);

View File

@ -534,12 +534,18 @@ spdk_bdev_rbd_create(const char *pool_name, const char *rbd_name, uint32_t block
rbd->disk.module = SPDK_GET_BDEV_MODULE(rbd); rbd->disk.module = SPDK_GET_BDEV_MODULE(rbd);
SPDK_NOTICELOG("Add %s rbd disk to lun\n", rbd->disk.name); SPDK_NOTICELOG("Add %s rbd disk to lun\n", rbd->disk.name);
TAILQ_INSERT_TAIL(&g_rbds, rbd, tailq);
spdk_io_device_register(&rbd->info, bdev_rbd_create_cb, spdk_io_device_register(&rbd->info, bdev_rbd_create_cb,
bdev_rbd_destroy_cb, bdev_rbd_destroy_cb,
sizeof(struct bdev_rbd_io_channel)); sizeof(struct bdev_rbd_io_channel));
spdk_bdev_register(&rbd->disk); ret = spdk_bdev_register(&rbd->disk);
if (ret) {
spdk_io_device_unregister(&rbd->info, NULL);
bdev_rbd_free(rbd);
return NULL;
}
TAILQ_INSERT_TAIL(&g_rbds, rbd, tailq);
return &rbd->disk; return &rbd->disk;
} }

View File

@ -634,7 +634,14 @@ scan_target_finish(struct virtio_scsi_scan_base *base)
while ((disk = TAILQ_FIRST(&base->found_disks))) { while ((disk = TAILQ_FIRST(&base->found_disks))) {
TAILQ_REMOVE(&base->found_disks, disk, link); TAILQ_REMOVE(&base->found_disks, disk, link);
spdk_bdev_register(&disk->bdev); rc = spdk_bdev_register(&disk->bdev);
if (rc) {
spdk_io_device_unregister(base->vdev, NULL);
SPDK_ERRLOG("Failed to register bdev name=%s\n", disk->bdev.name);
spdk_ring_free(ctrlq_ring);
scan_target_abort(base, rc);
return;
}
bdevs[bdevs_cnt] = &disk->bdev; bdevs[bdevs_cnt] = &disk->bdev;
bdevs_cnt++; bdevs_cnt++;
} }

View File

@ -337,6 +337,7 @@ part_test(void)
base = calloc(1, sizeof(*base)); base = calloc(1, sizeof(*base));
SPDK_CU_ASSERT_FATAL(base != NULL); SPDK_CU_ASSERT_FATAL(base != NULL);
bdev_base.name = "base";
bdev_base.fn_table = &base_fn_table; bdev_base.fn_table = &base_fn_table;
bdev_base.module = SPDK_GET_BDEV_MODULE(bdev_ut); bdev_base.module = SPDK_GET_BDEV_MODULE(bdev_ut);
spdk_bdev_register(&bdev_base); spdk_bdev_register(&bdev_base);

View File

@ -259,11 +259,13 @@ spdk_bdev_io_complete(struct spdk_bdev_io *bdev_io, enum spdk_bdev_io_status sta
bdev_io->status = status; bdev_io->status = status;
} }
void int
spdk_bdev_register(struct spdk_bdev *bdev) spdk_bdev_register(struct spdk_bdev *bdev)
{ {
CU_ASSERT_PTR_NULL(g_bdev); CU_ASSERT_PTR_NULL(g_bdev);
g_bdev = bdev; g_bdev = bdev;
return 0;
} }
void void

View File

@ -421,10 +421,11 @@ spdk_bdev_get_name(const struct spdk_bdev *bdev)
return "test"; return "test";
} }
void int
spdk_vbdev_register(struct spdk_bdev *vbdev, struct spdk_bdev **base_bdevs, int base_bdev_count) spdk_vbdev_register(struct spdk_bdev *vbdev, struct spdk_bdev **base_bdevs, int base_bdev_count)
{ {
g_registered_bdevs++; g_registered_bdevs++;
return 0;
} }
void void