bdev: remove differentiation between bdev and vbdev modules

We still will sort the bdev_module list so that modules
with an examine() callback are initialized first.  This ensures
they have a chance to initialize before later modules start
registering physical block devices.

Signed-off-by: Jim Harris <james.r.harris@intel.com>
Change-Id: I792cfb41b0abe030fe2486a2c872cbf329735932

Reviewed-on: https://review.gerrithub.io/369486
Tested-by: SPDK Automated Test System <sys_sgsw@intel.com>
Reviewed-by: Ben Walker <benjamin.walker@intel.com>
Reviewed-by: Daniel Verkamp <daniel.verkamp@intel.com>
This commit is contained in:
Jim Harris 2017-07-12 21:06:22 -07:00
parent 7fefd60fab
commit f71447e80d
11 changed files with 76 additions and 127 deletions

View File

@ -50,12 +50,8 @@
* To implement a backend block device driver, a number of functions
* dictated by struct spdk_bdev_fn_table must be provided.
*
* The module should register itself using SPDK_BDEV_MODULE_REGISTER or
* SPDK_VBDEV_MODULE_REGISTER to define the parameters for the module.
*
* Use SPDK_BDEV_MODULE_REGISTER for all block backends that are real disks.
* Any virtual backends such as RAID, partitioning, etc. should use
* SPDK_VBDEV_MODULE_REGISTER.
* The module should register itself using SPDK_BDEV_MODULE_REGISTER to
* define the parameters for the module.
*
* <hr>
*
@ -223,7 +219,11 @@ struct spdk_bdev {
bool bdev_opened_for_write;
struct spdk_bdev_module_if *vbdev_claim_module;
/**
* Pointer to the module that has claimed this bdev for purposes of creating virtual
* bdevs on top of it. Set to NULL if the bdev has not been claimed.
*/
struct spdk_bdev_module_if *claim_module;
/** List of open descriptors for this block device. */
TAILQ_HEAD(, spdk_bdev_desc) open_descs;
@ -382,11 +382,11 @@ void spdk_vbdev_register(struct spdk_bdev *vbdev, struct spdk_bdev **base_bdevs,
int base_bdev_count);
void spdk_vbdev_unregister(struct spdk_bdev *vbdev);
void spdk_vbdev_module_examine_done(struct spdk_bdev_module_if *module);
void spdk_bdev_module_examine_done(struct spdk_bdev_module_if *module);
int spdk_vbdev_module_claim_bdev(struct spdk_bdev *bdev, struct spdk_bdev_desc *desc,
struct spdk_bdev_module_if *module);
void spdk_vbdev_module_release_bdev(struct spdk_bdev *bdev);
int spdk_bdev_module_claim_bdev(struct spdk_bdev *bdev, struct spdk_bdev_desc *desc,
struct spdk_bdev_module_if *module);
void spdk_bdev_module_release_bdev(struct spdk_bdev *bdev);
void spdk_bdev_poller_start(struct spdk_bdev_poller **ppoller,
spdk_bdev_poller_fn fn,
@ -428,7 +428,6 @@ void spdk_scsi_nvme_translate(const struct spdk_bdev_io *bdev_io,
int *sc, int *sk, int *asc, int *ascq);
void spdk_bdev_module_list_add(struct spdk_bdev_module_if *bdev_module);
void spdk_vbdev_module_list_add(struct spdk_bdev_module_if *vbdev_module);
static inline struct spdk_bdev_io *
spdk_bdev_io_from_ctx(void *ctx)
@ -437,20 +436,7 @@ spdk_bdev_io_from_ctx(void *ctx)
((uintptr_t)ctx - offsetof(struct spdk_bdev_io, driver_ctx));
}
#define SPDK_BDEV_MODULE_REGISTER(_name, init_fn, fini_fn, config_fn, ctx_size_fn) \
static struct spdk_bdev_module_if _name ## _if = { \
.name = #_name, \
.module_init = init_fn, \
.module_fini = fini_fn, \
.config_text = config_fn, \
.get_ctx_size = ctx_size_fn, \
}; \
__attribute__((constructor)) static void _name ## _init(void) \
{ \
spdk_bdev_module_list_add(&_name ## _if); \
}
#define SPDK_VBDEV_MODULE_REGISTER(_name, init_fn, fini_fn, config_fn, ctx_size_fn, examine_fn)\
#define SPDK_BDEV_MODULE_REGISTER(_name, init_fn, fini_fn, config_fn, ctx_size_fn, examine_fn)\
static struct spdk_bdev_module_if _name ## _if = { \
.name = #_name, \
.module_init = init_fn, \
@ -461,14 +447,14 @@ spdk_bdev_io_from_ctx(void *ctx)
}; \
__attribute__((constructor)) static void _name ## _init(void) \
{ \
spdk_vbdev_module_list_add(&_name ## _if); \
spdk_bdev_module_list_add(&_name ## _if); \
}
#define SPDK_GET_BDEV_MODULE(name) &name ## _if
/*
* Modules are not required to use this macro. It allows modules to reference the module with
* SPDK_GET_BDEV_MODULE() before it is defined by SPDK_BDEV_MODULE_REGISTER or its VBDEV variant.
* SPDK_GET_BDEV_MODULE() before it is defined by SPDK_BDEV_MODULE_REGISTER.
*/
#define SPDK_DECLARE_BDEV_MODULE(name) \
static struct spdk_bdev_module_if name ## _if;

View File

@ -52,7 +52,7 @@ bdev_aio_get_ctx_size(void)
return sizeof(struct bdev_aio_task);
}
SPDK_BDEV_MODULE_REGISTER(aio, bdev_aio_initialize, NULL, NULL, bdev_aio_get_ctx_size)
SPDK_BDEV_MODULE_REGISTER(aio, bdev_aio_initialize, NULL, NULL, bdev_aio_get_ctx_size, NULL)
static int
bdev_aio_open(struct file_disk *disk)

View File

@ -64,7 +64,6 @@ struct spdk_bdev_mgr {
struct spdk_mempool *buf_large_pool;
TAILQ_HEAD(, spdk_bdev_module_if) bdev_modules;
TAILQ_HEAD(, spdk_bdev_module_if) vbdev_modules;
TAILQ_HEAD(, spdk_bdev) bdevs;
@ -81,7 +80,6 @@ struct spdk_bdev_mgr {
static struct spdk_bdev_mgr g_bdev_mgr = {
.bdev_modules = TAILQ_HEAD_INITIALIZER(g_bdev_mgr.bdev_modules),
.vbdev_modules = TAILQ_HEAD_INITIALIZER(g_bdev_mgr.vbdev_modules),
.bdevs = TAILQ_HEAD_INITIALIZER(g_bdev_mgr.bdevs),
.start_poller_fn = NULL,
.stop_poller_fn = NULL,
@ -311,12 +309,6 @@ spdk_bdev_module_get_max_ctx_size(void)
}
}
TAILQ_FOREACH(bdev_module, &g_bdev_mgr.vbdev_modules, tailq) {
if (bdev_module->get_ctx_size && bdev_module->get_ctx_size() > max_bdev_module_size) {
max_bdev_module_size = bdev_module->get_ctx_size();
}
}
return max_bdev_module_size;
}
@ -330,11 +322,6 @@ spdk_bdev_config_text(FILE *fp)
bdev_module->config_text(fp);
}
}
TAILQ_FOREACH(bdev_module, &g_bdev_mgr.vbdev_modules, tailq) {
if (bdev_module->config_text) {
bdev_module->config_text(fp);
}
}
}
static int
@ -383,11 +370,11 @@ spdk_bdev_module_init_complete(int rc)
}
/*
* Check all vbdev modules for an examinations in progress. If any
* Check all bdev modules for an examinations in progress. If any
* exist, return immediately since we cannot finish bdev subsystem
* initialization until all are completed.
*/
TAILQ_FOREACH(m, &g_bdev_mgr.vbdev_modules, tailq) {
TAILQ_FOREACH(m, &g_bdev_mgr.bdev_modules, tailq) {
if (m->examine_in_progress > 0) {
return;
}
@ -412,22 +399,6 @@ spdk_bdev_modules_init(void)
return 0;
}
static int
spdk_vbdev_modules_init(void)
{
struct spdk_bdev_module_if *module;
int rc;
TAILQ_FOREACH(module, &g_bdev_mgr.vbdev_modules, tailq) {
rc = module->module_init();
if (rc != 0) {
return rc;
}
}
return 0;
}
void
spdk_bdev_poller_start(struct spdk_bdev_poller **ppoller,
spdk_bdev_poller_fn fn,
@ -510,12 +481,6 @@ spdk_bdev_initialize(spdk_bdev_init_cb cb_fn, void *cb_arg,
spdk_bdev_mgmt_channel_destroy,
sizeof(struct spdk_bdev_mgmt_channel));
rc = spdk_vbdev_modules_init();
if (rc != 0) {
spdk_bdev_module_init_complete(rc);
return;
}
rc = spdk_bdev_modules_init();
spdk_bdev_module_init_complete(rc);
}
@ -525,12 +490,6 @@ spdk_bdev_finish(void)
{
struct spdk_bdev_module_if *bdev_module;
TAILQ_FOREACH(bdev_module, &g_bdev_mgr.vbdev_modules, tailq) {
if (bdev_module->module_fini) {
bdev_module->module_fini();
}
}
TAILQ_FOREACH(bdev_module, &g_bdev_mgr.bdev_modules, tailq) {
if (bdev_module->module_fini) {
bdev_module->module_fini();
@ -1378,7 +1337,7 @@ spdk_bdev_io_get_nvme_status(const struct spdk_bdev_io *bdev_io, int *sct, int *
static void
_spdk_bdev_register(struct spdk_bdev *bdev)
{
struct spdk_bdev_module_if *vbdev_module;
struct spdk_bdev_module_if *module;
assert(bdev->module != NULL);
@ -1402,9 +1361,11 @@ _spdk_bdev_register(struct spdk_bdev *bdev)
SPDK_TRACELOG(SPDK_TRACE_DEBUG, "Inserting bdev %s into list\n", bdev->name);
TAILQ_INSERT_TAIL(&g_bdev_mgr.bdevs, bdev, link);
TAILQ_FOREACH(vbdev_module, &g_bdev_mgr.vbdev_modules, tailq) {
vbdev_module->examine_in_progress++;
vbdev_module->examine(bdev);
TAILQ_FOREACH(module, &g_bdev_mgr.bdev_modules, tailq) {
if (module->examine) {
module->examine_in_progress++;
module->examine(bdev);
}
}
}
@ -1478,7 +1439,7 @@ spdk_vbdev_unregister(struct spdk_bdev *vbdev)
}
void
spdk_vbdev_module_examine_done(struct spdk_bdev_module_if *module)
spdk_bdev_module_examine_done(struct spdk_bdev_module_if *module)
{
struct spdk_bdev_module_if *m;
@ -1486,11 +1447,11 @@ spdk_vbdev_module_examine_done(struct spdk_bdev_module_if *module)
module->examine_in_progress--;
/*
* Check all vbdev modules for an examinations in progress. If any
* Check all bdev modules for an examinations in progress. If any
* exist, return immediately since we cannot finish bdev subsystem
* initialization until all are completed.
*/
TAILQ_FOREACH(m, &g_bdev_mgr.vbdev_modules, tailq) {
TAILQ_FOREACH(m, &g_bdev_mgr.bdev_modules, tailq) {
if (m->examine_in_progress > 0) {
return;
}
@ -1499,8 +1460,8 @@ spdk_vbdev_module_examine_done(struct spdk_bdev_module_if *module)
if (g_bdev_mgr.module_init_complete && !g_bdev_mgr.init_complete) {
/*
* Modules already finished initialization - now that all
* the vbdevs have finished their asynchronous I/O processing,
* the entire bdev layer can be marked as complete.
* the bdev moduless have finished their asynchronous I/O
* processing, the entire bdev layer can be marked as complete.
*/
spdk_bdev_init_complete(0);
}
@ -1519,7 +1480,7 @@ spdk_bdev_open(struct spdk_bdev *bdev, bool write, spdk_bdev_remove_cb_t remove_
pthread_mutex_lock(&bdev->mutex);
if (write && (bdev->bdev_opened_for_write || bdev->vbdev_claim_module)) {
if (write && (bdev->bdev_opened_for_write || bdev->claim_module)) {
SPDK_ERRLOG("failed, %s already opened for write or claimed\n", bdev->name);
free(desc);
pthread_mutex_unlock(&bdev->mutex);
@ -1570,12 +1531,12 @@ spdk_bdev_close(struct spdk_bdev_desc *desc)
}
int
spdk_vbdev_module_claim_bdev(struct spdk_bdev *bdev, struct spdk_bdev_desc *desc,
struct spdk_bdev_module_if *module)
spdk_bdev_module_claim_bdev(struct spdk_bdev *bdev, struct spdk_bdev_desc *desc,
struct spdk_bdev_module_if *module)
{
if (bdev->vbdev_claim_module != NULL) {
if (bdev->claim_module != NULL) {
SPDK_ERRLOG("bdev %s already claimed by module %s\n", bdev->name,
bdev->vbdev_claim_module->name);
bdev->claim_module->name);
return -EPERM;
}
@ -1588,15 +1549,15 @@ spdk_vbdev_module_claim_bdev(struct spdk_bdev *bdev, struct spdk_bdev_desc *desc
desc->write = true;
}
bdev->vbdev_claim_module = module;
bdev->claim_module = module;
return 0;
}
void
spdk_vbdev_module_release_bdev(struct spdk_bdev *bdev)
spdk_bdev_module_release_bdev(struct spdk_bdev *bdev)
{
assert(bdev->vbdev_claim_module != NULL);
bdev->vbdev_claim_module = NULL;
assert(bdev->claim_module != NULL);
bdev->claim_module = NULL;
}
void
@ -1635,12 +1596,14 @@ spdk_bdev_io_get_iovec(struct spdk_bdev_io *bdev_io, struct iovec **iovp, int *i
void
spdk_bdev_module_list_add(struct spdk_bdev_module_if *bdev_module)
{
TAILQ_INSERT_TAIL(&g_bdev_mgr.bdev_modules, bdev_module, tailq);
}
void
spdk_vbdev_module_list_add(struct spdk_bdev_module_if *vbdev_module)
{
assert(vbdev_module->examine != NULL);
TAILQ_INSERT_TAIL(&g_bdev_mgr.vbdev_modules, vbdev_module, tailq);
/*
* Modules with examine callbacks must be initialized first, so they are
* ready to handle examine callbacks from later modules that will
* register physical bdevs.
*/
if (bdev_module->examine != NULL) {
TAILQ_INSERT_HEAD(&g_bdev_mgr.bdev_modules, bdev_module, tailq);
} else {
TAILQ_INSERT_TAIL(&g_bdev_mgr.bdev_modules, bdev_module, tailq);
}
}

View File

@ -259,7 +259,7 @@ spdk_vbdev_error_create(struct spdk_bdev *base_bdev)
goto cleanup;
}
rc = spdk_vbdev_module_claim_bdev(base_bdev, NULL, SPDK_GET_BDEV_MODULE(error));
rc = spdk_bdev_module_claim_bdev(base_bdev, NULL, SPDK_GET_BDEV_MODULE(error));
if (rc) {
SPDK_ERRLOG("could not claim bdev %s\n", spdk_bdev_get_name(base_bdev));
goto cleanup;
@ -305,7 +305,7 @@ vbdev_error_examine(struct spdk_bdev *bdev)
sp = spdk_conf_find_section(NULL, "BdevError");
if (sp == NULL) {
spdk_vbdev_module_examine_done(SPDK_GET_BDEV_MODULE(error));
spdk_bdev_module_examine_done(SPDK_GET_BDEV_MODULE(error));
return;
}
@ -330,7 +330,7 @@ vbdev_error_examine(struct spdk_bdev *bdev)
}
}
spdk_vbdev_module_examine_done(SPDK_GET_BDEV_MODULE(error));
spdk_bdev_module_examine_done(SPDK_GET_BDEV_MODULE(error));
}
static void
@ -343,5 +343,5 @@ vbdev_error_fini(void)
}
}
SPDK_VBDEV_MODULE_REGISTER(error, vbdev_error_init, vbdev_error_fini, NULL, NULL,
vbdev_error_examine)
SPDK_BDEV_MODULE_REGISTER(error, vbdev_error_init, vbdev_error_fini, NULL, NULL,
vbdev_error_examine)

View File

@ -445,7 +445,7 @@ spdk_gpt_bdev_complete(struct spdk_bdev_io *bdev_io, bool status, void *arg)
goto end;
}
rc = spdk_vbdev_module_claim_bdev(bdev, NULL, SPDK_GET_BDEV_MODULE(gpt));
rc = spdk_bdev_module_claim_bdev(bdev, NULL, SPDK_GET_BDEV_MODULE(gpt));
if (rc) {
SPDK_ERRLOG("could not claim bdev %s\n", spdk_bdev_get_name(bdev));
goto end;
@ -463,13 +463,13 @@ end:
* Notify the generic bdev layer that the actions related to the original examine
* callback are now completed.
*/
spdk_vbdev_module_examine_done(SPDK_GET_BDEV_MODULE(gpt));
spdk_bdev_module_examine_done(SPDK_GET_BDEV_MODULE(gpt));
if (gpt_bdev->ref == 0) {
/* If no gpt_partition_disk instances were created, free the base context */
spdk_gpt_bdev_free(gpt_bdev);
if (claimed) {
spdk_vbdev_module_release_bdev(bdev);
spdk_bdev_module_release_bdev(bdev);
}
}
}
@ -526,13 +526,13 @@ vbdev_gpt_examine(struct spdk_bdev *bdev)
int rc;
if (g_gpt_disabled) {
spdk_vbdev_module_examine_done(SPDK_GET_BDEV_MODULE(gpt));
spdk_bdev_module_examine_done(SPDK_GET_BDEV_MODULE(gpt));
return;
}
rc = vbdev_gpt_read_gpt(bdev);
if (rc) {
spdk_vbdev_module_examine_done(SPDK_GET_BDEV_MODULE(gpt));
spdk_bdev_module_examine_done(SPDK_GET_BDEV_MODULE(gpt));
SPDK_ERRLOG("Failed to read info from bdev %s\n", spdk_bdev_get_name(bdev));
}
}
@ -547,6 +547,6 @@ vbdev_gpt_get_ctx_size(void)
return sizeof(struct spdk_io_channel *);
}
SPDK_VBDEV_MODULE_REGISTER(gpt, vbdev_gpt_init, vbdev_gpt_fini, NULL,
vbdev_gpt_get_ctx_size, vbdev_gpt_examine)
SPDK_BDEV_MODULE_REGISTER(gpt, vbdev_gpt_init, vbdev_gpt_fini, NULL,
vbdev_gpt_get_ctx_size, vbdev_gpt_examine)
SPDK_LOG_REGISTER_TRACE_FLAG("vbdev_gpt", SPDK_TRACE_VBDEV_GPT)

View File

@ -100,7 +100,7 @@ bdev_malloc_get_ctx_size(void)
}
SPDK_BDEV_MODULE_REGISTER(malloc, bdev_malloc_initialize, bdev_malloc_finish,
bdev_malloc_get_spdk_running_config, bdev_malloc_get_ctx_size)
bdev_malloc_get_spdk_running_config, bdev_malloc_get_ctx_size, NULL)
static void
bdev_malloc_delete_from_list(struct malloc_disk *malloc_disk)

View File

@ -288,6 +288,6 @@ bdev_null_get_spdk_running_config(FILE *fp)
}
SPDK_BDEV_MODULE_REGISTER(null, bdev_null_initialize, bdev_null_finish,
bdev_null_get_spdk_running_config, bdev_null_get_ctx_size)
bdev_null_get_spdk_running_config, bdev_null_get_ctx_size, NULL)
SPDK_LOG_REGISTER_TRACE_FLAG("bdev_null", SPDK_TRACE_BDEV_NULL)

