module/raid: use macro to iterate over raid base bdevs

Change-Id: Ie3c074e86a3624bcca5b479505efb4380f79cbdd
Signed-off-by: Artur Paszkiewicz <artur.paszkiewicz@intel.com>
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/850
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: Paul Luse <paul.e.luse@intel.com>
Reviewed-by: Shuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
Reviewed-by: Tomasz Zawadzki <tomasz.zawadzki@intel.com>
Reviewed-by: Darek Stojaczyk <dariusz.stojaczyk@intel.com>
This commit is contained in:
Artur Paszkiewicz 2019-11-05 10:32:18 +01:00 committed by Tomasz Zawadzki
parent 79bde4d379
commit a193dcb8f3
4 changed files with 74 additions and 84 deletions

View File

@ -219,22 +219,19 @@ raid_bdev_cleanup(struct raid_bdev *raid_bdev)
* free resource of base bdev for raid bdev * free resource of base bdev for raid bdev
* params: * params:
* raid_bdev - pointer to raid bdev * raid_bdev - pointer to raid bdev
* base_bdev_slot - position to base bdev in raid bdev * base_info - raid base bdev info
* returns: * returns:
* 0 - success * 0 - success
* non zero - failure * non zero - failure
*/ */
static void static void
raid_bdev_free_base_bdev_resource(struct raid_bdev *raid_bdev, uint8_t base_bdev_slot) raid_bdev_free_base_bdev_resource(struct raid_bdev *raid_bdev,
struct raid_base_bdev_info *base_info)
{ {
struct raid_base_bdev_info *info; spdk_bdev_module_release_bdev(base_info->bdev);
spdk_bdev_close(base_info->desc);
info = &raid_bdev->base_bdev_info[base_bdev_slot]; base_info->desc = NULL;
base_info->bdev = NULL;
spdk_bdev_module_release_bdev(info->bdev);
spdk_bdev_close(info->desc);
info->desc = NULL;
info->bdev = NULL;
assert(raid_bdev->num_base_bdevs_discovered); assert(raid_bdev->num_base_bdevs_discovered);
raid_bdev->num_base_bdevs_discovered--; raid_bdev->num_base_bdevs_discovered--;
@ -253,20 +250,20 @@ static int
raid_bdev_destruct(void *ctxt) raid_bdev_destruct(void *ctxt)
{ {
struct raid_bdev *raid_bdev = ctxt; struct raid_bdev *raid_bdev = ctxt;
uint8_t i; struct raid_base_bdev_info *base_info;
SPDK_DEBUGLOG(SPDK_LOG_BDEV_RAID, "raid_bdev_destruct\n"); SPDK_DEBUGLOG(SPDK_LOG_BDEV_RAID, "raid_bdev_destruct\n");
raid_bdev->destruct_called = true; raid_bdev->destruct_called = true;
for (i = 0; i < raid_bdev->num_base_bdevs; i++) { RAID_FOR_EACH_BASE_BDEV(raid_bdev, base_info) {
/* /*
* Close all base bdev descriptors for which call has come from below * Close all base bdev descriptors for which call has come from below
* layers. Also close the descriptors if we have started shutdown. * layers. Also close the descriptors if we have started shutdown.
*/ */
if (g_shutdown_started || if (g_shutdown_started ||
((raid_bdev->base_bdev_info[i].remove_scheduled == true) && ((base_info->remove_scheduled == true) &&
(raid_bdev->base_bdev_info[i].bdev != NULL))) { (base_info->bdev != NULL))) {
raid_bdev_free_base_bdev_resource(raid_bdev, i); raid_bdev_free_base_bdev_resource(raid_bdev, base_info);
} }
} }
@ -489,16 +486,15 @@ raid_bdev_submit_request(struct spdk_io_channel *ch, struct spdk_bdev_io *bdev_i
inline static bool inline static bool
_raid_bdev_io_type_supported(struct raid_bdev *raid_bdev, enum spdk_bdev_io_type io_type) _raid_bdev_io_type_supported(struct raid_bdev *raid_bdev, enum spdk_bdev_io_type io_type)
{ {
uint8_t i; struct raid_base_bdev_info *base_info;
for (i = 0; i < raid_bdev->num_base_bdevs; i++) { RAID_FOR_EACH_BASE_BDEV(raid_bdev, base_info) {
if (raid_bdev->base_bdev_info[i].bdev == NULL) { if (base_info->bdev == NULL) {
assert(false); assert(false);
continue; continue;
} }
if (spdk_bdev_io_type_supported(raid_bdev->base_bdev_info[i].bdev, if (spdk_bdev_io_type_supported(base_info->bdev, io_type) == false) {
io_type) == false) {
return false; return false;
} }
} }
@ -569,7 +565,7 @@ static int
raid_bdev_dump_info_json(void *ctx, struct spdk_json_write_ctx *w) raid_bdev_dump_info_json(void *ctx, struct spdk_json_write_ctx *w)
{ {
struct raid_bdev *raid_bdev = ctx; struct raid_bdev *raid_bdev = ctx;
uint8_t i; struct raid_base_bdev_info *base_info;
SPDK_DEBUGLOG(SPDK_LOG_BDEV_RAID, "raid_bdev_dump_config_json\n"); SPDK_DEBUGLOG(SPDK_LOG_BDEV_RAID, "raid_bdev_dump_config_json\n");
assert(raid_bdev != NULL); assert(raid_bdev != NULL);
@ -585,9 +581,9 @@ raid_bdev_dump_info_json(void *ctx, struct spdk_json_write_ctx *w)
spdk_json_write_named_uint32(w, "num_base_bdevs_discovered", raid_bdev->num_base_bdevs_discovered); spdk_json_write_named_uint32(w, "num_base_bdevs_discovered", raid_bdev->num_base_bdevs_discovered);
spdk_json_write_name(w, "base_bdevs_list"); spdk_json_write_name(w, "base_bdevs_list");
spdk_json_write_array_begin(w); spdk_json_write_array_begin(w);
for (i = 0; i < raid_bdev->num_base_bdevs; i++) { RAID_FOR_EACH_BASE_BDEV(raid_bdev, base_info) {
if (raid_bdev->base_bdev_info[i].bdev) { if (base_info->bdev) {
spdk_json_write_string(w, raid_bdev->base_bdev_info[i].bdev->name); spdk_json_write_string(w, base_info->bdev->name);
} else { } else {
spdk_json_write_null(w); spdk_json_write_null(w);
} }
@ -611,8 +607,7 @@ static void
raid_bdev_write_config_json(struct spdk_bdev *bdev, struct spdk_json_write_ctx *w) raid_bdev_write_config_json(struct spdk_bdev *bdev, struct spdk_json_write_ctx *w)
{ {
struct raid_bdev *raid_bdev = bdev->ctxt; struct raid_bdev *raid_bdev = bdev->ctxt;
struct spdk_bdev *base; struct raid_base_bdev_info *base_info;
uint8_t i;
spdk_json_write_object_begin(w); spdk_json_write_object_begin(w);
@ -624,10 +619,9 @@ raid_bdev_write_config_json(struct spdk_bdev *bdev, struct spdk_json_write_ctx *
spdk_json_write_named_string(w, "raid_level", raid_bdev_level_to_str(raid_bdev->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"); spdk_json_write_named_array_begin(w, "base_bdevs");
for (i = 0; i < raid_bdev->num_base_bdevs; i++) { RAID_FOR_EACH_BASE_BDEV(raid_bdev, base_info) {
base = raid_bdev->base_bdev_info[i].bdev; if (base_info->bdev) {
if (base) { spdk_json_write_string(w, base_info->bdev->name);
spdk_json_write_string(w, base->name);
} }
} }
spdk_json_write_array_end(w); spdk_json_write_array_end(w);
@ -1063,9 +1057,8 @@ static void
raid_bdev_get_running_config(FILE *fp) raid_bdev_get_running_config(FILE *fp)
{ {
struct raid_bdev *raid_bdev; struct raid_bdev *raid_bdev;
struct spdk_bdev *base; struct raid_base_bdev_info *base_info;
int index = 1; int index = 1;
uint8_t i;
TAILQ_FOREACH(raid_bdev, &g_raid_bdev_configured_list, state_link) { TAILQ_FOREACH(raid_bdev, &g_raid_bdev_configured_list, state_link) {
fprintf(fp, fprintf(fp,
@ -1080,12 +1073,11 @@ raid_bdev_get_running_config(FILE *fp)
raid_bdev_level_to_str(raid_bdev->level)); raid_bdev_level_to_str(raid_bdev->level));
fprintf(fp, fprintf(fp,
" Devices "); " Devices ");
for (i = 0; i < raid_bdev->num_base_bdevs; i++) { RAID_FOR_EACH_BASE_BDEV(raid_bdev, base_info) {
base = raid_bdev->base_bdev_info[i].bdev; if (base_info->bdev) {
if (base) {
fprintf(fp, fprintf(fp,
"%s ", "%s ",
base->name); base_info->bdev->name);
} }
} }
fprintf(fp, fprintf(fp,
@ -1303,18 +1295,19 @@ raid_bdev_alloc_base_bdev_resource(struct raid_bdev *raid_bdev, struct spdk_bdev
static int static int
raid_bdev_configure(struct raid_bdev *raid_bdev) raid_bdev_configure(struct raid_bdev *raid_bdev)
{ {
uint32_t blocklen; uint32_t blocklen = 0;
struct spdk_bdev *raid_bdev_gen; struct spdk_bdev *raid_bdev_gen;
struct raid_base_bdev_info *base_info;
int rc = 0; int rc = 0;
uint8_t i;
assert(raid_bdev->state == RAID_BDEV_STATE_CONFIGURING); assert(raid_bdev->state == RAID_BDEV_STATE_CONFIGURING);
assert(raid_bdev->num_base_bdevs_discovered == raid_bdev->num_base_bdevs); assert(raid_bdev->num_base_bdevs_discovered == raid_bdev->num_base_bdevs);
blocklen = raid_bdev->base_bdev_info[0].bdev->blocklen; RAID_FOR_EACH_BASE_BDEV(raid_bdev, base_info) {
for (i = 1; i < raid_bdev->num_base_bdevs; i++) {
/* Check blocklen for all base bdevs that it should be same */ /* Check blocklen for all base bdevs that it should be same */
if (blocklen != raid_bdev->base_bdev_info[i].bdev->blocklen) { if (blocklen == 0) {
blocklen = base_info->bdev->blocklen;
} else if (blocklen != base_info->bdev->blocklen) {
/* /*
* Assumption is that all the base bdevs for any raid bdev should * Assumption is that all the base bdevs for any raid bdev should
* have same blocklen * have same blocklen
@ -1409,23 +1402,23 @@ raid_bdev_deconfigure(struct raid_bdev *raid_bdev, raid_bdev_destruct_cb cb_fn,
* params: * params:
* base_bdev - pointer to base bdev pointer * base_bdev - pointer to base bdev pointer
* _raid_bdev - Reference to pointer to raid bdev * _raid_bdev - Reference to pointer to raid bdev
* _base_bdev_slot - Reference to the slot of the base bdev. * _base_info - Reference to the raid base bdev info.
* returns: * returns:
* true - if the raid bdev is found. * true - if the raid bdev is found.
* false - if the raid bdev is not found. * false - if the raid bdev is not found.
*/ */
static bool static bool
raid_bdev_find_by_base_bdev(struct spdk_bdev *base_bdev, struct raid_bdev **_raid_bdev, raid_bdev_find_by_base_bdev(struct spdk_bdev *base_bdev, struct raid_bdev **_raid_bdev,
uint8_t *_base_bdev_slot) struct raid_base_bdev_info **_base_info)
{ {
struct raid_bdev *raid_bdev; struct raid_bdev *raid_bdev;
uint8_t i; struct raid_base_bdev_info *base_info;
TAILQ_FOREACH(raid_bdev, &g_raid_bdev_list, global_link) { TAILQ_FOREACH(raid_bdev, &g_raid_bdev_list, global_link) {
for (i = 0; i < raid_bdev->num_base_bdevs; i++) { RAID_FOR_EACH_BASE_BDEV(raid_bdev, base_info) {
if (raid_bdev->base_bdev_info[i].bdev == base_bdev) { if (base_info->bdev == base_bdev) {
*_raid_bdev = raid_bdev; *_raid_bdev = raid_bdev;
*_base_bdev_slot = i; *_base_info = base_info;
return true; return true;
} }
} }
@ -1449,18 +1442,18 @@ raid_bdev_remove_base_bdev(void *ctx)
{ {
struct spdk_bdev *base_bdev = ctx; struct spdk_bdev *base_bdev = ctx;
struct raid_bdev *raid_bdev = NULL; struct raid_bdev *raid_bdev = NULL;
uint8_t base_bdev_slot = 0; struct raid_base_bdev_info *base_info;
SPDK_DEBUGLOG(SPDK_LOG_BDEV_RAID, "raid_bdev_remove_base_bdev\n"); SPDK_DEBUGLOG(SPDK_LOG_BDEV_RAID, "raid_bdev_remove_base_bdev\n");
/* Find the raid_bdev which has claimed this base_bdev */ /* Find the raid_bdev which has claimed this base_bdev */
if (!raid_bdev_find_by_base_bdev(base_bdev, &raid_bdev, &base_bdev_slot)) { if (!raid_bdev_find_by_base_bdev(base_bdev, &raid_bdev, &base_info)) {
SPDK_ERRLOG("bdev to remove '%s' not found\n", base_bdev->name); SPDK_ERRLOG("bdev to remove '%s' not found\n", base_bdev->name);
return; return;
} }
assert(raid_bdev->base_bdev_info[base_bdev_slot].desc); assert(base_info->desc);
raid_bdev->base_bdev_info[base_bdev_slot].remove_scheduled = true; base_info->remove_scheduled = true;
if (raid_bdev->destruct_called == true || if (raid_bdev->destruct_called == true ||
raid_bdev->state == RAID_BDEV_STATE_CONFIGURING) { raid_bdev->state == RAID_BDEV_STATE_CONFIGURING) {
@ -1468,7 +1461,7 @@ raid_bdev_remove_base_bdev(void *ctx)
* As raid bdev is not registered yet or already unregistered, * As raid bdev is not registered yet or already unregistered,
* so cleanup should be done here itself. * so cleanup should be done here itself.
*/ */
raid_bdev_free_base_bdev_resource(raid_bdev, base_bdev_slot); raid_bdev_free_base_bdev_resource(raid_bdev, base_info);
if (raid_bdev->num_base_bdevs_discovered == 0) { if (raid_bdev->num_base_bdevs_discovered == 0) {
/* There is no base bdev for this raid, so free the raid device. */ /* There is no base bdev for this raid, so free the raid device. */
raid_bdev_cleanup(raid_bdev); raid_bdev_cleanup(raid_bdev);
@ -1493,8 +1486,7 @@ raid_bdev_remove_base_devices(struct raid_bdev_config *raid_cfg,
raid_bdev_destruct_cb cb_fn, void *cb_arg) raid_bdev_destruct_cb cb_fn, void *cb_arg)
{ {
struct raid_bdev *raid_bdev; struct raid_bdev *raid_bdev;
struct raid_base_bdev_info *info; struct raid_base_bdev_info *base_info;
uint8_t i;
SPDK_DEBUGLOG(SPDK_LOG_BDEV_RAID, "raid_bdev_remove_base_devices\n"); SPDK_DEBUGLOG(SPDK_LOG_BDEV_RAID, "raid_bdev_remove_base_devices\n");
@ -1518,15 +1510,13 @@ raid_bdev_remove_base_devices(struct raid_bdev_config *raid_cfg,
raid_bdev->destroy_started = true; raid_bdev->destroy_started = true;
for (i = 0; i < raid_bdev->num_base_bdevs; i++) { RAID_FOR_EACH_BASE_BDEV(raid_bdev, base_info) {
info = &raid_bdev->base_bdev_info[i]; if (base_info->bdev == NULL) {
if (info->bdev == NULL) {
continue; continue;
} }
assert(info->desc); assert(base_info->desc);
info->remove_scheduled = true; base_info->remove_scheduled = true;
if (raid_bdev->destruct_called == true || if (raid_bdev->destruct_called == true ||
raid_bdev->state == RAID_BDEV_STATE_CONFIGURING) { raid_bdev->state == RAID_BDEV_STATE_CONFIGURING) {
@ -1534,7 +1524,7 @@ raid_bdev_remove_base_devices(struct raid_bdev_config *raid_cfg,
* As raid bdev is not registered yet or already unregistered, * As raid bdev is not registered yet or already unregistered,
* so cleanup should be done here itself. * so cleanup should be done here itself.
*/ */
raid_bdev_free_base_bdev_resource(raid_bdev, i); raid_bdev_free_base_bdev_resource(raid_bdev, base_info);
if (raid_bdev->num_base_bdevs_discovered == 0) { if (raid_bdev->num_base_bdevs_discovered == 0) {
/* There is no base bdev for this raid, so free the raid device. */ /* There is no base bdev for this raid, so free the raid device. */
raid_bdev_cleanup(raid_bdev); raid_bdev_cleanup(raid_bdev);

View File

@ -161,6 +161,9 @@ struct raid_bdev {
struct raid_bdev_module *module; struct raid_bdev_module *module;
}; };
#define RAID_FOR_EACH_BASE_BDEV(r, i) \
for (i = r->base_bdev_info; i < r->base_bdev_info + r->num_base_bdevs; i++)
/* /*
* raid_base_bdev_config is the per base bdev data structure which contains * raid_base_bdev_config is the per base bdev data structure which contains
* information w.r.t to per base bdev during parsing config * information w.r.t to per base bdev during parsing config

View File

@ -342,15 +342,12 @@ raid0_submit_null_payload_request(struct raid_bdev_io *raid_io)
static int raid0_start(struct raid_bdev *raid_bdev) static int raid0_start(struct raid_bdev *raid_bdev)
{ {
uint64_t min_blockcnt; uint64_t min_blockcnt = UINT64_MAX;
uint8_t i; struct raid_base_bdev_info *base_info;
min_blockcnt = raid_bdev->base_bdev_info[0].bdev->blockcnt; RAID_FOR_EACH_BASE_BDEV(raid_bdev, base_info) {
for (i = 1; i < raid_bdev->num_base_bdevs; i++) {
/* Calculate minimum block count from all base bdevs */ /* Calculate minimum block count from all base bdevs */
if (raid_bdev->base_bdev_info[i].bdev->blockcnt < min_blockcnt) { min_blockcnt = spdk_min(min_blockcnt, base_info->bdev->blockcnt);
min_blockcnt = raid_bdev->base_bdev_info[i].bdev->blockcnt;
}
} }
/* /*

View File

@ -208,7 +208,8 @@ base_bdevs_cleanup(void)
static void static void
check_and_remove_raid_bdev(struct raid_bdev_config *raid_cfg) check_and_remove_raid_bdev(struct raid_bdev_config *raid_cfg)
{ {
struct raid_bdev *raid_bdev; struct raid_bdev *raid_bdev;
struct raid_base_bdev_info *base_info;
/* Get the raid structured allocated if exists */ /* Get the raid structured allocated if exists */
raid_bdev = raid_cfg->raid_bdev; raid_bdev = raid_cfg->raid_bdev;
@ -216,10 +217,11 @@ check_and_remove_raid_bdev(struct raid_bdev_config *raid_cfg)
return; return;
} }
for (uint8_t i = 0; i < raid_bdev->num_base_bdevs; i++) { assert(raid_bdev->base_bdev_info != NULL);
assert(raid_bdev->base_bdev_info != NULL);
if (raid_bdev->base_bdev_info[i].bdev) { RAID_FOR_EACH_BASE_BDEV(raid_bdev, base_info) {
raid_bdev_free_base_bdev_resource(raid_bdev, i); if (base_info->bdev) {
raid_bdev_free_base_bdev_resource(raid_bdev, base_info);
} }
} }
assert(raid_bdev->num_base_bdevs_discovered == 0); assert(raid_bdev->num_base_bdevs_discovered == 0);
@ -923,7 +925,7 @@ static void
verify_raid_bdev(struct rpc_bdev_raid_create *r, bool presence, uint32_t raid_state) verify_raid_bdev(struct rpc_bdev_raid_create *r, bool presence, uint32_t raid_state)
{ {
struct raid_bdev *pbdev; struct raid_bdev *pbdev;
uint8_t i; struct raid_base_bdev_info *base_info;
struct spdk_bdev *bdev = NULL; struct spdk_bdev *bdev = NULL;
bool pbdev_found; bool pbdev_found;
uint64_t min_blockcnt = 0xFFFFFFFFFFFFFFFF; uint64_t min_blockcnt = 0xFFFFFFFFFFFFFFFF;
@ -946,14 +948,12 @@ verify_raid_bdev(struct rpc_bdev_raid_create *r, bool presence, uint32_t raid_st
CU_ASSERT(pbdev->num_base_bdevs_discovered == r->base_bdevs.num_base_bdevs); CU_ASSERT(pbdev->num_base_bdevs_discovered == r->base_bdevs.num_base_bdevs);
CU_ASSERT(pbdev->level == r->level); CU_ASSERT(pbdev->level == r->level);
CU_ASSERT(pbdev->destruct_called == false); CU_ASSERT(pbdev->destruct_called == false);
for (i = 0; i < pbdev->num_base_bdevs; i++) { CU_ASSERT(pbdev->base_bdev_info != NULL);
if (pbdev->base_bdev_info && pbdev->base_bdev_info[i].bdev) { RAID_FOR_EACH_BASE_BDEV(pbdev, base_info) {
bdev = spdk_bdev_get_by_name(pbdev->base_bdev_info[i].bdev->name); CU_ASSERT(base_info->bdev != NULL);
CU_ASSERT(bdev != NULL); bdev = spdk_bdev_get_by_name(base_info->bdev->name);
CU_ASSERT(pbdev->base_bdev_info[i].remove_scheduled == false); CU_ASSERT(bdev != NULL);
} else { CU_ASSERT(base_info->remove_scheduled == false);
CU_ASSERT(0);
}
if (bdev && bdev->blockcnt < min_blockcnt) { if (bdev && bdev->blockcnt < min_blockcnt) {
min_blockcnt = bdev->blockcnt; min_blockcnt = bdev->blockcnt;