diff --git a/include/spdk_internal/lvolstore.h b/include/spdk_internal/lvolstore.h index ab261304e..0d1df225c 100644 --- a/include/spdk_internal/lvolstore.h +++ b/include/spdk_internal/lvolstore.h @@ -54,7 +54,6 @@ struct spdk_lvol_req { void *cb_arg; struct spdk_lvol *lvol; size_t sz; - struct spdk_bdev *bdev; char name[SPDK_LVOL_NAME_MAX]; }; diff --git a/lib/bdev/lvol/vbdev_lvol.c b/lib/bdev/lvol/vbdev_lvol.c index d073792a6..5fac73091 100644 --- a/lib/bdev/lvol/vbdev_lvol.c +++ b/lib/bdev/lvol/vbdev_lvol.c @@ -477,26 +477,6 @@ vbdev_get_lvol_store_by_name(const char *name) return NULL; } -static struct spdk_lvol * -vbdev_get_lvol_by_unique_id(const char *name) -{ - struct spdk_lvol *lvol, *tmp_lvol; - struct lvol_store_bdev *lvs_bdev, *tmp_lvs_bdev; - - TAILQ_FOREACH_SAFE(lvs_bdev, &g_spdk_lvol_pairs, lvol_stores, tmp_lvs_bdev) { - if (lvs_bdev->req != NULL) { - continue; - } - TAILQ_FOREACH_SAFE(lvol, &lvs_bdev->lvs->lvols, link, tmp_lvol) { - if (!strcmp(lvol->unique_id, name)) { - return lvol; - } - } - } - - return NULL; -} - static void _vbdev_lvol_close_cb(void *cb_arg, int lvserrno) { @@ -971,54 +951,55 @@ static void _vbdev_lvol_resize_cb(void *cb_arg, int lvolerrno) { struct spdk_lvol_req *req = cb_arg; - uint64_t cluster_size; - int rc; + struct spdk_lvol *lvol = req->lvol; + uint64_t total_size; - if (lvolerrno == 0) { - cluster_size = spdk_bs_get_cluster_size(req->lvol->lvol_store->blobstore); - rc = spdk_bdev_notify_blockcnt_change(req->bdev, req->sz * cluster_size / req->bdev->blocklen); - if (rc != 0) { - SPDK_ERRLOG("Could not change num blocks for bdev_lvol.\n"); - } + /* change bdev size */ + if (lvolerrno != 0) { + SPDK_ERRLOG("CB function for bdev lvol %s receive error no: %d.\n", lvol->name, lvolerrno); + goto finish; } - req->cb_fn(req->cb_arg, lvolerrno); + total_size = spdk_blob_get_num_clusters(lvol->blob) * + spdk_bs_get_cluster_size(lvol->lvol_store->blobstore); + assert((total_size % lvol->bdev->blocklen) == 0); + + lvolerrno = spdk_bdev_notify_blockcnt_change(lvol->bdev, total_size / lvol->bdev->blocklen); + if (lvolerrno != 0) { + SPDK_ERRLOG("Could not change num blocks for bdev lvol %s with error no: %d.\n", + lvol->name, lvolerrno); + } + +finish: + req->cb_fn(req->cb_arg, lvolerrno); free(req); } -int -vbdev_lvol_resize(char *name, size_t sz, - spdk_lvol_op_complete cb_fn, void *cb_arg) +void +vbdev_lvol_resize(struct spdk_lvol *lvol, size_t sz, spdk_lvol_op_complete cb_fn, void *cb_arg) { struct spdk_lvol_req *req; - struct spdk_bdev *bdev; - struct spdk_lvol *lvol; - lvol = vbdev_get_lvol_by_unique_id(name); if (lvol == NULL) { - SPDK_ERRLOG("lvol '%s' does not exist\n", name); - return -ENODEV; + SPDK_ERRLOG("lvol does not exist\n"); + cb_fn(cb_arg, -EINVAL); + return; } - bdev = spdk_bdev_get_by_name(name); - if (bdev == NULL) { - SPDK_ERRLOG("bdev '%s' does not exist\n", name); - return -ENODEV; - } + assert(lvol->bdev != NULL); req = calloc(1, sizeof(*req)); if (req == NULL) { - cb_fn(cb_arg, -1); - return -ENOMEM; + cb_fn(cb_arg, -ENOMEM); + return; } + req->cb_fn = cb_fn; req->cb_arg = cb_arg; req->sz = sz; - req->bdev = bdev; req->lvol = lvol; - spdk_lvol_resize(lvol, sz, _vbdev_lvol_resize_cb, req); - return 0; + spdk_lvol_resize(req->lvol, req->sz, _vbdev_lvol_resize_cb, req); } static int diff --git a/lib/bdev/lvol/vbdev_lvol.h b/lib/bdev/lvol/vbdev_lvol.h index 152ebdb80..9e37deff8 100644 --- a/lib/bdev/lvol/vbdev_lvol.h +++ b/lib/bdev/lvol/vbdev_lvol.h @@ -61,7 +61,16 @@ void vbdev_lvol_create_snapshot(struct spdk_lvol *lvol, const char *snapshot_nam void vbdev_lvol_create_clone(struct spdk_lvol *lvol, const char *clone_name, spdk_lvol_op_with_handle_complete cb_fn, void *cb_arg); -int vbdev_lvol_resize(char *name, size_t sz, spdk_lvol_op_complete cb_fn, void *cb_arg); +/** + * \brief Change size of lvol + * \param lvol Handle to lvol + * \param sz Size of lvol to change + * \param cb_fn Completion callback + * \param cb_arg Completion callback custom arguments + * \return error + */ +void vbdev_lvol_resize(struct spdk_lvol *lvol, size_t sz, spdk_lvol_op_complete cb_fn, + void *cb_arg); void vbdev_lvol_rename(struct spdk_lvol *lvol, const char *new_lvol_name, spdk_lvol_op_complete cb_fn, void *cb_arg); diff --git a/lib/bdev/lvol/vbdev_lvol_rpc.c b/lib/bdev/lvol/vbdev_lvol_rpc.c index 3203f6130..6b66d5ab3 100644 --- a/lib/bdev/lvol/vbdev_lvol_rpc.c +++ b/lib/bdev/lvol/vbdev_lvol_rpc.c @@ -725,6 +725,8 @@ spdk_rpc_resize_lvol_bdev(struct spdk_jsonrpc_request *request, const struct spdk_json_val *params) { struct rpc_resize_lvol_bdev req = {}; + struct spdk_bdev *bdev; + struct spdk_lvol *lvol; int rc = 0; SPDK_INFOLOG(SPDK_LOG_LVOL_RPC, "Resizing lvol\n"); @@ -743,11 +745,21 @@ spdk_rpc_resize_lvol_bdev(struct spdk_jsonrpc_request *request, goto invalid; } - rc = vbdev_lvol_resize(req.name, (size_t)req.size, _spdk_rpc_resize_lvol_bdev_cb, request); - if (rc < 0) { + bdev = spdk_bdev_get_by_name(req.name); + if (bdev == NULL) { + SPDK_ERRLOG("no bdev for provided name %s\n", req.name); + rc = -ENODEV; goto invalid; } + lvol = vbdev_lvol_get_from_bdev(bdev); + if (lvol == NULL) { + rc = -ENODEV; + goto invalid; + } + + vbdev_lvol_resize(lvol, req.size, _spdk_rpc_resize_lvol_bdev_cb, request); + free_rpc_resize_lvol_bdev(&req); return; 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 d3ffd9af3..ca7b2c1ba 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 @@ -1089,21 +1089,15 @@ ut_lvol_resize(void) g_base_bdev->name = spdk_sprintf_alloc("%s", g_lvol->unique_id); SPDK_CU_ASSERT_FATAL(g_base_bdev->name != NULL); + g_lvolerrno = -1; /* Successful lvol resize */ - rc = vbdev_lvol_resize(g_lvol->unique_id, 20, vbdev_lvol_resize_complete, NULL); - CU_ASSERT(rc == 0); + vbdev_lvol_resize(g_lvol, 20, vbdev_lvol_resize_complete, NULL); + CU_ASSERT(g_lvolerrno == 0); CU_ASSERT(g_base_bdev->blockcnt == 20 * g_cluster_size / g_base_bdev->blocklen); - /* Resize with wrong bdev name */ - rc = vbdev_lvol_resize("wrong name", 20, vbdev_lvol_resize_complete, NULL); - CU_ASSERT(rc != 0); - - /* Resize with correct bdev name, but wrong lvol name */ - free(g_lvol->unique_id); - g_lvol->unique_id = strdup("wrong name"); - SPDK_CU_ASSERT_FATAL(g_lvol->unique_id != NULL); - rc = vbdev_lvol_resize(g_base_bdev->name, 20, vbdev_lvol_resize_complete, NULL); - CU_ASSERT(rc != 0); + /* Resize with NULL lvol */ + vbdev_lvol_resize(NULL, 20, vbdev_lvol_resize_complete, NULL); + CU_ASSERT(g_lvolerrno != 0); /* Successful lvol destruct */ vbdev_lvol_destruct(g_lvol);