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:
parent
72b7f73c26
commit
f3e13c95d9
@ -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];
|
||||
};
|
||||
|
||||
|
@ -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
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user