Commit 50b51bc8 authored by Shuhei Matsumoto's avatar Shuhei Matsumoto Committed by Jim Harris
Browse files

bdev/raid: Create raid bdev before starting to add base bdevs to it



When construct_raid_bdev RPC is callled, even if all adding base bdevs
to it fail, a raid bdev with no base bdev should exist and be in
the configuring state.

Extract raid_bdev_create() from raid_bdev_add_base_bdev() and put it
before starting iteration of raid_bdev_add_base_bdev().

This change cam be applied to .INI config file too.

Change-Id: Ia71aca0bbdb33049fe5bd9b8fd8163c99c032401
Signed-off-by: default avatarShuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
Reviewed-on: https://review.gerrithub.io/424148


Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Chandler-Test-Pool: SPDK Automated Test System <sys_sgsw@intel.com>
Reviewed-by: default avatarKunal Sablok <kunal.sablok@intel.com>
Reviewed-by: default avatarJim Harris <james.r.harris@intel.com>
Reviewed-by: default avatarBen Walker <benjamin.walker@intel.com>
parent 8c5c2c56
Loading
Loading
Loading
Loading
+13 −10
Original line number Diff line number Diff line
@@ -847,6 +847,13 @@ raid_bdev_parse_raid(struct spdk_conf_section *conf_section)
		return -EINVAL;
	}

	rc = raid_bdev_create(raid_cfg);
	if (rc != 0) {
		raid_bdev_config_cleanup(raid_cfg);
		SPDK_ERRLOG("Failed to create raid bdev\n");
		return rc;
	}

	return 0;
}

@@ -1017,13 +1024,12 @@ raid_bdev_init(void)
 * raid_bdev_create allocates raid bdev based on passed configuration
 * params:
 * raid_cfg - configuration of raid bdev
 * _raid_bdev - pointer to created raid bdev
 * returns:
 * 0 - success
 * non zero - failure
 */
static int
raid_bdev_create(struct raid_bdev_config *raid_cfg, struct raid_bdev **_raid_bdev)
int
raid_bdev_create(struct raid_bdev_config *raid_cfg)
{
	struct raid_bdev *raid_bdev;
	struct spdk_bdev *raid_bdev_gen;
@@ -1034,6 +1040,7 @@ raid_bdev_create(struct raid_bdev_config *raid_cfg, struct raid_bdev **_raid_bde
		return -ENOMEM;
	}

	assert(raid_cfg->num_base_bdevs != 0);
	raid_bdev->num_base_bdevs = raid_cfg->num_base_bdevs;
	raid_bdev->base_bdev_info = calloc(raid_bdev->num_base_bdevs,
					   sizeof(struct raid_base_bdev_info));
@@ -1065,7 +1072,7 @@ raid_bdev_create(struct raid_bdev_config *raid_cfg, struct raid_bdev **_raid_bde
	TAILQ_INSERT_TAIL(&g_spdk_raid_bdev_configuring_list, raid_bdev, state_link);
	TAILQ_INSERT_TAIL(&g_spdk_raid_bdev_list, raid_bdev, global_link);

	*_raid_bdev = raid_bdev;
	raid_cfg->raid_bdev = raid_bdev;

	return 0;
}
@@ -1315,12 +1322,8 @@ raid_bdev_add_base_device(struct raid_bdev_config *raid_cfg, struct spdk_bdev *b

	raid_bdev = raid_cfg->raid_bdev;
	if (!raid_bdev) {
		rc = raid_bdev_create(raid_cfg, &raid_bdev);
		if (rc != 0) {
			SPDK_ERRLOG("Failed to create raid bdev for bdev '%s'\n", bdev->name);
			return rc;
		}
		raid_cfg->raid_bdev = raid_bdev;
		SPDK_ERRLOG("Raid bdev is not created yet '%s'\n", bdev->name);
		return -ENODEV;
	}

	rc = raid_bdev_alloc_base_bdev_resource(raid_bdev, bdev, base_bdev_slot);
+1 −1
Original line number Diff line number Diff line
@@ -202,7 +202,7 @@ extern struct spdk_raid_all_tailq g_spdk_raid_bdev_list;
extern struct spdk_raid_offline_tailq       g_spdk_raid_bdev_offline_list;
extern struct raid_config                   g_spdk_raid_config;


int raid_bdev_create(struct raid_bdev_config *raid_cfg);
void raid_bdev_remove_base_bdev(void *ctx);
int raid_bdev_add_base_device(struct raid_bdev_config *raid_cfg, struct spdk_bdev *bdev,
			      uint32_t base_bdev_slot);
+10 −0
Original line number Diff line number Diff line
@@ -296,6 +296,16 @@ spdk_rpc_construct_raid_bdev(struct spdk_jsonrpc_request *request,
		}
	}

	rc = raid_bdev_create(raid_cfg);
	if (rc != 0) {
		raid_bdev_config_cleanup(raid_cfg);
		spdk_jsonrpc_send_error_response_fmt(request, SPDK_JSONRPC_ERROR_INTERNAL_ERROR,
						     "Failed to create RAID bdev %s: %s",
						     req.name, spdk_strerror(-rc));
		free_rpc_construct_raid_bdev(&req);
		return;
	}

	for (size_t i = 0; i < raid_cfg->num_base_bdevs; i++) {
		/* Check if base_bdev exists already, if not fail the command */
		base_bdev = spdk_bdev_get_by_name(req.base_bdevs.base_bdevs[i]);
+1 −1
Original line number Diff line number Diff line
@@ -1945,7 +1945,7 @@ test_create_raid_from_config(void)
	g_config_level_create = 0;

	verify_raid_config_present("raid1", true);
	verify_raid_bdev_present("raid1", false);
	verify_raid_bdev_present("raid1", true);

	TAILQ_FOREACH(bdev, &g_bdev_list, internal.link) {
		raid_bdev_examine(bdev);