This adds ioctl(BLKDISCARD) (a.k.a "discard", "TRIM", "UNMAP", "hole punching") support for host devices. This is especially useful if the raw device is a SSD or some kind of thin-provisioned device.
Cc: Kevin Wolf <kw...@redhat.com> Signed-off-by: Etienne Dechamps <e-t...@akegroup.org> --- block/raw-posix.c | 20 ++++++++++++++++++++ 1 files changed, 20 insertions(+), 0 deletions(-) diff --git a/block/raw-posix.c b/block/raw-posix.c index a3de373..d6eac66 100644 --- a/block/raw-posix.c +++ b/block/raw-posix.c @@ -104,6 +104,10 @@ #define O_DIRECT O_DSYNC #endif +#ifndef BLKDISCARD +#define BLKDISCARD _IO(0x12, 119) +#endif + #define FTYPE_FILE 0 #define FTYPE_CD 1 #define FTYPE_FD 2 @@ -892,6 +896,21 @@ static int hdev_has_zero_init(BlockDriverState *bs) return 0; } +static int hdev_co_discard(BlockDriverState *bs, int64_t sector_num, + int nb_sectors) +{ + BDRVRawState *s = bs->opaque; + int fd = s->fd; + uint64_t range[2]; + + range[0] = sector_num << 9; + range[1] = nb_sectors << 9; + if (ioctl(fd, BLKDISCARD, &range)) { + return -errno; + } + return 0; +} + static BlockDriver bdrv_host_device = { .format_name = "host_device", .protocol_name = "host_device", @@ -902,6 +921,7 @@ static BlockDriver bdrv_host_device = { .bdrv_create = hdev_create, .create_options = raw_create_options, .bdrv_has_zero_init = hdev_has_zero_init, + .bdrv_co_discard = hdev_co_discard, .bdrv_aio_readv = raw_aio_readv, .bdrv_aio_writev = raw_aio_writev, -- 1.7.7.1 -- Etienne Dechamps / e-t172 - AKE Group Phone: +33 6 23 42 24 82