View File

@ -152,7 +152,7 @@ bdev_nvme_get_ctx_size(void)
SPDK_BDEV_MODULE_REGISTER(nvme, bdev_nvme_library_init, bdev_nvme_library_fini,
bdev_nvme_get_spdk_running_config,
bdev_nvme_get_ctx_size)
bdev_nvme_get_ctx_size, NULL)
static int
bdev_nvme_readv(struct nvme_bdev *nbdev, struct spdk_io_channel *ch,

View File

@ -211,7 +211,7 @@ bdev_rbd_get_ctx_size(void)
}
SPDK_BDEV_MODULE_REGISTER(rbd, bdev_rbd_library_init, bdev_rbd_library_fini, NULL,
bdev_rbd_get_ctx_size)
bdev_rbd_get_ctx_size, NULL)
static int64_t
bdev_rbd_readv(struct bdev_rbd *disk, struct spdk_io_channel *ch,

View File

@ -240,7 +240,7 @@ vbdev_split_create(struct spdk_bdev *base_bdev, uint64_t split_count, uint64_t s
int rc;
struct split_base *split_base;
rc = spdk_vbdev_module_claim_bdev(base_bdev, NULL, SPDK_GET_BDEV_MODULE(split));
rc = spdk_bdev_module_claim_bdev(base_bdev, NULL, SPDK_GET_BDEV_MODULE(split));
if (rc) {
SPDK_ERRLOG("could not claim bdev %s\n", spdk_bdev_get_name(base_bdev));
return -1;
@ -358,7 +358,7 @@ vbdev_split_examine(struct spdk_bdev *bdev)
sp = spdk_conf_find_section(NULL, "Split");
if (sp == NULL) {
spdk_vbdev_module_examine_done(SPDK_GET_BDEV_MODULE(split));
spdk_bdev_module_examine_done(SPDK_GET_BDEV_MODULE(split));
return;
}
@ -406,7 +406,7 @@ vbdev_split_examine(struct spdk_bdev *bdev)
}
}
spdk_vbdev_module_examine_done(SPDK_GET_BDEV_MODULE(split));
spdk_bdev_module_examine_done(SPDK_GET_BDEV_MODULE(split));
}
static void
@ -429,6 +429,6 @@ vbdev_split_get_ctx_size(void)
return sizeof(struct spdk_io_channel *);
}
SPDK_VBDEV_MODULE_REGISTER(split, vbdev_split_init, vbdev_split_fini, NULL,
vbdev_split_get_ctx_size, vbdev_split_examine)
SPDK_BDEV_MODULE_REGISTER(split, vbdev_split_init, vbdev_split_fini, NULL,
vbdev_split_get_ctx_size, vbdev_split_examine)
SPDK_LOG_REGISTER_TRACE_FLAG("vbdev_split", SPDK_TRACE_VBDEV_SPLIT)

