* [Qemu-devel] [PATCH] block/raw-posix.c: add BLKDISCARD support
@ 2011-11-11 20:56 e-t172
2011-11-14 14:08 ` Stefan Hajnoczi
0 siblings, 1 reply; 2+ messages in thread
From: e-t172 @ 2011-11-11 20:56 UTC (permalink / raw)
To: qemu-devel; +Cc: kwolf
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 <kwolf@redhat.com>
Signed-off-by: Etienne Dechamps <e-t172@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
^ permalink raw reply related [flat|nested] 2+ messages in thread
* Re: [Qemu-devel] [PATCH] block/raw-posix.c: add BLKDISCARD support
2011-11-11 20:56 [Qemu-devel] [PATCH] block/raw-posix.c: add BLKDISCARD support e-t172
@ 2011-11-14 14:08 ` Stefan Hajnoczi
0 siblings, 0 replies; 2+ messages in thread
From: Stefan Hajnoczi @ 2011-11-14 14:08 UTC (permalink / raw)
To: e-t172; +Cc: kwolf, qemu-devel
On Fri, Nov 11, 2011 at 8:56 PM, e-t172 <e-t172@akegroup.org> wrote:
> +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;
> +}
Is ioctl(BLKDISCARD) guaranteed non-blocking? I think we need to use
paio_ioctl() here instead to do this asynchronously.
Let's also be careful about Linux-specific ioctls. This code should
not poke an unsupported ioctl() on OSes which do not support
BLKDISCARD. We definitely need a plan when #if !defined(__linux__).
Stefan
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2011-11-14 14:08 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-11-11 20:56 [Qemu-devel] [PATCH] block/raw-posix.c: add BLKDISCARD support e-t172
2011-11-14 14:08 ` Stefan Hajnoczi
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.