bdev: Change vbdev lvol resize function

Change vbdev_lvol_resize() char name argument
to struct spdk_lvol lvol.
Add spdk_bdev_notify_blockcnt_change() after
succesfull spdk_lvol_resize().
Some code clean up and refactoring.

Change-Id: Idaa5bd4707e2479dfee50459a9844319b8c35d3a
Signed-off-by: Slawomir Mrozowicz <slawomirx.mrozowicz@intel.com>
Reviewed-on: https://review.gerrithub.io/394521
Tested-by: SPDK Automated Test System <sys_sgsw@intel.com>
Reviewed-by: Ben Walker <benjamin.walker@intel.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
This commit is contained in:
Slawomir Mrozowicz 2018-02-07 11:02:09 +01:00 committed by Daniel Verkamp
parent 72b7f73c26
commit f3e13c95d9
5 changed files with 58 additions and 63 deletions

View File

@ -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];
};

View File

@ -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

View File

@ -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);

View File

@ -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;

View File

@ -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);