[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 3/7] raw: support discard on block devices
From: |
Paolo Bonzini |
Subject: |
[Qemu-devel] [PATCH 3/7] raw: support discard on block devices |
Date: |
Mon, 14 Jan 2013 16:26:54 +0100 |
Block devices use a ioctl instead of fallocate, so add a separate
implementation.
Signed-off-by: Paolo Bonzini <address@hidden>
---
block/raw-posix.c | 36 ++++++++++++++++++++++++++++++++++++
1 file changed, 36 insertions(+)
diff --git a/block/raw-posix.c b/block/raw-posix.c
index b647cfb..1d32139 100644
--- a/block/raw-posix.c
+++ b/block/raw-posix.c
@@ -1345,6 +1345,40 @@ static BlockDriverAIOCB *hdev_aio_ioctl(BlockDriverState
*bs,
return thread_pool_submit_aio(aio_worker, acb, cb, opaque);
}
+static coroutine_fn int hdev_co_discard(BlockDriverState *bs,
+ int64_t sector_num, int nb_sectors)
+{
+ BDRVRawState *s = bs->opaque;
+ int ret;
+
+ if (s->has_discard == 0) {
+ return 0;
+ }
+ ret = fd_open(bs);
+ if (ret < 0) {
+ return ret;
+ }
+
+ ret = -EOPNOTSUPP;
+#ifdef BLKDISCARD
+ do {
+ uint64_t range[2] = { sector_num * 512, (uint64_t)nb_sectors * 512 };
+ if (ioctl(s->fd, BLKDISCARD, range) == 0) {
+ return 0;
+ }
+ } while (errno == EINTR);
+
+ ret = -errno;
+#endif
+ if (ret == -ENODEV || ret == -ENOSYS || ret == -EOPNOTSUPP ||
+ ret == -ENOTTY) {
+ s->has_discard = 0;
+ ret = 0;
+ }
+ return ret;
+
+}
+
#elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
static int fd_open(BlockDriverState *bs)
{
@@ -1413,6 +1447,8 @@ static BlockDriver bdrv_host_device = {
.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,
.bdrv_aio_flush = raw_aio_flush,
--
1.8.1
- [Qemu-devel] [PATCH resend 0/7] Discard improvements, Paolo Bonzini, 2013/01/14
- [Qemu-devel] [PATCH 1/7] raw-posix: support discard on more filesystems, Paolo Bonzini, 2013/01/14
- [Qemu-devel] [PATCH 2/7] raw-posix: remember whether discard failed, Paolo Bonzini, 2013/01/14
- [Qemu-devel] [PATCH 3/7] raw: support discard on block devices,
Paolo Bonzini <=
- [Qemu-devel] [PATCH 4/7] block: make discard asynchronous, Paolo Bonzini, 2013/01/14
- [Qemu-devel] [PATCH 5/7] ide: fix TRIM with empty range entry, Paolo Bonzini, 2013/01/14
- [Qemu-devel] [PATCH 6/7] ide: issue discard asynchronously but serialize the pieces, Paolo Bonzini, 2013/01/14
- [Qemu-devel] [PATCH 7/7] block: clear dirty bitmap when discarding, Paolo Bonzini, 2013/01/14
- Re: [Qemu-devel] [PATCH resend 0/7] Discard improvements, Stefan Hajnoczi, 2013/01/15