diff --git a/lib/bdev/ocf/dobj.c b/lib/bdev/ocf/dobj.c index 02ce67e4d..35d3499d7 100644 --- a/lib/bdev/ocf/dobj.c +++ b/lib/bdev/ocf/dobj.c @@ -372,8 +372,21 @@ vbdev_ocf_dobj_submit_io(struct ocf_io *io) static void vbdev_ocf_dobj_submit_discard(struct ocf_io *io) { - /* TODO [unmap support] */ - io->end(io, 0); + struct vbdev_ocf_base *base = ocf_data_obj_get_priv(io->obj); + struct ocf_io_ctx *io_ctx = ocf_get_io_ctx(io); + int status = 0; + + prepare_submit(io); + + status = spdk_bdev_unmap( + base->desc, io_ctx->ch, + io->addr, io->bytes, + vbdev_ocf_dobj_submit_io_cb, io); + if (status) { + /* Since callback is not called, we need to do it manually to free io structures */ + SPDK_ERRLOG("Submission failed with status=%d\n", status); + vbdev_ocf_dobj_submit_io_cb(NULL, false, io); + } } static void diff --git a/lib/bdev/ocf/vbdev_ocf.c b/lib/bdev/ocf/vbdev_ocf.c index 87a8b80bf..86df44b6d 100644 --- a/lib/bdev/ocf/vbdev_ocf.c +++ b/lib/bdev/ocf/vbdev_ocf.c @@ -266,6 +266,8 @@ io_submit_to_ocf(struct spdk_bdev_io *bdev_io, struct ocf_io *io) ocf_io_configure(io, offset, len, OCF_WRITE, 0, OCF_WRITE_FLUSH); return ocf_submit_flush(io); case SPDK_BDEV_IO_TYPE_UNMAP: + ocf_io_configure(io, offset, len, 0, 0, 0); + return ocf_submit_discard(io); case SPDK_BDEV_IO_TYPE_RESET: case SPDK_BDEV_IO_TYPE_WRITE_ZEROES: default: @@ -337,9 +339,9 @@ vbdev_ocf_submit_request(struct spdk_io_channel *ch, struct spdk_bdev_io *bdev_i break; case SPDK_BDEV_IO_TYPE_WRITE: case SPDK_BDEV_IO_TYPE_FLUSH: + case SPDK_BDEV_IO_TYPE_UNMAP: io_handle(ch, bdev_io); break; - case SPDK_BDEV_IO_TYPE_UNMAP: case SPDK_BDEV_IO_TYPE_RESET: case SPDK_BDEV_IO_TYPE_WRITE_ZEROES: default: @@ -359,8 +361,8 @@ vbdev_ocf_io_type_supported(void *opaque, enum spdk_bdev_io_type io_type) case SPDK_BDEV_IO_TYPE_READ: case SPDK_BDEV_IO_TYPE_WRITE: case SPDK_BDEV_IO_TYPE_FLUSH: - return spdk_bdev_io_type_supported(vbdev->core.bdev, io_type); case SPDK_BDEV_IO_TYPE_UNMAP: + return spdk_bdev_io_type_supported(vbdev->core.bdev, io_type); case SPDK_BDEV_IO_TYPE_RESET: case SPDK_BDEV_IO_TYPE_WRITE_ZEROES: default: