From 46ff15a658b6b9612e0f15dcce1c307805adbcde Mon Sep 17 00:00:00 2001 From: Artur Paszkiewicz Date: Thu, 3 Nov 2022 14:25:30 +0100 Subject: [PATCH] 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 Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/15308 Tested-by: SPDK CI Jenkins Reviewed-by: Konrad Sztyber Reviewed-by: Tomasz Zawadzki Community-CI: Mellanox Build Bot --- module/bdev/raid/bdev_raid.c | 50 +++++++++++++++++-- module/bdev/raid/bdev_raid.h | 8 +-- module/bdev/raid/bdev_raid_rpc.c | 14 ++---- .../lib/bdev/raid/bdev_raid.c/bdev_raid_ut.c | 8 +-- 4 files changed, 60 insertions(+), 20 deletions(-) diff --git a/module/bdev/raid/bdev_raid.c b/module/bdev/raid/bdev_raid.c index 7c48404fb..28899da29 100644 --- a/module/bdev/raid/bdev_raid.c +++ b/module/bdev/raid/bdev_raid.c @@ -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 diff --git a/module/bdev/raid/bdev_raid.h b/module/bdev/raid/bdev_raid.h index bb661c1ef..1a9bc6cbc 100644 --- a/module/bdev/raid/bdev_raid.h +++ b/module/bdev/raid/bdev_raid.h @@ -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 diff --git a/module/bdev/raid/bdev_raid_rpc.c b/module/bdev/raid/bdev_raid_rpc.c index 38b8c7d36..a684a3b11 100644 --- a/module/bdev/raid/bdev_raid_rpc.c +++ b/module/bdev/raid/bdev_raid_rpc.c @@ -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 { diff --git a/test/unit/lib/bdev/raid/bdev_raid.c/bdev_raid_ut.c b/test/unit/lib/bdev/raid/bdev_raid.c/bdev_raid_ut.c index 0f049f40d..c0f593a79 100644 --- a/test/unit/lib/bdev/raid/bdev_raid.c/bdev_raid_ut.c +++ b/test/unit/lib/bdev/raid/bdev_raid.c/bdev_raid_ut.c @@ -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);