View File

@ -118,11 +118,11 @@ static struct spdk_bdev_fn_table fn_table = {
static void
vbdev_ut_examine(struct spdk_bdev *bdev)
{
spdk_vbdev_module_examine_done(SPDK_GET_BDEV_MODULE(vbdev_ut));
spdk_bdev_module_examine_done(SPDK_GET_BDEV_MODULE(vbdev_ut));
}
SPDK_BDEV_MODULE_REGISTER(bdev_ut, NULL, NULL, NULL, NULL)
SPDK_VBDEV_MODULE_REGISTER(vbdev_ut, NULL, NULL, NULL, NULL, vbdev_ut_examine)
SPDK_BDEV_MODULE_REGISTER(bdev_ut, NULL, NULL, NULL, NULL, NULL)
SPDK_BDEV_MODULE_REGISTER(vbdev_ut, NULL, NULL, NULL, NULL, vbdev_ut_examine)
static struct spdk_bdev *
allocate_bdev(char *name)
@ -217,23 +217,23 @@ open_write_test(void)
*/
bdev[0] = allocate_bdev("bdev0");
rc = spdk_vbdev_module_claim_bdev(bdev[0], NULL, SPDK_GET_BDEV_MODULE(bdev_ut));
rc = spdk_bdev_module_claim_bdev(bdev[0], NULL, SPDK_GET_BDEV_MODULE(bdev_ut));
CU_ASSERT(rc == 0);
bdev[1] = allocate_bdev("bdev1");
rc = spdk_vbdev_module_claim_bdev(bdev[1], NULL, SPDK_GET_BDEV_MODULE(bdev_ut));
rc = spdk_bdev_module_claim_bdev(bdev[1], NULL, SPDK_GET_BDEV_MODULE(bdev_ut));
CU_ASSERT(rc == 0);
bdev[2] = allocate_bdev("bdev2");
rc = spdk_vbdev_module_claim_bdev(bdev[2], NULL, SPDK_GET_BDEV_MODULE(bdev_ut));
rc = spdk_bdev_module_claim_bdev(bdev[2], NULL, SPDK_GET_BDEV_MODULE(bdev_ut));
CU_ASSERT(rc == 0);
bdev[3] = allocate_vbdev("bdev3", bdev[0], bdev[1]);
rc = spdk_vbdev_module_claim_bdev(bdev[3], NULL, SPDK_GET_BDEV_MODULE(bdev_ut));
rc = spdk_bdev_module_claim_bdev(bdev[3], NULL, SPDK_GET_BDEV_MODULE(bdev_ut));
CU_ASSERT(rc == 0);
bdev[4] = allocate_vbdev("bdev4", bdev[2], NULL);
rc = spdk_vbdev_module_claim_bdev(bdev[4], NULL, SPDK_GET_BDEV_MODULE(bdev_ut));
rc = spdk_bdev_module_claim_bdev(bdev[4], NULL, SPDK_GET_BDEV_MODULE(bdev_ut));
CU_ASSERT(rc == 0);
bdev[5] = allocate_vbdev("bdev5", bdev[2], NULL);