Commit 1efd9cfa authored by Jim Harris's avatar Jim Harris Committed by Daniel Verkamp
Browse files

lvol: delete super blob in spdk_lvs_destroy



If we don't delete the super blob, this blob structure
will leak.

Signed-off-by: default avatarJim Harris <james.r.harris@intel.com>
Change-Id: I56d0ca4884846aee0c7865f9c600d6c43811373c

Reviewed-on: https://review.gerrithub.io/383311


Reviewed-by: default avatarDaniel Verkamp <daniel.verkamp@intel.com>
Reviewed-by: default avatarTomasz Zawadzki <tomasz.zawadzki@intel.com>
Tested-by: default avatarSPDK Automated Test System <sys_sgsw@intel.com>
Reviewed-by: default avatarZiye Yang <optimistyzy@gmail.com>
parent 7d8fe2ca
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -62,6 +62,13 @@ struct spdk_lvs_with_handle_req {
	struct spdk_bdev		*base_bdev;
};

struct spdk_lvs_destroy_req {
	spdk_lvs_op_complete    cb_fn;
	void                    *cb_arg;
	struct spdk_lvol_store	*lvs;
	bool			unmap_device;
};

struct spdk_lvol_with_handle_req {
	spdk_lvol_op_with_handle_complete cb_fn;
	void				*cb_arg;
+19 −5
Original line number Diff line number Diff line
@@ -597,7 +597,7 @@ _spdk_lvs_destruct_cb(void *cb_arg, int lvserrno)
static void
_lvs_destroy_cb(void *cb_arg, int lvserrno)
{
	struct spdk_lvs_req *lvs_req = cb_arg;
	struct spdk_lvs_destroy_req *lvs_req = cb_arg;

	SPDK_INFOLOG(SPDK_TRACE_LVOL, "Lvol store destroyed\n");
	assert(lvs_req->cb_fn != NULL);
@@ -605,11 +605,24 @@ _lvs_destroy_cb(void *cb_arg, int lvserrno)
	free(lvs_req);
}

static void
_lvs_destroy_super_cb(void *cb_arg, int bserrno)
{
	struct spdk_lvs_destroy_req *lvs_req = cb_arg;
	struct spdk_lvol_store *lvs = lvs_req->lvs;

	assert(lvs != NULL);

	SPDK_INFOLOG(SPDK_TRACE_LVOL, "Destroying lvol store\n");
	spdk_bs_destroy(lvs->blobstore, lvs_req->unmap_device, _lvs_destroy_cb, lvs_req);
	_spdk_lvs_free(lvs);
}

int
spdk_lvs_destroy(struct spdk_lvol_store *lvs, bool unmap_device, spdk_lvs_op_complete cb_fn,
		 void *cb_arg)
{
	struct spdk_lvs_req *lvs_req;
	struct spdk_lvs_destroy_req *lvs_req;
	struct spdk_lvol *iter_lvol, *tmp;

	if (lvs == NULL) {
@@ -637,10 +650,11 @@ spdk_lvs_destroy(struct spdk_lvol_store *lvs, bool unmap_device, spdk_lvs_op_com

	lvs_req->cb_fn = cb_fn;
	lvs_req->cb_arg = cb_arg;
	lvs_req->lvs = lvs;
	lvs_req->unmap_device = unmap_device;

	SPDK_INFOLOG(SPDK_TRACE_LVOL, "Destroying lvol store\n");
	spdk_bs_destroy(lvs->blobstore, unmap_device, _lvs_destroy_cb, lvs_req);
	_spdk_lvs_free(lvs);
	SPDK_INFOLOG(SPDK_TRACE_LVOL, "Deleting super blob\n");
	spdk_bs_md_delete_blob(lvs->blobstore, lvs->super_blob_id, _lvs_destroy_super_cb, lvs_req);

	return 0;
}