diff --git a/module/bdev/ocf/vbdev_ocf.c b/module/bdev/ocf/vbdev_ocf.c index 95a94fbe3..35396f102 100644 --- a/module/bdev/ocf/vbdev_ocf.c +++ b/module/bdev/ocf/vbdev_ocf.c @@ -730,6 +730,9 @@ vbdev_ocf_ctx_queue_stop(ocf_queue_t q) spdk_put_io_channel(qctx->cache_ch); spdk_put_io_channel(qctx->core_ch); spdk_poller_unregister(&qctx->poller); + if (qctx->allocated) { + free(qctx); + } } } @@ -779,6 +782,7 @@ io_device_destroy_cb(void *io_device, void *ctx_buf) memcpy(copy, qctx, sizeof(*copy)); spdk_poller_unregister(&qctx->poller); copy->poller = spdk_poller_register(queue_poll, copy, 0); + copy->allocated = true; } else { SPDK_ERRLOG("Unable to stop OCF queue properly: %s\n", spdk_strerror(ENOMEM)); diff --git a/module/bdev/ocf/vbdev_ocf.h b/module/bdev/ocf/vbdev_ocf.h index 0b952bd5a..a5e81970b 100644 --- a/module/bdev/ocf/vbdev_ocf.h +++ b/module/bdev/ocf/vbdev_ocf.h @@ -55,6 +55,8 @@ struct vbdev_ocf_qcxt { /* Base devices channels */ struct spdk_io_channel *cache_ch; struct spdk_io_channel *core_ch; + /* If true, we have to free this context on queue stop */ + bool allocated; /* Link to per-bdev list of queue contexts */ TAILQ_ENTRY(vbdev_ocf_qcxt) tailq; };