module/raid: convert state enum to/from string

Use the string value instead of int in raid_bdev json info.

Rename raid_bdev_parse_raid_level() to match raid_bdev_str_to_state().

Change-Id: I135269fe6de0746e661828cb1d36514b082011bd
Signed-off-by: Artur Paszkiewicz <artur.paszkiewicz@intel.com>
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/15308
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: Konrad Sztyber <konrad.sztyber@intel.com>
Reviewed-by: Tomasz Zawadzki <tomasz.zawadzki@intel.com>
Community-CI: Mellanox Build Bot
This commit is contained in:
Artur Paszkiewicz 2022-11-03 14:25:30 +01:00 committed by Tomasz Zawadzki
parent 27e85f520b
commit 46ff15a658
4 changed files with 60 additions and 20 deletions

View File

@ -167,8 +167,8 @@ raid_bdev_cleanup(struct raid_bdev *raid_bdev)
{
struct raid_base_bdev_info *base_info;
SPDK_DEBUGLOG(bdev_raid, "raid_bdev_cleanup, %p name %s, state %u\n",
raid_bdev, raid_bdev->bdev.name, raid_bdev->state);
SPDK_DEBUGLOG(bdev_raid, "raid_bdev_cleanup, %p name %s, state %s\n",
raid_bdev, raid_bdev->bdev.name, raid_bdev_state_to_str(raid_bdev->state));
assert(raid_bdev->state != RAID_BDEV_STATE_ONLINE);
RAID_FOR_EACH_BASE_BDEV(raid_bdev, base_info) {
@ -626,7 +626,7 @@ raid_bdev_dump_info_json(void *ctx, struct spdk_json_write_ctx *w)
/* Dump the raid bdev configuration related information */
spdk_json_write_named_object_begin(w, "raid");
spdk_json_write_named_uint32(w, "strip_size_kb", raid_bdev->strip_size_kb);
spdk_json_write_named_uint32(w, "state", raid_bdev->state);
spdk_json_write_named_string(w, "state", raid_bdev_state_to_str(raid_bdev->state));
spdk_json_write_named_string(w, "raid_level", raid_bdev_level_to_str(raid_bdev->level));
spdk_json_write_named_uint32(w, "num_base_bdevs", raid_bdev->num_base_bdevs);
spdk_json_write_named_uint32(w, "num_base_bdevs_discovered", raid_bdev->num_base_bdevs_discovered);
@ -753,11 +753,22 @@ static struct {
{ }
};
static struct {
const char *name;
enum raid_bdev_state value;
} g_raid_state_names[] = {
{ "online", RAID_BDEV_STATE_ONLINE },
{ "configuring", RAID_BDEV_STATE_CONFIGURING },
{ "offline", RAID_BDEV_STATE_OFFLINE },
{ }
};
/* We have to use the typedef in the function declaration to appease astyle. */
typedef enum raid_level raid_level_t;
typedef enum raid_bdev_state raid_bdev_state_t;
raid_level_t
raid_bdev_parse_raid_level(const char *str)
raid_bdev_str_to_level(const char *str)
{
unsigned int i;
@ -786,6 +797,37 @@ raid_bdev_level_to_str(enum raid_level level)
return "";
}
raid_bdev_state_t
raid_bdev_str_to_state(const char *str)
{
unsigned int i;
assert(str != NULL);
for (i = 0; g_raid_state_names[i].name != NULL; i++) {
if (strcasecmp(g_raid_state_names[i].name, str) == 0) {
return g_raid_state_names[i].value;
}
}
return RAID_BDEV_STATE_MAX;
}
const char *
raid_bdev_state_to_str(enum raid_bdev_state state)
{
unsigned int i;
for (i = 0; g_raid_state_names[i].name != NULL; i++) {
if (g_raid_state_names[i].value == state) {
return g_raid_state_names[i].name;
}
}
assert(false);
return "";
}
/*
* brief:
* raid_bdev_fini_start is called when bdev layer is starting the

View File

@ -35,8 +35,8 @@ enum raid_bdev_state {
*/
RAID_BDEV_STATE_OFFLINE,
/* raid bdev max, new states should be added before this */
RAID_BDEV_MAX
/* raid bdev state max, new states should be added before this */
RAID_BDEV_STATE_MAX
};
/*
@ -167,8 +167,10 @@ int raid_bdev_create(const char *name, uint32_t strip_size, uint8_t num_base_bde
void raid_bdev_delete(struct raid_bdev *raid_bdev, raid_bdev_destruct_cb cb_fn, void *cb_ctx);
int raid_bdev_add_base_device(struct raid_bdev *raid_bdev, const char *name, uint8_t slot);
struct raid_bdev *raid_bdev_find_by_name(const char *name);
enum raid_level raid_bdev_parse_raid_level(const char *str);
enum raid_level raid_bdev_str_to_level(const char *str);
const char *raid_bdev_level_to_str(enum raid_level level);
enum raid_bdev_state raid_bdev_str_to_state(const char *str);
const char *raid_bdev_state_to_str(enum raid_bdev_state state);
/*
* RAID module descriptor

View File

@ -65,6 +65,7 @@ rpc_bdev_raid_get_bdevs(struct spdk_jsonrpc_request *request,
struct rpc_bdev_raid_get_bdevs req = {};
struct spdk_json_write_ctx *w;
struct raid_bdev *raid_bdev;
enum raid_bdev_state state;
if (spdk_json_decode_object(params, rpc_bdev_raid_get_bdevs_decoders,
SPDK_COUNTOF(rpc_bdev_raid_get_bdevs_decoders),
@ -74,10 +75,8 @@ rpc_bdev_raid_get_bdevs(struct spdk_jsonrpc_request *request,
goto cleanup;
}
if (!(strcmp(req.category, "all") == 0 ||
strcmp(req.category, "online") == 0 ||
strcmp(req.category, "configuring") == 0 ||
strcmp(req.category, "offline") == 0)) {
state = raid_bdev_str_to_state(req.category);
if (state == RAID_BDEV_STATE_MAX && strcmp(req.category, "all") != 0) {
spdk_jsonrpc_send_error_response(request, -EINVAL, spdk_strerror(EINVAL));
goto cleanup;
}
@ -87,10 +86,7 @@ rpc_bdev_raid_get_bdevs(struct spdk_jsonrpc_request *request,
/* Get raid bdev list based on the category requested */
TAILQ_FOREACH(raid_bdev, &g_raid_bdev_list, global_link) {
if (strcmp(req.category, "all") == 0 ||
(strcmp(req.category, "configuring") == 0 && raid_bdev->state == RAID_BDEV_STATE_CONFIGURING) ||
(strcmp(req.category, "online") == 0 && raid_bdev->state == RAID_BDEV_STATE_ONLINE) ||
(strcmp(req.category, "offline") == 0 && raid_bdev->state == RAID_BDEV_STATE_OFFLINE)) {
if (raid_bdev->state == state || state == RAID_BDEV_STATE_MAX) {
spdk_json_write_string(w, raid_bdev->bdev.name);
}
}
@ -161,7 +157,7 @@ decode_raid_level(const struct spdk_json_val *val, void *out)
ret = spdk_json_decode_string(val, &str);
if (ret == 0 && str != NULL) {
level = raid_bdev_parse_raid_level(str);
level = raid_bdev_str_to_level(str);
if (level == INVALID_RAID_LEVEL) {
ret = -EINVAL;
} else {

View File

@ -1906,10 +1906,10 @@ test_raid_level_conversions(void)
{
const char *raid_str;
CU_ASSERT(raid_bdev_parse_raid_level("abcd123") == INVALID_RAID_LEVEL);
CU_ASSERT(raid_bdev_parse_raid_level("0") == RAID0);
CU_ASSERT(raid_bdev_parse_raid_level("raid0") == RAID0);
CU_ASSERT(raid_bdev_parse_raid_level("RAID0") == RAID0);
CU_ASSERT(raid_bdev_str_to_level("abcd123") == INVALID_RAID_LEVEL);
CU_ASSERT(raid_bdev_str_to_level("0") == RAID0);
CU_ASSERT(raid_bdev_str_to_level("raid0") == RAID0);
CU_ASSERT(raid_bdev_str_to_level("RAID0") == RAID0);
raid_str = raid_bdev_level_to_str(INVALID_RAID_LEVEL);
CU_ASSERT(raid_str != NULL && strlen(raid_str) == 0);