Commit 0074299d authored by Artur Paszkiewicz's avatar Artur Paszkiewicz Committed by Jim Harris
Browse files

raid: combine raid_bdev_attach_base_bdev() and raid_bdev_add_base_device()



raid_bdev_add_base_device() is used only in CONFIGURING state, during
raid bdev creation. raid_bdev_attach_base_bdev() works similarily but
only in ONLINE state, to add a base bdev for rebuild. They can be
combined to cover both cases with a single function.

Suggested-by: default avatarKonrad Sztyber <konrad.sztyber@intel.com>
Signed-off-by: default avatarArtur Paszkiewicz <artur.paszkiewicz@intel.com>
Change-Id: I5badbbcb00a967aefdac99daf7254338fdaf5186
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/22358


Reviewed-by: default avatarMateusz Kozlowski <mateusz.kozlowski@solidigm.com>
Community-CI: Mellanox Build Bot
Reviewed-by: default avatarKonrad Sztyber <konrad.sztyber@intel.com>
Reviewed-by: default avatarJim Harris <jim.harris@samsung.com>
Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
parent 210c233f
Loading
Loading
Loading
Loading
+10 −45
Original line number Diff line number Diff line
@@ -3253,14 +3253,12 @@ _raid_bdev_add_base_device(struct raid_bdev *raid_bdev, const char *name,
}

int
raid_bdev_attach_base_bdev(struct raid_bdev *raid_bdev, const char *name,
raid_bdev_add_base_device(struct raid_bdev *raid_bdev, const char *name,
			  raid_base_bdev_cb cb_fn, void *cb_ctx)
{
	struct raid_base_bdev_info *base_info = NULL, *iter;
	int rc;

	SPDK_DEBUGLOG(bdev_raid, "attach_base_device: %s\n", name);

	assert(spdk_get_thread() == spdk_thread_get_app_thread());

	if (raid_bdev->process != NULL) {
@@ -3269,14 +3267,8 @@ raid_bdev_attach_base_bdev(struct raid_bdev *raid_bdev, const char *name,
		return -EPERM;
	}

	if (raid_bdev->state != RAID_BDEV_STATE_ONLINE) {
		SPDK_ERRLOG("raid bdev '%s' must be in online state to attach base bdev\n",
			    raid_bdev->bdev.name);
		return -EINVAL;
	}

	RAID_FOR_EACH_BASE_BDEV(raid_bdev, iter) {
		if (iter->desc == NULL) {
		if (iter->name == NULL) {
			base_info = iter;
			break;
		}
@@ -3289,13 +3281,16 @@ raid_bdev_attach_base_bdev(struct raid_bdev *raid_bdev, const char *name,
	}

	assert(base_info->is_configured == false);

	if (raid_bdev->state == RAID_BDEV_STATE_ONLINE) {
		assert(base_info->data_size != 0);
		assert(base_info->desc == NULL);
	}

	spdk_spin_lock(&raid_bdev->base_bdev_lock);

	rc = _raid_bdev_add_base_device(raid_bdev, name, base_info,
					cb_fn, cb_ctx);
	if (rc != 0) {
	rc = _raid_bdev_add_base_device(raid_bdev, name, base_info, cb_fn, cb_ctx);
	if (rc != 0 && (rc != -ENODEV || raid_bdev->state != RAID_BDEV_STATE_CONFIGURING)) {
		SPDK_ERRLOG("base bdev '%s' attach failed: %s\n", name, spdk_strerror(-rc));
		raid_bdev_free_base_bdev_resource(base_info);
	}
@@ -3305,36 +3300,6 @@ raid_bdev_attach_base_bdev(struct raid_bdev *raid_bdev, const char *name,
	return rc;
}

/*
 * brief:
 * raid_bdev_add_base_device function is the actual function which either adds
 * the nvme base device to existing raid bdev or create a new raid bdev. It also claims
 * the base device and keep the open descriptor.
 * params:
 * raid_bdev - pointer to raid bdev
 * name - name of the base bdev
 * slot - position to add base bdev
 * cb_fn - callback function
 * cb_ctx - argument to callback function
 * returns:
 * 0 - success
 * non zero - failure
 */
int
raid_bdev_add_base_device(struct raid_bdev *raid_bdev, const char *name, uint8_t slot,
			  raid_base_bdev_cb cb_fn, void *cb_ctx)
{
	struct raid_base_bdev_info *base_info;

	if (slot >= raid_bdev->num_base_bdevs) {
		return -EINVAL;
	}

	base_info = &raid_bdev->base_bdev_info[slot];

	return _raid_bdev_add_base_device(raid_bdev, name, base_info, cb_fn, cb_ctx);
}

static int
raid_bdev_create_from_sb(const struct raid_bdev_superblock *sb, struct raid_bdev **raid_bdev_out)
{
+1 −3
Original line number Diff line number Diff line
@@ -255,7 +255,7 @@ int raid_bdev_create(const char *name, uint32_t strip_size, uint8_t num_base_bde
		     enum raid_level level, bool superblock, const struct spdk_uuid *uuid,
		     struct raid_bdev **raid_bdev_out);
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,
int raid_bdev_add_base_device(struct raid_bdev *raid_bdev, const char *name,
			      raid_base_bdev_cb cb_fn, void *cb_ctx);
struct raid_bdev *raid_bdev_find_by_name(const char *name);
enum raid_level raid_bdev_str_to_level(const char *str);
@@ -265,8 +265,6 @@ const char *raid_bdev_state_to_str(enum raid_bdev_state state);
const char *raid_bdev_process_to_str(enum raid_process_type value);
void raid_bdev_write_info_json(struct raid_bdev *raid_bdev, struct spdk_json_write_ctx *w);
int raid_bdev_remove_base_bdev(struct spdk_bdev *base_bdev, raid_base_bdev_cb cb_fn, void *cb_ctx);
int raid_bdev_attach_base_bdev(struct raid_bdev *raid_bdev, const char *name,
			       raid_base_bdev_cb cb_fn, void *cb_ctx);

/*
 * RAID module descriptor
+3 −4
Original line number Diff line number Diff line
@@ -305,7 +305,7 @@ rpc_bdev_raid_create(struct spdk_jsonrpc_request *request,
	for (i = 0; i < num_base_bdevs; i++) {
		const char *base_bdev_name = req->base_bdevs.base_bdevs[i];

		rc = raid_bdev_add_base_device(raid_bdev, base_bdev_name, i,
		rc = raid_bdev_add_base_device(raid_bdev, base_bdev_name,
					       rpc_bdev_raid_create_add_base_bdev_cb, ctx);
		if (rc == -ENODEV) {
			SPDK_DEBUGLOG(bdev_raid, "base bdev %s doesn't exist now\n", base_bdev_name);
@@ -526,11 +526,10 @@ rpc_bdev_raid_add_base_bdev(struct spdk_jsonrpc_request *request,
		goto cleanup;
	}

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