From b556e43e9227fa54bdae232f20be5034be3aa006 Mon Sep 17 00:00:00 2001 From: Tomasz Zawadzki Date: Wed, 11 Aug 2021 02:57:23 -0400 Subject: [PATCH] bdev/lvol: add lvol_bdev structure on top of spdk_bdev Added struct lvol_bdev wrapping around spdk_bdev. This will help with passing around any context. For this patch only spdk_lvol is still used. Signed-off-by: Tomasz Zawadzki Change-Id: I23f5be5edda526ad607ea8b45274c945a42d90db Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/9147 Tested-by: SPDK CI Jenkins Community-CI: Broadcom CI Community-CI: Mellanox Build Bot Reviewed-by: Aleksey Marchuk Reviewed-by: Jim Harris Reviewed-by: Konrad Sztyber --- module/bdev/lvol/vbdev_lvol.c | 19 ++++++++++++------- module/bdev/lvol/vbdev_lvol.h | 5 +++++ 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/module/bdev/lvol/vbdev_lvol.c b/module/bdev/lvol/vbdev_lvol.c index d3a74a134..5be2cb96c 100644 --- a/module/bdev/lvol/vbdev_lvol.c +++ b/module/bdev/lvol/vbdev_lvol.c @@ -551,21 +551,22 @@ struct vbdev_lvol_destroy_ctx { static void _vbdev_lvol_unregister_cb(void *ctx, int lvolerrno) { - struct spdk_bdev *bdev = ctx; + struct lvol_bdev *lvol_bdev = ctx; - spdk_bdev_destruct_done(bdev, lvolerrno); - free(bdev); + spdk_bdev_destruct_done(&lvol_bdev->bdev, lvolerrno); + free(lvol_bdev); } static int vbdev_lvol_unregister(void *ctx) { struct spdk_lvol *lvol = ctx; + struct lvol_bdev *lvol_bdev = SPDK_CONTAINEROF(lvol->bdev, struct lvol_bdev, bdev); assert(lvol != NULL); spdk_bdev_alias_del_all(lvol->bdev); - spdk_lvol_close(lvol, _vbdev_lvol_unregister_cb, lvol->bdev); + spdk_lvol_close(lvol, _vbdev_lvol_unregister_cb, lvol_bdev); /* return 1 to indicate we have an operation that must finish asynchronously before the * lvol is closed @@ -924,6 +925,7 @@ static int _create_lvol_disk(struct spdk_lvol *lvol, bool destroy) { struct spdk_bdev *bdev; + struct lvol_bdev *lvol_bdev; struct lvol_store_bdev *lvs_bdev; uint64_t total_size; unsigned char *alias; @@ -935,12 +937,15 @@ _create_lvol_disk(struct spdk_lvol *lvol, bool destroy) return -ENODEV; } - bdev = calloc(1, sizeof(struct spdk_bdev)); - if (!bdev) { + lvol_bdev = calloc(1, sizeof(struct lvol_bdev)); + if (!lvol_bdev) { SPDK_ERRLOG("Cannot alloc memory for lvol bdev\n"); return -ENOMEM; } + lvol_bdev->lvol = lvol; + + bdev = &lvol_bdev->bdev; bdev->name = lvol->unique_id; bdev->product_name = "Logical Volume"; bdev->blocklen = spdk_bs_get_io_unit_size(lvol->lvol_store->blobstore); @@ -959,7 +964,7 @@ _create_lvol_disk(struct spdk_lvol *lvol, bool destroy) rc = spdk_bdev_register(bdev); if (rc) { - free(bdev); + free(lvol_bdev); return rc; } lvol->bdev = bdev; diff --git a/module/bdev/lvol/vbdev_lvol.h b/module/bdev/lvol/vbdev_lvol.h index 1004d4fc7..d59ba1668 100644 --- a/module/bdev/lvol/vbdev_lvol.h +++ b/module/bdev/lvol/vbdev_lvol.h @@ -47,6 +47,11 @@ struct lvol_store_bdev { TAILQ_ENTRY(lvol_store_bdev) lvol_stores; }; +struct lvol_bdev { + struct spdk_bdev bdev; + struct spdk_lvol *lvol; +}; + int vbdev_lvs_create(const char *base_bdev_name, const char *name, uint32_t cluster_sz, enum lvs_clear_method clear_method, spdk_lvs_op_with_handle_complete cb_fn, void *cb_arg); void vbdev_lvs_destruct(struct spdk_lvol_store *lvs, spdk_lvs_op_complete cb_fn, void *cb_arg);