[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 1/7] raw-posix: support discard on more filesystems
From: |
Paolo Bonzini |
Subject: |
[Qemu-devel] [PATCH 1/7] raw-posix: support discard on more filesystems |
Date: |
Mon, 14 Jan 2013 16:26:52 +0100 |
From: Kusanagi Kouichi <address@hidden>
Linux 2.6.38 introduced the filesystem independent interface to
deallocate part of a file. As of Linux 3.7, btrfs, ext4, ocfs2,
tmpfs and xfs support it.
Even though the system calls here are in practice issued on Linux,
the code is structured to allow plugging in alternatives for other Unix
variants. EOPNOTSUPP is used unconditionally in this patch, but it is
supported in both OpenBSD and Mac OS X since forever (see for example
http://lists.debian.org/debian-glibc/2006/02/msg00337.html).
Signed-off-by: Kusanagi Kouichi <address@hidden>
---
block/raw-posix.c | 26 ++++++++++++++++++++++++--
configure | 19 +++++++++++++++++++
2 files changed, 43 insertions(+), 2 deletions(-)
diff --git a/block/raw-posix.c b/block/raw-posix.c
index c3d7fda..e8d79af 100644
--- a/block/raw-posix.c
+++ b/block/raw-posix.c
@@ -59,6 +59,9 @@
#ifdef CONFIG_FIEMAP
#include <linux/fiemap.h>
#endif
+#ifdef CONFIG_FALLOCATE_PUNCH_HOLE
+#include <linux/falloc.h>
+#endif
#if defined (__FreeBSD__) || defined(__FreeBSD_kernel__)
#include <sys/disk.h>
#include <sys/cdio.h>
@@ -1074,15 +1077,34 @@ static int xfs_discard(BDRVRawState *s, int64_t
sector_num, int nb_sectors)
static coroutine_fn int raw_co_discard(BlockDriverState *bs,
int64_t sector_num, int nb_sectors)
{
-#ifdef CONFIG_XFS
+ int ret = -EOPNOTSUPP;
+
+#if defined(CONFIG_FALLOCATE_PUNCH_HOLE) || defined(CONFIG_XFS)
BDRVRawState *s = bs->opaque;
+#ifdef CONFIG_XFS
if (s->is_xfs) {
return xfs_discard(s, sector_num, nb_sectors);
}
#endif
- return 0;
+#ifdef CONFIG_FALLOCATE_PUNCH_HOLE
+ do {
+ if (fallocate(s->fd, FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE,
+ sector_num << BDRV_SECTOR_BITS,
+ (int64_t)nb_sectors << BDRV_SECTOR_BITS) == 0) {
+ return 0;
+ }
+ } while (errno == EINTR);
+
+ ret = -errno;
+#endif
+#endif
+
+ if (ret == -EOPNOTSUPP) {
+ return 0;
+ }
+ return ret;
}
static QEMUOptionParameter raw_create_options[] = {
diff --git a/configure b/configure
index ea42fe2..94059a6 100755
--- a/configure
+++ b/configure
@@ -2586,6 +2586,22 @@ if compile_prog "" "" ; then
fallocate=yes
fi
+# check for fallocate hole punching
+fallocate_punch_hole=no
+cat > $TMPC << EOF
+#include <fcntl.h>
+#include <linux/falloc.h>
+
+int main(void)
+{
+ fallocate(0, FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE, 0, 0);
+ return 0;
+}
+EOF
+if compile_prog "" "" ; then
+ fallocate_punch_hole=yes
+fi
+
# check for sync_file_range
sync_file_range=no
cat > $TMPC << EOF
@@ -3501,6 +3517,9 @@ fi
if test "$fallocate" = "yes" ; then
echo "CONFIG_FALLOCATE=y" >> $config_host_mak
fi
+if test "$fallocate_punch_hole" = "yes" ; then
+ echo "CONFIG_FALLOCATE_PUNCH_HOLE=y" >> $config_host_mak
+fi
if test "$sync_file_range" = "yes" ; then
echo "CONFIG_SYNC_FILE_RANGE=y" >> $config_host_mak
fi
--
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 <=
- [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, 2013/01/14
- [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