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:
Shuhei Matsumoto 2018-08-31 09:25:37 +09:00 committed by Jim Harris
parent 8c5c2c56b9
commit 50b51bc831
4 changed files with 25 additions and 12 deletions

View File

@ -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);

View File

@ -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);

View File

@ -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]);

View File

@ -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);