Commit 445e667f authored by Artur Paszkiewicz's avatar Artur Paszkiewicz Committed by Jim Harris
Browse files

module/raid: make raid_level an enum instead of plain integer



Also add functions to convert it to/from string.

Signed-off-by: default avatarArtur Paszkiewicz <artur.paszkiewicz@intel.com>
Change-Id: I6f7964d832c308b815150fff39eb3dc5c5ae5853
Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/471079


Reviewed-by: default avatarBen Walker <benjamin.walker@intel.com>
Reviewed-by: default avatarShuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Community-CI: Broadcom SPDK FC-NVMe CI <spdk-ci.pdl@broadcom.com>
parent fc9ca1d0
Loading
Loading
Loading
Loading
+63 −18
Original line number Diff line number Diff line
@@ -580,7 +580,7 @@ raid_bdev_dump_info_json(void *ctx, struct spdk_json_write_ctx *w)
	spdk_json_write_named_uint32(w, "strip_size", raid_bdev->strip_size);
	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_uint32(w, "raid_level", raid_bdev->raid_level);
	spdk_json_write_named_string(w, "raid_level", raid_bdev_level_to_str(raid_bdev->level));
	spdk_json_write_named_uint32(w, "destruct_called", raid_bdev->destruct_called);
	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);
@@ -622,7 +622,7 @@ raid_bdev_write_config_json(struct spdk_bdev *bdev, struct spdk_json_write_ctx *
	spdk_json_write_named_object_begin(w, "params");
	spdk_json_write_named_string(w, "name", bdev->name);
	spdk_json_write_named_uint32(w, "strip_size", raid_bdev->strip_size_kb);
	spdk_json_write_named_uint32(w, "raid_level", raid_bdev->raid_level);
	spdk_json_write_named_string(w, "raid_level", raid_bdev_level_to_str(raid_bdev->level));

	spdk_json_write_named_array_begin(w, "base_bdevs");
	for (i = 0; i < raid_bdev->num_base_bdevs; i++) {
@@ -722,12 +722,12 @@ raid_bdev_config_find_by_name(const char *raid_name)
 * raid_name - name for raid bdev.
 * strip_size - strip size in KB
 * num_base_bdevs - number of base bdevs.
 * raid_level - raid level, only raid level 0 is supported.
 * level - raid level, only raid level 0 is supported.
 * _raid_cfg - Pointer to newly added configuration
 */
int
raid_bdev_config_add(const char *raid_name, uint32_t strip_size, uint8_t num_base_bdevs,
		     uint8_t raid_level, struct raid_bdev_config **_raid_cfg)
		     enum raid_level level, struct raid_bdev_config **_raid_cfg)
{
	struct raid_bdev_config *raid_cfg;

@@ -748,9 +748,9 @@ raid_bdev_config_add(const char *raid_name, uint32_t strip_size, uint8_t num_bas
		return -EINVAL;
	}

	if (raid_level != RAID0) {
	if (level != RAID0) {
		SPDK_ERRLOG("invalid raid level %u, only raid level 0 is supported\n",
			    raid_level);
			    level);
		return -EINVAL;
	}

@@ -768,7 +768,7 @@ raid_bdev_config_add(const char *raid_name, uint32_t strip_size, uint8_t num_bas
	}
	raid_cfg->strip_size = strip_size;
	raid_cfg->num_base_bdevs = num_base_bdevs;
	raid_cfg->raid_level = raid_level;
	raid_cfg->level = level;

	raid_cfg->base_bdev = calloc(num_base_bdevs, sizeof(*raid_cfg->base_bdev));
	if (raid_cfg->base_bdev == NULL) {
@@ -825,6 +825,43 @@ raid_bdev_config_add_base_bdev(struct raid_bdev_config *raid_cfg, const char *ba

	return 0;
}

static struct {
	const char *name;
	enum raid_level value;
} g_raid_level_names[] = {
	{ "raid0", RAID0 },
	{ "0", RAID0 },
	{ }
};

enum raid_level raid_bdev_parse_raid_level(const char *str)
{
	unsigned int i;

	for (i = 0; g_raid_level_names[i].name != NULL; i++) {
		if (strcasecmp(g_raid_level_names[i].name, str) == 0) {
			return g_raid_level_names[i].value;
		}
	}

	return INVALID_RAID_LEVEL;
}

const char *
raid_bdev_level_to_str(enum raid_level level)
{
	unsigned int i;

	for (i = 0; g_raid_level_names[i].name != NULL; i++) {
		if (g_raid_level_names[i].value == level) {
			return g_raid_level_names[i].name;
		}
	}

	return "";
}

/*
 * brief:
 * raid_bdev_parse_raid is used to parse the raid bdev from config file based on
@@ -855,7 +892,9 @@ raid_bdev_parse_raid(struct spdk_conf_section *conf_section)
{
	const char *raid_name;
	uint32_t strip_size;
	uint8_t num_base_bdevs, raid_level;
	uint8_t num_base_bdevs;
	const char *raid_level_str;
	enum raid_level level;
	const char *base_bdev_name;
	struct raid_bdev_config *raid_cfg;
	int rc, i, val;
@@ -878,16 +917,21 @@ raid_bdev_parse_raid(struct spdk_conf_section *conf_section)
	}
	num_base_bdevs = val;

	val = spdk_conf_section_get_intval(conf_section, "RaidLevel");
	if (val < 0) {
	raid_level_str = spdk_conf_section_get_val(conf_section, "RaidLevel");
	if (raid_level_str == NULL) {
		SPDK_ERRLOG("Missing RaidLevel\n");
		return -EINVAL;
	}
	level = raid_bdev_parse_raid_level(raid_level_str);
	if (level == INVALID_RAID_LEVEL) {
		SPDK_ERRLOG("Invalid RaidLevel\n");
		return -EINVAL;
	}
	raid_level = val;

	SPDK_DEBUGLOG(SPDK_LOG_BDEV_RAID, "%s %" PRIu32 " %u %u\n",
		      raid_name, strip_size, num_base_bdevs, raid_level);
		      raid_name, strip_size, num_base_bdevs, level);

	rc = raid_bdev_config_add(raid_name, strip_size, num_base_bdevs, raid_level,
	rc = raid_bdev_config_add(raid_name, strip_size, num_base_bdevs, level,
				  &raid_cfg);
	if (rc != 0) {
		SPDK_ERRLOG("Failed to add raid bdev config\n");
@@ -1037,9 +1081,10 @@ raid_bdev_get_running_config(FILE *fp)
			"  Name %s\n"
			"  StripSize %" PRIu32 "\n"
			"  NumDevices %u\n"
			"  RaidLevel %hhu\n",
			"  RaidLevel %s\n",
			index, raid_bdev->bdev.name, raid_bdev->strip_size_kb,
			raid_bdev->num_base_bdevs, raid_bdev->raid_level);
			raid_bdev->num_base_bdevs,
			raid_bdev_level_to_str(raid_bdev->level));
		fprintf(fp,
			"  Devices ");
		for (i = 0; i < raid_bdev->num_base_bdevs; i++) {
@@ -1173,13 +1218,13 @@ raid_bdev_create(struct raid_bdev_config *raid_cfg)
	raid_bdev->strip_size_kb = raid_cfg->strip_size;
	raid_bdev->state = RAID_BDEV_STATE_CONFIGURING;
	raid_bdev->config = raid_cfg;
	raid_bdev->raid_level = raid_cfg->raid_level;
	raid_bdev->level = raid_cfg->level;

	switch (raid_bdev->raid_level) {
	switch (raid_bdev->level) {
	case RAID0:
		break;
	default:
		SPDK_ERRLOG("invalid raid level %u\n", raid_bdev->raid_level);
		SPDK_ERRLOG("invalid raid level %u\n", raid_bdev->level);
		free(raid_bdev);
		return -EINVAL;
	}
+9 −4
Original line number Diff line number Diff line
@@ -36,7 +36,10 @@

#include "spdk/bdev_module.h"

#define RAID0 0
enum raid_level {
	INVALID_RAID_LEVEL	= -1,
	RAID0			= 0,
};

/*
 * Raid state describes the state of the raid. This raid bdev can be either in
@@ -143,7 +146,7 @@ struct raid_bdev {
	uint8_t				num_base_bdevs_discovered;

	/* Raid Level of this raid bdev */
	uint8_t				raid_level;
	enum raid_level			level;

	/* Set to true if destruct is called for this raid bdev */
	bool				destruct_called;
@@ -181,7 +184,7 @@ struct raid_bdev_config {
	uint8_t				num_base_bdevs;

	/* raid level */
	uint8_t				raid_level;
	enum raid_level			level;

	TAILQ_ENTRY(raid_bdev_config)	link;
};
@@ -229,11 +232,13 @@ int raid_bdev_add_base_devices(struct raid_bdev_config *raid_cfg);
void raid_bdev_remove_base_devices(struct raid_bdev_config *raid_cfg,
				   raid_bdev_destruct_cb cb_fn, void *cb_ctx);
int raid_bdev_config_add(const char *raid_name, uint32_t strip_size, uint8_t num_base_bdevs,
			 uint8_t raid_level, struct raid_bdev_config **_raid_cfg);
			 enum raid_level level, struct raid_bdev_config **_raid_cfg);
int raid_bdev_config_add_base_bdev(struct raid_bdev_config *raid_cfg,
				   const char *base_bdev_name, uint8_t slot);
void raid_bdev_config_cleanup(struct raid_bdev_config *raid_cfg);
struct raid_bdev_config *raid_bdev_config_find_by_name(const char *raid_name);
enum raid_level raid_bdev_parse_raid_level(const char *str);
const char *raid_bdev_level_to_str(enum raid_level level);

void
raid0_start_rw_request(struct spdk_io_channel *ch, struct spdk_bdev_io *bdev_io);
+27 −3
Original line number Diff line number Diff line
@@ -165,7 +165,7 @@ struct rpc_bdev_raid_create {
	uint32_t                             strip_size_kb;

	/* RAID raid level */
	uint8_t                              raid_level;
	enum raid_level                      level;

	/* Base bdevs information */
	struct rpc_bdev_raid_create_base_bdevs base_bdevs;
@@ -188,6 +188,30 @@ free_rpc_bdev_raid_create(struct rpc_bdev_raid_create *req)
	}
}

/*
 * Decoder function for RPC bdev_raid_create to decode raid level
 */
static int
decode_raid_level(const struct spdk_json_val *val, void *out)
{
	int ret;
	char *str = NULL;
	enum raid_level level;

	ret = spdk_json_decode_string(val, &str);
	if (ret == 0) {
		level = raid_bdev_parse_raid_level(str);
		if (level == INVALID_RAID_LEVEL) {
			ret = -EINVAL;
		} else {
			*(enum raid_level *)out = level;
		}
	}

	free(str);
	return ret;
}

/*
 * Decoder function for RPC bdev_raid_create to decode base bdevs list
 */
@@ -207,7 +231,7 @@ static const struct spdk_json_object_decoder rpc_bdev_raid_create_decoders[] = {
	{"name", offsetof(struct rpc_bdev_raid_create, name), spdk_json_decode_string},
	{"strip_size", offsetof(struct rpc_bdev_raid_create, strip_size), spdk_json_decode_uint32, true},
	{"strip_size_kb", offsetof(struct rpc_bdev_raid_create, strip_size_kb), spdk_json_decode_uint32, true},
	{"raid_level", offsetof(struct rpc_bdev_raid_create, raid_level), spdk_json_decode_uint32},
	{"raid_level", offsetof(struct rpc_bdev_raid_create, level), decode_raid_level},
	{"base_bdevs", offsetof(struct rpc_bdev_raid_create, base_bdevs), decode_base_bdevs},
};

@@ -251,7 +275,7 @@ spdk_rpc_bdev_raid_create(struct spdk_jsonrpc_request *request,
	}

	rc = raid_bdev_config_add(req.name, req.strip_size_kb, req.base_bdevs.num_base_bdevs,
				  req.raid_level,
				  req.level,
				  &raid_cfg);
	if (rc != 0) {
		spdk_jsonrpc_send_error_response_fmt(request, rc,
+1 −1
Original line number Diff line number Diff line
@@ -1448,7 +1448,7 @@ Format: 'user:u1 secret:s1 muser:mu1 msecret:ms1,user:u2 secret:s2 muser:mu2 mse
    p.add_argument('-n', '--name', help='raid bdev name', required=True)
    p.add_argument('-s', '--strip-size', help='strip size in KB (deprecated)', type=int)
    p.add_argument('-z', '--strip-size_kb', help='strip size in KB', type=int)
    p.add_argument('-r', '--raid-level', help='raid level, only raid level 0 is supported', type=int, required=True)
    p.add_argument('-r', '--raid-level', help='raid level, only raid level 0 is supported', required=True)
    p.add_argument('-b', '--base-bdevs', help='base bdevs name, whitespace separated list in quotes', required=True)
    p.set_defaults(func=bdev_raid_create)

+0 −1
Original line number Diff line number Diff line
@@ -843,7 +843,6 @@ class UIRaidBdev(UIBdev):
        for u in base_bdevs.strip().split(" "):
            base_bdevs_array.append(u)

        raid_level = self.ui_eval_param(raid_level, "number", None)
        strip_size_kb = self.ui_eval_param(strip_size_kb, "number", None)

        ret_name = self.get_root().bdev_raid_create(name=name,
Loading