lvol: claim base bdev on lvol load
Signed-off-by: Maciej Szwed <maciej.szwed@intel.com> Change-Id: Idd19b8be38a843dfd50710c09d0c6c31773c2f0c Reviewed-on: https://review.gerrithub.io/380014 Reviewed-by: Tomasz Zawadzki <tomasz.zawadzki@intel.com> Reviewed-by: Jim Harris <james.r.harris@intel.com> Tested-by: SPDK Automated Test System <sys_sgsw@intel.com> Reviewed-by: Daniel Verkamp <daniel.verkamp@intel.com>
This commit is contained in:
parent
c4fe479812
commit
6ae7b826ca
@ -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 spdk_lvs_with_handle_req *req = cb_arg;
|
||||||
struct lvol_store_bdev *lvs_bdev;
|
struct lvol_store_bdev *lvs_bdev;
|
||||||
struct spdk_bdev *bdev = req->base_bdev;
|
struct spdk_bdev *bdev = req->base_bdev;
|
||||||
|
struct spdk_bs_dev *bs_dev = req->bs_dev;
|
||||||
|
|
||||||
if (lvserrno != 0) {
|
if (lvserrno != 0) {
|
||||||
assert(lvs == NULL);
|
assert(lvs == NULL);
|
||||||
@ -71,6 +72,13 @@ _vbdev_lvs_create_cb(void *cb_arg, struct spdk_lvol_store *lvs, int lvserrno)
|
|||||||
goto end;
|
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);
|
assert(lvs != NULL);
|
||||||
|
|
||||||
lvs_bdev = calloc(1, sizeof(*lvs_bdev));
|
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 lvol_store_bdev *lvs_bdev;
|
||||||
struct spdk_lvol *lvol, *tmp;
|
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);
|
lvs_bdev = vbdev_get_lvs_bdev_by_lvs(lvs);
|
||||||
TAILQ_REMOVE(&g_spdk_lvol_pairs, lvs_bdev, lvol_stores);
|
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)) {
|
if (TAILQ_EMPTY(&lvs->lvols)) {
|
||||||
spdk_lvs_unload(lvs, _vbdev_lvs_destruct_cb, req);
|
spdk_lvs_unload(lvs, _vbdev_lvs_destruct_cb, req);
|
||||||
} else {
|
} 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) {
|
TAILQ_FOREACH_SAFE(lvol, &lvs->lvols, link, tmp) {
|
||||||
lvol->close_only = true;
|
lvol->close_only = true;
|
||||||
spdk_bdev_unregister(lvol->bdev);
|
spdk_vbdev_unregister(lvol->bdev);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
free(lvs_bdev);
|
||||||
}
|
}
|
||||||
|
|
||||||
struct lvol_store_bdev *
|
struct lvol_store_bdev *
|
||||||
@ -462,7 +480,7 @@ _create_lvol_disk(struct spdk_lvol *lvol)
|
|||||||
bdev->fn_table = &vbdev_lvol_fn_table;
|
bdev->fn_table = &vbdev_lvol_fn_table;
|
||||||
bdev->module = SPDK_GET_BDEV_MODULE(lvol);
|
bdev->module = SPDK_GET_BDEV_MODULE(lvol);
|
||||||
|
|
||||||
spdk_bdev_register(bdev);
|
spdk_vbdev_register(bdev, &lvs_bdev->bdev, 1);
|
||||||
|
|
||||||
return bdev;
|
return bdev;
|
||||||
}
|
}
|
||||||
|
@ -54,8 +54,19 @@ bool lvol_store_initialize_fail = false;
|
|||||||
bool lvol_store_initialize_cb_fail = false;
|
bool lvol_store_initialize_cb_fail = false;
|
||||||
bool lvol_already_opened = 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
|
void
|
||||||
spdk_bdev_unregister(struct spdk_bdev *bdev)
|
spdk_vbdev_unregister(struct spdk_bdev *vbdev)
|
||||||
{
|
{
|
||||||
return;
|
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)
|
if (lvol_already_opened == true)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
lvol_already_opened = true;
|
|
||||||
|
|
||||||
bs_dev = calloc(1, sizeof(*bs_dev));
|
bs_dev = calloc(1, sizeof(*bs_dev));
|
||||||
bs_dev->destroy = bdev_blob_destroy;
|
bs_dev->destroy = bdev_blob_destroy;
|
||||||
|
|
||||||
@ -266,7 +275,7 @@ spdk_bdev_get_name(const struct spdk_bdev *bdev)
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
spdk_bdev_register(struct spdk_bdev *bdev)
|
spdk_vbdev_register(struct spdk_bdev *vbdev, struct spdk_bdev **base_bdevs, int base_bdev_count)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user