Commit 1db41324 authored by Krzysztof Karas's avatar Krzysztof Karas Committed by Konrad Sztyber
Browse files

bdev/raid: add RPC option to provide UUID



Make sure UUID can be passed to raid bdev type during
its creation.

Change-Id: I5fa9ca2d18d435fa882e1cb388b2e1918d821540
Signed-off-by: default avatarKrzysztof Karas <krzysztof.karas@intel.com>
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/17136


Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: default avatarArtur Paszkiewicz <artur.paszkiewicz@intel.com>
Community-CI: Mellanox Build Bot
Reviewed-by: default avatarJim Harris <james.r.harris@intel.com>
Reviewed-by: default avatarShuhei Matsumoto <smatsumoto@nvidia.com>
parent 91ea8102
Loading
Loading
Loading
Loading
+5 −1
Original line number Diff line number Diff line
@@ -915,7 +915,7 @@ raid_bdev_init(void)
 */
int
raid_bdev_create(const char *name, uint32_t strip_size, uint8_t num_base_bdevs,
		 enum raid_level level, struct raid_bdev **raid_bdev_out)
		 enum raid_level level, struct raid_bdev **raid_bdev_out, const struct spdk_uuid *uuid)
{
	struct raid_bdev *raid_bdev;
	struct spdk_bdev *raid_bdev_gen;
@@ -1020,6 +1020,10 @@ raid_bdev_create(const char *name, uint32_t strip_size, uint8_t num_base_bdevs,
	raid_bdev_gen->module = &g_raid_if;
	raid_bdev_gen->write_cache = 0;

	if (uuid) {
		spdk_uuid_copy(&raid_bdev_gen->uuid, uuid);
	}

	TAILQ_INSERT_TAIL(&g_raid_bdev_list, raid_bdev, global_link);

	*raid_bdev_out = raid_bdev;
+2 −1
Original line number Diff line number Diff line
@@ -7,6 +7,7 @@
#define SPDK_BDEV_RAID_INTERNAL_H

#include "spdk/bdev_module.h"
#include "spdk/uuid.h"

enum raid_level {
	INVALID_RAID_LEVEL	= -1,
@@ -167,7 +168,7 @@ extern struct raid_all_tailq g_raid_bdev_list;
typedef void (*raid_bdev_destruct_cb)(void *cb_ctx, int rc);

int raid_bdev_create(const char *name, uint32_t strip_size, uint8_t num_base_bdevs,
		     enum raid_level level, struct raid_bdev **raid_bdev_out);
		     enum raid_level level, struct raid_bdev **raid_bdev_out, const struct spdk_uuid *uuid);
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);
+17 −1
Original line number Diff line number Diff line
@@ -127,6 +127,9 @@ struct rpc_bdev_raid_create {

	/* Base bdevs information */
	struct rpc_bdev_raid_create_base_bdevs base_bdevs;

	/* UUID for this raid bdev */
	char *uuid;
};

/*
@@ -143,6 +146,7 @@ free_rpc_bdev_raid_create(struct rpc_bdev_raid_create *req)
	size_t i;

	free(req->name);
	free(req->uuid);
	for (i = 0; i < req->base_bdevs.num_base_bdevs; i++) {
		free(req->base_bdevs.base_bdevs[i]);
	}
@@ -191,6 +195,7 @@ static const struct spdk_json_object_decoder rpc_bdev_raid_create_decoders[] = {
	{"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, level), decode_raid_level},
	{"base_bdevs", offsetof(struct rpc_bdev_raid_create, base_bdevs), decode_base_bdevs},
	{"uuid", offsetof(struct rpc_bdev_raid_create, uuid), spdk_json_decode_string, true},
};

/*
@@ -211,6 +216,8 @@ rpc_bdev_raid_create(struct spdk_jsonrpc_request *request,
	struct raid_bdev		*raid_bdev;
	int				rc;
	size_t				i;
	struct spdk_uuid		*uuid = NULL;
	struct spdk_uuid		decoded_uuid;

	if (spdk_json_decode_object(params, rpc_bdev_raid_create_decoders,
				    SPDK_COUNTOF(rpc_bdev_raid_create_decoders),
@@ -220,8 +227,17 @@ rpc_bdev_raid_create(struct spdk_jsonrpc_request *request,
		goto cleanup;
	}

	if (req.uuid) {
		if (spdk_uuid_parse(&decoded_uuid, req.uuid)) {
			spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INVALID_PARAMS,
							 "Failed to parse bdev UUID");
			goto cleanup;
		}
		uuid = &decoded_uuid;
	}

	rc = raid_bdev_create(req.name, req.strip_size_kb, req.base_bdevs.num_base_bdevs,
			      req.level, &raid_bdev);
			      req.level, &raid_bdev, uuid);
	if (rc != 0) {
		spdk_jsonrpc_send_error_response_fmt(request, rc,
						     "Failed to create RAID bdev %s: %s",
+5 −1
Original line number Diff line number Diff line
@@ -387,7 +387,7 @@ def bdev_raid_get_bdevs(client, category):
    return client.call('bdev_raid_get_bdevs', params)


def bdev_raid_create(client, name, raid_level, base_bdevs, strip_size=None, strip_size_kb=None):
def bdev_raid_create(client, name, raid_level, base_bdevs, strip_size=None, strip_size_kb=None, uuid=None):
    """Create raid bdev. Either strip size arg will work but one is required.

    Args:
@@ -396,6 +396,7 @@ def bdev_raid_create(client, name, raid_level, base_bdevs, strip_size=None, stri
        strip_size_kb: strip size of raid bdev in KB, supported values like 8, 16, 32, 64, 128, 256, etc
        raid_level: raid level of raid bdev, supported values 0
        base_bdevs: Space separated names of Nvme bdevs in double quotes, like "Nvme0n1 Nvme1n1 Nvme2n1"
        uuid: UUID for this raid bdev (optional)

    Returns:
        None
@@ -408,6 +409,9 @@ def bdev_raid_create(client, name, raid_level, base_bdevs, strip_size=None, stri
    if strip_size_kb:
        params['strip_size_kb'] = strip_size_kb

    if uuid:
        params['uuid'] = uuid

    return client.call('bdev_raid_create', params)


+3 −1
Original line number Diff line number Diff line
@@ -2056,12 +2056,14 @@ Format: 'user:u1 secret:s1 muser:mu1 msecret:ms1,user:u2 secret:s2 muser:mu2 mse
                                  name=args.name,
                                  strip_size_kb=args.strip_size_kb,
                                  raid_level=args.raid_level,
                                  base_bdevs=base_bdevs)
                                  base_bdevs=base_bdevs,
                                  uuid=args.uuid)
    p = subparsers.add_parser('bdev_raid_create', help='Create new raid bdev')
    p.add_argument('-n', '--name', help='raid bdev name', required=True)
    p.add_argument('-z', '--strip-size-kb', help='strip size in KB', type=int)
    p.add_argument('-r', '--raid-level', help='raid level, raid0, raid1 and a special level concat are supported', required=True)
    p.add_argument('-b', '--base-bdevs', help='base bdevs name, whitespace separated list in quotes', required=True)
    p.add_argument('--uuid', help='UUID for this raid bdev', required=False)
    p.set_defaults(func=bdev_raid_create)

    def bdev_raid_delete(args):