From f71c25582721c0036a55d5b5af261f609a91d0bd Mon Sep 17 00:00:00 2001 From: Artur Paszkiewicz Date: Fri, 25 Nov 2022 13:07:59 +0100 Subject: [PATCH] module/raid: add raid_bdev ptr to raid_base_bdev_info This allows to simplify some code where raid_bdev and base_info are needed. Change-Id: I40395204fdcdd0487bdecec1cd47efb347f1310a Signed-off-by: Artur Paszkiewicz --- module/bdev/raid/bdev_raid.c | 58 ++++++++++--------- module/bdev/raid/bdev_raid.h | 3 + .../lib/bdev/raid/bdev_raid.c/bdev_raid_ut.c | 2 +- 3 files changed, 35 insertions(+), 28 deletions(-) diff --git a/module/bdev/raid/bdev_raid.c b/module/bdev/raid/bdev_raid.c index 14e38fcdf..7af243116 100644 --- a/module/bdev/raid/bdev_raid.c +++ b/module/bdev/raid/bdev_raid.c @@ -209,16 +209,16 @@ raid_bdev_cleanup_and_free(struct raid_bdev *raid_bdev) * brief: * free resource of base bdev for raid bdev * params: - * raid_bdev - pointer to raid bdev * base_info - raid base bdev info * returns: * 0 - success * non zero - failure */ static void -raid_bdev_free_base_bdev_resource(struct raid_bdev *raid_bdev, - struct raid_base_bdev_info *base_info) +raid_bdev_free_base_bdev_resource(struct raid_base_bdev_info *base_info) { + struct raid_bdev *raid_bdev = base_info->raid_bdev; + assert(spdk_get_thread() == spdk_thread_get_app_thread()); free(base_info->name); @@ -276,7 +276,7 @@ _raid_bdev_destruct(void *ctxt) * layers. Also close the descriptors if we have started shutdown. */ if (g_shutdown_started || base_info->remove_scheduled == true) { - raid_bdev_free_base_bdev_resource(raid_bdev, base_info); + raid_bdev_free_base_bdev_resource(base_info); } } @@ -951,6 +951,7 @@ raid_bdev_create(const char *name, uint32_t strip_size, uint8_t num_base_bdevs, struct raid_bdev *raid_bdev; struct spdk_bdev *raid_bdev_gen; struct raid_bdev_module *module; + struct raid_base_bdev_info *base_info; uint8_t min_operational; int rc; @@ -1027,6 +1028,10 @@ raid_bdev_create(const char *name, uint32_t strip_size, uint8_t num_base_bdevs, return -ENOMEM; } + RAID_FOR_EACH_BASE_BDEV(raid_bdev, base_info) { + base_info->raid_bdev = raid_bdev; + } + /* strip_size_kb is from the rpc param. strip_size is in blocks and used * internally and set later. */ @@ -1234,19 +1239,14 @@ raid_bdev_deconfigure(struct raid_bdev *raid_bdev, raid_bdev_destruct_cb cb_fn, /* * brief: - * raid_bdev_find_by_base_bdev function finds the raid bdev which has - * claimed the base bdev. + * raid_bdev_find_base_info_by_bdev function finds the base bdev info by bdev. * params: - * base_bdev - pointer to base bdev pointer - * _raid_bdev - Reference to pointer to raid bdev - * _base_info - Reference to the raid base bdev info. + * base_bdev - pointer to base bdev * returns: - * true - if the raid bdev is found. - * false - if the raid bdev is not found. + * base bdev info if found, otherwise NULL. */ -static bool -raid_bdev_find_by_base_bdev(struct spdk_bdev *base_bdev, struct raid_bdev **_raid_bdev, - struct raid_base_bdev_info **_base_info) +static struct raid_base_bdev_info * +raid_bdev_find_base_info_by_bdev(struct spdk_bdev *base_bdev) { struct raid_bdev *raid_bdev; struct raid_base_bdev_info *base_info; @@ -1254,14 +1254,12 @@ raid_bdev_find_by_base_bdev(struct spdk_bdev *base_bdev, struct raid_bdev **_rai TAILQ_FOREACH(raid_bdev, &g_raid_bdev_list, global_link) { RAID_FOR_EACH_BASE_BDEV(raid_bdev, base_info) { if (base_info->bdev == base_bdev) { - *_raid_bdev = raid_bdev; - *_base_info = base_info; - return true; + return base_info; } } } - return false; + return NULL; } typedef void (*raid_bdev_suspended_cb)(struct raid_bdev *raid_bdev, void *ctx); @@ -1428,16 +1426,18 @@ raid_bdev_resume(struct raid_bdev *raid_bdev) static void raid_bdev_remove_base_bdev(struct spdk_bdev *base_bdev) { - struct raid_bdev *raid_bdev = NULL; + struct raid_bdev *raid_bdev; struct raid_base_bdev_info *base_info; SPDK_DEBUGLOG(bdev_raid, "raid_bdev_remove_base_bdev\n"); /* Find the raid_bdev which has claimed this base_bdev */ - if (!raid_bdev_find_by_base_bdev(base_bdev, &raid_bdev, &base_info)) { + base_info = raid_bdev_find_base_info_by_bdev(base_bdev); + if (!base_info) { SPDK_ERRLOG("bdev to remove '%s' not found\n", base_bdev->name); return; } + raid_bdev = base_info->raid_bdev; assert(spdk_get_thread() == spdk_thread_get_app_thread()); @@ -1449,7 +1449,7 @@ raid_bdev_remove_base_bdev(struct spdk_bdev *base_bdev) * As raid bdev is not registered yet or already unregistered, * so cleanup should be done here itself. */ - raid_bdev_free_base_bdev_resource(raid_bdev, base_info); + raid_bdev_free_base_bdev_resource(base_info); if (raid_bdev->num_base_bdevs_discovered == 0) { /* There is no base bdev for this raid, so free the raid device. */ raid_bdev_cleanup_and_free(raid_bdev); @@ -1473,16 +1473,19 @@ raid_bdev_remove_base_bdev(struct spdk_bdev *base_bdev) static void raid_bdev_resize_base_bdev(struct spdk_bdev *base_bdev) { - struct raid_bdev *raid_bdev = NULL; + struct raid_bdev *raid_bdev; struct raid_base_bdev_info *base_info; SPDK_DEBUGLOG(bdev_raid, "raid_bdev_resize_base_bdev\n"); + base_info = raid_bdev_find_base_info_by_bdev(base_bdev); + /* Find the raid_bdev which has claimed this base_bdev */ - if (!raid_bdev_find_by_base_bdev(base_bdev, &raid_bdev, &base_info)) { + if (!base_info) { SPDK_ERRLOG("raid_bdev whose base_bdev '%s' not found\n", base_bdev->name); return; } + raid_bdev = base_info->raid_bdev; assert(spdk_get_thread() == spdk_thread_get_app_thread()); @@ -1556,7 +1559,7 @@ raid_bdev_delete(struct raid_bdev *raid_bdev, raid_bdev_destruct_cb cb_fn, void * As raid bdev is not registered yet or already unregistered, * so cleanup should be done here itself. */ - raid_bdev_free_base_bdev_resource(raid_bdev, base_info); + raid_bdev_free_base_bdev_resource(base_info); } } @@ -1572,8 +1575,9 @@ raid_bdev_delete(struct raid_bdev *raid_bdev, raid_bdev_destruct_cb cb_fn, void } static int -raid_bdev_configure_base_bdev(struct raid_bdev *raid_bdev, struct raid_base_bdev_info *base_info) +raid_bdev_configure_base_bdev(struct raid_base_bdev_info *base_info) { + struct raid_bdev *raid_bdev = base_info->raid_bdev; struct spdk_bdev_desc *desc; struct spdk_bdev *bdev; int rc; @@ -1676,7 +1680,7 @@ raid_bdev_add_base_device(struct raid_bdev *raid_bdev, const char *name, uint8_t return -ENOMEM; } - rc = raid_bdev_configure_base_bdev(raid_bdev, base_info); + rc = raid_bdev_configure_base_bdev(base_info); if (rc != 0) { if (rc != -ENODEV) { SPDK_ERRLOG("Failed to allocate resource for bdev '%s'\n", name); @@ -1706,7 +1710,7 @@ raid_bdev_examine(struct spdk_bdev *bdev) TAILQ_FOREACH(raid_bdev, &g_raid_bdev_list, global_link) { RAID_FOR_EACH_BASE_BDEV(raid_bdev, base_info) { if (base_info->bdev == NULL && strcmp(bdev->name, base_info->name) == 0) { - raid_bdev_configure_base_bdev(raid_bdev, base_info); + raid_bdev_configure_base_bdev(base_info); break; } } diff --git a/module/bdev/raid/bdev_raid.h b/module/bdev/raid/bdev_raid.h index 096d6b7a7..75aac9242 100644 --- a/module/bdev/raid/bdev_raid.h +++ b/module/bdev/raid/bdev_raid.h @@ -49,6 +49,9 @@ enum raid_bdev_state { * required per base device for raid bdev will be kept here */ struct raid_base_bdev_info { + /* The raid bdev that this base bdev belongs to */ + struct raid_bdev *raid_bdev; + /* name of the bdev */ char *name; diff --git a/test/unit/lib/bdev/raid/bdev_raid.c/bdev_raid_ut.c b/test/unit/lib/bdev/raid/bdev_raid.c/bdev_raid_ut.c index 2423e13e4..765c7361e 100644 --- a/test/unit/lib/bdev/raid/bdev_raid.c/bdev_raid_ut.c +++ b/test/unit/lib/bdev/raid/bdev_raid.c/bdev_raid_ut.c @@ -223,7 +223,7 @@ check_and_remove_raid_bdev(struct raid_bdev *raid_bdev) RAID_FOR_EACH_BASE_BDEV(raid_bdev, base_info) { if (base_info->bdev) { - raid_bdev_free_base_bdev_resource(raid_bdev, base_info); + raid_bdev_free_base_bdev_resource(base_info); } } assert(raid_bdev->num_base_bdevs_discovered == 0);