From 6ae7b826ca40e1b0a615f37cbd8aa239caa02c33 Mon Sep 17 00:00:00 2001 From: Maciej Szwed Date: Wed, 4 Oct 2017 17:06:46 +0200 Subject: [PATCH] lvol: claim base bdev on lvol load Signed-off-by: Maciej Szwed Change-Id: Idd19b8be38a843dfd50710c09d0c6c31773c2f0c Reviewed-on: https://review.gerrithub.io/380014 Reviewed-by: Tomasz Zawadzki Reviewed-by: Jim Harris Tested-by: SPDK Automated Test System Reviewed-by: Daniel Verkamp --- lib/bdev/lvol/vbdev_lvol.c | 42 +++++++++++++------ .../lib/bdev/vbdev_lvol.c/vbdev_lvol_ut.c | 17 ++++++-- 2 files changed, 43 insertions(+), 16 deletions(-) diff --git a/lib/bdev/lvol/vbdev_lvol.c b/lib/bdev/lvol/vbdev_lvol.c index 8f56b7c78..bda4d5ede 100644 --- a/lib/bdev/lvol/vbdev_lvol.c +++ b/lib/bdev/lvol/vbdev_lvol.c @@ -64,6 +64,7 @@ _vbdev_lvs_create_cb(void *cb_arg, struct spdk_lvol_store *lvs, int lvserrno) struct spdk_lvs_with_handle_req *req = cb_arg; struct lvol_store_bdev *lvs_bdev; struct spdk_bdev *bdev = req->base_bdev; + struct spdk_bs_dev *bs_dev = req->bs_dev; if (lvserrno != 0) { assert(lvs == NULL); @@ -71,6 +72,13 @@ _vbdev_lvs_create_cb(void *cb_arg, struct spdk_lvol_store *lvs, int lvserrno) goto end; } + lvserrno = spdk_bs_bdev_claim(bs_dev, SPDK_GET_BDEV_MODULE(lvol)); + if (lvserrno != 0) { + SPDK_INFOLOG(SPDK_TRACE_VBDEV_LVOL, "Lvol store base bdev already claimed by another bdev\n"); + req->bs_dev->destroy(req->bs_dev); + goto end; + } + assert(lvs != NULL); lvs_bdev = calloc(1, sizeof(*lvs_bdev)); @@ -160,28 +168,38 @@ vbdev_lvs_destruct(struct spdk_lvol_store *lvs, spdk_lvs_op_complete cb_fn, struct lvol_store_bdev *lvs_bdev; struct spdk_lvol *lvol, *tmp; - req = calloc(1, sizeof(*req)); - if (!req) { - SPDK_ERRLOG("Cannot alloc memory for vbdev lvol store request pointer\n"); - return; - } - req->cb_fn = cb_fn; - req->cb_arg = cb_arg; - lvs_bdev = vbdev_get_lvs_bdev_by_lvs(lvs); TAILQ_REMOVE(&g_spdk_lvol_pairs, lvs_bdev, lvol_stores); - free(lvs_bdev); + req = calloc(1, sizeof(*req)); + if (!req) { + SPDK_ERRLOG("Cannot alloc memory for vbdev lvol store request pointer\n"); + if (cb_fn != NULL) + cb_fn(cb_arg, -ENOMEM); + return; + } + + req->cb_fn = cb_fn; + req->cb_arg = cb_arg; if (TAILQ_EMPTY(&lvs->lvols)) { spdk_lvs_unload(lvs, _vbdev_lvs_destruct_cb, req); } else { - lvs->destruct_req = req; + lvs->destruct_req = calloc(1, sizeof(*lvs->destruct_req)); + if (!lvs->destruct_req) { + SPDK_ERRLOG("Cannot alloc memory for vbdev lvol store request pointer\n"); + _vbdev_lvs_destruct_cb(req, -ENOMEM); + return; + } + lvs->destruct_req->cb_fn = _vbdev_lvs_destruct_cb; + lvs->destruct_req->cb_arg = req; TAILQ_FOREACH_SAFE(lvol, &lvs->lvols, link, tmp) { lvol->close_only = true; - spdk_bdev_unregister(lvol->bdev); + spdk_vbdev_unregister(lvol->bdev); } } + + free(lvs_bdev); } struct lvol_store_bdev * @@ -462,7 +480,7 @@ _create_lvol_disk(struct spdk_lvol *lvol) bdev->fn_table = &vbdev_lvol_fn_table; bdev->module = SPDK_GET_BDEV_MODULE(lvol); - spdk_bdev_register(bdev); + spdk_vbdev_register(bdev, &lvs_bdev->bdev, 1); return bdev; } diff --git a/test/unit/lib/bdev/vbdev_lvol.c/vbdev_lvol_ut.c b/test/unit/lib/bdev/vbdev_lvol.c/vbdev_lvol_ut.c index db1454f16..396fb9b0e 100644 --- a/test/unit/lib/bdev/vbdev_lvol.c/vbdev_lvol_ut.c +++ b/test/unit/lib/bdev/vbdev_lvol.c/vbdev_lvol_ut.c @@ -54,8 +54,19 @@ bool lvol_store_initialize_fail = false; bool lvol_store_initialize_cb_fail = false; bool lvol_already_opened = false; +int +spdk_bs_bdev_claim(struct spdk_bs_dev *bs_dev, struct spdk_bdev_module_if *module) +{ + if (lvol_already_opened == true) + return -1; + + lvol_already_opened = true; + + return 0; +} + void -spdk_bdev_unregister(struct spdk_bdev *bdev) +spdk_vbdev_unregister(struct spdk_bdev *vbdev) { return; } @@ -85,8 +96,6 @@ spdk_bdev_create_bs_dev(struct spdk_bdev *bdev, spdk_bdev_remove_cb_t remove_cb, if (lvol_already_opened == true) return NULL; - lvol_already_opened = true; - bs_dev = calloc(1, sizeof(*bs_dev)); bs_dev->destroy = bdev_blob_destroy; @@ -266,7 +275,7 @@ spdk_bdev_get_name(const struct spdk_bdev *bdev) } void -spdk_bdev_register(struct spdk_bdev *bdev) +spdk_vbdev_register(struct spdk_bdev *vbdev, struct spdk_bdev **base_bdevs, int base_bdev_count) { }