From 8d57caa11c78f1d740ba34f8061369357515201b Mon Sep 17 00:00:00 2001 From: Shuhei Matsumoto Date: Mon, 26 Mar 2018 08:30:03 +0900 Subject: [PATCH] bdev/error: Remove config of an error vbdev at the removal of the vbdev Remove configuration of an error vbdev at the removal of the vbdev. This will lose the strict compatibility but the next patch will make possible for us to add the removed config dynamically. This patch will make the implementation cleaner and will not lose any usability. Change-Id: Idea7767ab5424427f912c82c66ff7d59d28108ab Signed-off-by: Shuhei Matsumoto Reviewed-on: https://review.gerrithub.io/403915 Reviewed-by: Jim Harris Reviewed-by: Pawel Wodkowski Reviewed-by: Daniel Verkamp Tested-by: SPDK Automated Test System Reviewed-by: Changpeng Liu --- lib/bdev/error/vbdev_error.c | 50 ++++++++++++++++++++++++++++++------ 1 file changed, 42 insertions(+), 8 deletions(-) diff --git a/lib/bdev/error/vbdev_error.c b/lib/bdev/error/vbdev_error.c index 3f100d56c..0888142f6 100644 --- a/lib/bdev/error/vbdev_error.c +++ b/lib/bdev/error/vbdev_error.c @@ -82,6 +82,8 @@ static void vbdev_error_fini(void); static void vbdev_error_examine(struct spdk_bdev *bdev); static int vbdev_error_config_json(struct spdk_json_write_ctx *w); +static int vbdev_error_config_remove(const char *base_bdev_name); + static struct spdk_bdev_module error_if = { .name = "error", .module_init = vbdev_error_init, @@ -209,9 +211,16 @@ static int vbdev_error_destruct(void *ctx) { struct error_disk *error_disk = ctx; + struct spdk_bdev *base_bdev = error_disk->part.base->bdev; + int rc; + + rc = vbdev_error_config_remove(base_bdev->name); + if (rc != 0) { + SPDK_ERRLOG("vbdev_error_config_remove() failed\n"); + } spdk_bdev_part_free(&error_disk->part); - return 0; + return rc; } static int @@ -316,6 +325,36 @@ vbdev_error_clear_config(void) } } +static struct spdk_vbdev_error_config * +vbdev_error_config_find_by_base_name(const char *base_bdev_name) +{ + struct spdk_vbdev_error_config *cfg; + + TAILQ_FOREACH(cfg, &g_error_config, tailq) { + if (strcmp(cfg->base_bdev, base_bdev_name) == 0) { + return cfg; + } + } + + return NULL; +} + +static int +vbdev_error_config_remove(const char *base_bdev_name) +{ + struct spdk_vbdev_error_config *cfg; + + cfg = vbdev_error_config_find_by_base_name(base_bdev_name); + if (!cfg) { + return -ENOENT; + } + + TAILQ_REMOVE(&g_error_config, cfg, tailq); + free(cfg->base_bdev); + free(cfg); + return 0; +} + static int vbdev_error_init(void) { @@ -378,17 +417,12 @@ vbdev_error_examine(struct spdk_bdev *bdev) struct spdk_vbdev_error_config *cfg; int rc; - TAILQ_FOREACH(cfg, &g_error_config, tailq) { - if (strcmp(cfg->base_bdev, bdev->name) != 0) { - continue; - } - + cfg = vbdev_error_config_find_by_base_name(bdev->name); + if (cfg != NULL) { rc = spdk_vbdev_error_create(bdev); if (rc != 0) { SPDK_ERRLOG("could not create error vbdev for bdev %s\n", bdev->name); } - - break; } spdk_bdev_module_examine_done(&error_if);