bdev/raid: Create raid bdev before starting to add base bdevs to it
When construct_raid_bdev RPC is callled, even if all adding base bdevs to it fail, a raid bdev with no base bdev should exist and be in the configuring state. Extract raid_bdev_create() from raid_bdev_add_base_bdev() and put it before starting iteration of raid_bdev_add_base_bdev(). This change cam be applied to .INI config file too. Change-Id: Ia71aca0bbdb33049fe5bd9b8fd8163c99c032401 Signed-off-by: Shuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com> Reviewed-on: https://review.gerrithub.io/424148 Tested-by: SPDK CI Jenkins <sys_sgci@intel.com> Chandler-Test-Pool: SPDK Automated Test System <sys_sgsw@intel.com> Reviewed-by: Kunal Sablok <kunal.sablok@intel.com> Reviewed-by: Jim Harris <james.r.harris@intel.com> Reviewed-by: Ben Walker <benjamin.walker@intel.com>
This commit is contained in:
parent
8c5c2c56b9
commit
50b51bc831
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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]);
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user