diff --git a/lib/bdev/raid/bdev_raid.c b/lib/bdev/raid/bdev_raid.c index 35e09189d0..4995d462c2 100644 --- a/lib/bdev/raid/bdev_raid.c +++ b/lib/bdev/raid/bdev_raid.c @@ -847,6 +847,13 @@ raid_bdev_parse_raid(struct spdk_conf_section *conf_section) return -EINVAL; } + rc = raid_bdev_create(raid_cfg); + if (rc != 0) { + raid_bdev_config_cleanup(raid_cfg); + SPDK_ERRLOG("Failed to create raid bdev\n"); + return rc; + } + return 0; } @@ -1017,13 +1024,12 @@ raid_bdev_init(void) * raid_bdev_create allocates raid bdev based on passed configuration * params: * raid_cfg - configuration of raid bdev - * _raid_bdev - pointer to created raid bdev * returns: * 0 - success * non zero - failure */ -static int -raid_bdev_create(struct raid_bdev_config *raid_cfg, struct raid_bdev **_raid_bdev) +int +raid_bdev_create(struct raid_bdev_config *raid_cfg) { struct raid_bdev *raid_bdev; struct spdk_bdev *raid_bdev_gen; @@ -1034,6 +1040,7 @@ raid_bdev_create(struct raid_bdev_config *raid_cfg, struct raid_bdev **_raid_bde return -ENOMEM; } + assert(raid_cfg->num_base_bdevs != 0); raid_bdev->num_base_bdevs = raid_cfg->num_base_bdevs; raid_bdev->base_bdev_info = calloc(raid_bdev->num_base_bdevs, sizeof(struct raid_base_bdev_info)); @@ -1065,7 +1072,7 @@ raid_bdev_create(struct raid_bdev_config *raid_cfg, struct raid_bdev **_raid_bde TAILQ_INSERT_TAIL(&g_spdk_raid_bdev_configuring_list, raid_bdev, state_link); TAILQ_INSERT_TAIL(&g_spdk_raid_bdev_list, raid_bdev, global_link); - *_raid_bdev = raid_bdev; + raid_cfg->raid_bdev = raid_bdev; return 0; } @@ -1315,12 +1322,8 @@ raid_bdev_add_base_device(struct raid_bdev_config *raid_cfg, struct spdk_bdev *b raid_bdev = raid_cfg->raid_bdev; if (!raid_bdev) { - rc = raid_bdev_create(raid_cfg, &raid_bdev); - if (rc != 0) { - SPDK_ERRLOG("Failed to create raid bdev for bdev '%s'\n", bdev->name); - return rc; - } - raid_cfg->raid_bdev = raid_bdev; + SPDK_ERRLOG("Raid bdev is not created yet '%s'\n", bdev->name); + return -ENODEV; } rc = raid_bdev_alloc_base_bdev_resource(raid_bdev, bdev, base_bdev_slot); diff --git a/lib/bdev/raid/bdev_raid.h b/lib/bdev/raid/bdev_raid.h index 99c88f1b10..bc9fad9d33 100644 --- a/lib/bdev/raid/bdev_raid.h +++ b/lib/bdev/raid/bdev_raid.h @@ -202,7 +202,7 @@ extern struct spdk_raid_all_tailq g_spdk_raid_bdev_list; extern struct spdk_raid_offline_tailq g_spdk_raid_bdev_offline_list; extern struct raid_config g_spdk_raid_config; - +int raid_bdev_create(struct raid_bdev_config *raid_cfg); void raid_bdev_remove_base_bdev(void *ctx); int raid_bdev_add_base_device(struct raid_bdev_config *raid_cfg, struct spdk_bdev *bdev, uint32_t base_bdev_slot); diff --git a/lib/bdev/raid/bdev_raid_rpc.c b/lib/bdev/raid/bdev_raid_rpc.c index 60972169c4..c8d84749e6 100644 --- a/lib/bdev/raid/bdev_raid_rpc.c +++ b/lib/bdev/raid/bdev_raid_rpc.c @@ -296,6 +296,16 @@ spdk_rpc_construct_raid_bdev(struct spdk_jsonrpc_request *request, } } + rc = raid_bdev_create(raid_cfg); + if (rc != 0) { + raid_bdev_config_cleanup(raid_cfg); + spdk_jsonrpc_send_error_response_fmt(request, SPDK_JSONRPC_ERROR_INTERNAL_ERROR, + "Failed to create RAID bdev %s: %s", + req.name, spdk_strerror(-rc)); + free_rpc_construct_raid_bdev(&req); + return; + } + for (size_t i = 0; i < raid_cfg->num_base_bdevs; i++) { /* Check if base_bdev exists already, if not fail the command */ base_bdev = spdk_bdev_get_by_name(req.base_bdevs.base_bdevs[i]); diff --git a/test/unit/lib/bdev/bdev_raid.c/bdev_raid_ut.c b/test/unit/lib/bdev/bdev_raid.c/bdev_raid_ut.c index 53e9001470..bcd50eb966 100644 --- a/test/unit/lib/bdev/bdev_raid.c/bdev_raid_ut.c +++ b/test/unit/lib/bdev/bdev_raid.c/bdev_raid_ut.c @@ -1945,7 +1945,7 @@ test_create_raid_from_config(void) g_config_level_create = 0; verify_raid_config_present("raid1", true); - verify_raid_bdev_present("raid1", false); + verify_raid_bdev_present("raid1", true); TAILQ_FOREACH(bdev, &g_bdev_list, internal.link) { raid_bdev_examine(bdev);