Commit 524129a9 authored by Krzysztof Smolinski's avatar Krzysztof Smolinski Committed by Tomasz Zawadzki
Browse files

rpc: bdev_raid_add_base_bdev



Signed-off-by: default avatarKrzysztof Smolinski <krzysztof.smolinski@intel.com>
Change-Id: I3682639878274174829b672bc3e87ad1f01faef1
Signed-off-by: default avatarArtur Paszkiewicz <artur.paszkiewicz@intel.com>
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/18738


Reviewed-by: default avatarKonrad Sztyber <konrad.sztyber@intel.com>
Reviewed-by: default avatarJim Harris <jim.harris@samsung.com>
Community-CI: Mellanox Build Bot
Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
parent 887b8ec4
Loading
Loading
Loading
Loading
+37 −0
Original line number Diff line number Diff line
@@ -10582,6 +10582,43 @@ Example response:
}
~~~

### bdev_raid_add_base_bdev {#rpc_bdev_raid_add_base_bdev}

Add base bdev to existing raid bdev. The raid bdev must have an empty base bdev slot.
The bdev must be large enough and have the same block size and metadata format as the other base bdevs.

#### Parameters

Name                    | Optional | Type        | Description
----------------------- | -------- | ----------- | -----------
raid_bdev               | Required | string      | Raid bdev name
base_bdev               | Required | string      | Base bdev name

#### Example

Example request:

~~~json
{
  "jsonrpc": "2.0",
  "method": "bdev_raid_add_base_bdev",
  "id": 1,
  "params": {
    "raid_bdev": "RaidBdev0",
    "base_bdev": "Nvme0n1"
  }
}
~~~

Example response:

~~~json
{
  "jsonrpc": "2.0",
  "id": 1,
  "result": true
}
~~~
### bdev_raid_remove_base_bdev {#rpc_bdev_raid_remove_base_bdev}

Remove base bdev from existing raid bdev.
+111 −5
Original line number Diff line number Diff line
@@ -379,19 +379,48 @@ cleanup:
SPDK_RPC_REGISTER("bdev_raid_delete", rpc_bdev_raid_delete, SPDK_RPC_RUNTIME)

/*
 * Decoder object for RPC bdev_raid_remove_base_bdev
 * Base bdevs in RPC bdev_raid_add_base_bdev
 */
static const struct spdk_json_object_decoder rpc_bdev_raid_remove_base_bdev_decoders[] = {
	{"name", 0, spdk_json_decode_string},
struct rpc_bdev_raid_add_base_bdev {
	/* Base bdev name */
	char			*base_bdev;

	/* Raid bdev name */
	char			*raid_bdev;
};

/*
 * brief:
 * free_rpc_bdev_raid_add_base_bdev function is to free RPC
 * bdev_raid_add_base_bdev related parameters.
 * params:
 * req - pointer to RPC request
 * returns:
 * none
 */
static void
rpc_bdev_raid_remove_base_bdev_done(void *ctx, int status)
free_rpc_bdev_raid_add_base_bdev(struct rpc_bdev_raid_add_base_bdev *req)
{
	free(req->base_bdev);
	free(req->raid_bdev);
}

/*
 * Decoder object for RPC bdev_raid_add_base_bdev
 */
static const struct spdk_json_object_decoder rpc_bdev_raid_add_base_bdev_decoders[] = {
	{"base_bdev", offsetof(struct rpc_bdev_raid_add_base_bdev, base_bdev), spdk_json_decode_string},
	{"raid_bdev", offsetof(struct rpc_bdev_raid_add_base_bdev, raid_bdev), spdk_json_decode_string},
};

static void
rpc_bdev_raid_add_base_bdev_done(void *ctx, int status)
{
	struct spdk_jsonrpc_request *request = ctx;

	if (status != 0) {
		spdk_jsonrpc_send_error_response_fmt(request, status, "Failed to remove base bdev from raid bdev");
		spdk_jsonrpc_send_error_response_fmt(request, status, "Failed to add base bdev to RAID bdev: %s",
						     spdk_strerror(-status));
		return;
	}

@@ -403,6 +432,83 @@ rpc_bdev_raid_event_cb(enum spdk_bdev_event_type type, struct spdk_bdev *bdev, v
{
}

/*
 * brief:
 * bdev_raid_add_base_bdev function is the RPC for adding base bdev to a raid bdev.
 * It takes base bdev and raid bdev names as input.
 * params:
 * request - pointer to json rpc request
 * params - pointer to request parameters
 * returns:
 * none
 */
static void
rpc_bdev_raid_add_base_bdev(struct spdk_jsonrpc_request *request,
			    const struct spdk_json_val *params)
{
	struct rpc_bdev_raid_add_base_bdev req = {};
	struct raid_bdev *raid_bdev;
	struct spdk_bdev_desc *desc;
	int rc;

	if (spdk_json_decode_object(params, rpc_bdev_raid_add_base_bdev_decoders,
				    SPDK_COUNTOF(rpc_bdev_raid_add_base_bdev_decoders),
				    &req)) {
		spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INTERNAL_ERROR,
						 "spdk_json_decode_object failed");
		goto cleanup;
	}

	raid_bdev = raid_bdev_find_by_name(req.raid_bdev);
	if (raid_bdev == NULL) {
		spdk_jsonrpc_send_error_response_fmt(request, -ENODEV, "raid bdev %s is not found in config",
						     req.raid_bdev);
		goto cleanup;
	}

	rc = spdk_bdev_open_ext(req.base_bdev, false, rpc_bdev_raid_event_cb, NULL, &desc);
	if (rc != 0) {
		spdk_jsonrpc_send_error_response_fmt(request, rc, "Failed to open bdev %s: %s",
						     req.base_bdev, spdk_strerror(-rc));
		goto cleanup;
	}

	rc = raid_bdev_attach_base_bdev(raid_bdev, spdk_bdev_desc_get_bdev(desc),
					rpc_bdev_raid_add_base_bdev_done, request);
	spdk_bdev_close(desc);
	if (rc != 0) {
		spdk_jsonrpc_send_error_response_fmt(request, rc,
						     "Failed to attach base bdev %s to RAID bdev %s: %s",
						     req.base_bdev, req.raid_bdev,
						     spdk_strerror(-rc));
		goto cleanup;
	}

cleanup:
	free_rpc_bdev_raid_add_base_bdev(&req);
}
SPDK_RPC_REGISTER("bdev_raid_add_base_bdev", rpc_bdev_raid_add_base_bdev, SPDK_RPC_RUNTIME)

/*
 * Decoder object for RPC bdev_raid_remove_base_bdev
 */
static const struct spdk_json_object_decoder rpc_bdev_raid_remove_base_bdev_decoders[] = {
	{"name", 0, spdk_json_decode_string},
};

static void
rpc_bdev_raid_remove_base_bdev_done(void *ctx, int status)
{
	struct spdk_jsonrpc_request *request = ctx;

	if (status != 0) {
		spdk_jsonrpc_send_error_response_fmt(request, status, "Failed to remove base bdev from raid bdev");
		return;
	}

	spdk_jsonrpc_send_bool_response(request, true);
}

/*
 * brief:
 * bdev_raid_remove_base_bdev function is the RPC for removing base bdev from a raid bdev.
+14 −0
Original line number Diff line number Diff line
@@ -445,6 +445,20 @@ def bdev_raid_delete(client, name):
    return client.call('bdev_raid_delete', params)


def bdev_raid_add_base_bdev(client, base_bdev, raid_bdev):
    """Add base bdev to existing raid bdev

    Args:
        raid_bdev: raid bdev name
        base_bdev: base bdev name

    Returns:
        None
    """
    params = {'raid_bdev': raid_bdev, 'base_bdev': base_bdev}
    return client.call('bdev_raid_add_base_bdev', params)


def bdev_raid_remove_base_bdev(client, name):
    """Remove base bdev from existing raid bdev

+9 −0
Original line number Diff line number Diff line
@@ -2151,6 +2151,15 @@ Format: 'user:u1 secret:s1 muser:mu1 msecret:ms1,user:u2 secret:s2 muser:mu2 mse
    p.add_argument('name', help='raid bdev name')
    p.set_defaults(func=bdev_raid_delete)

    def bdev_raid_add_base_bdev(args):
        rpc.bdev.bdev_raid_add_base_bdev(args.client,
                                         raid_bdev=args.raid_bdev,
                                         base_bdev=args.base_bdev)
    p = subparsers.add_parser('bdev_raid_add_base_bdev', help='Add base bdev to existing raid bdev')
    p.add_argument('raid_bdev', help='raid bdev name')
    p.add_argument('base_bdev', help='base bdev name')
    p.set_defaults(func=bdev_raid_add_base_bdev)

    def bdev_raid_remove_base_bdev(args):
        rpc.bdev.bdev_raid_remove_base_bdev(args.client,
                                            name=args.name)