From: Stefan Hajnoczi <stefanha@redhat.com>
To: qemu-devel@nongnu.org
Cc: Anthony Liguori <aliguori@us.ibm.com>,
Kusanagi Kouichi <slash@ac.auone-net.jp>,
Stefan Hajnoczi <stefanha@redhat.com>
Subject: [Qemu-devel] [PATCH 03/15] raw-posix: support discard on more filesystems
Date: Tue, 15 Jan 2013 17:48:19 +0100 [thread overview]
Message-ID: <1358268511-27061-4-git-send-email-stefanha@redhat.com> (raw)
In-Reply-To: <1358268511-27061-1-git-send-email-stefanha@redhat.com>
From: Kusanagi Kouichi <slash@ac.auone-net.jp>
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 <slash@ac.auone-net.jp>
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
---
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 c908f66..40d250c 100755
--- a/configure
+++ b/configure
@@ -2581,6 +2581,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
@@ -3490,6 +3506,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.0.2
next prev parent reply other threads:[~2013-01-15 16:49 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-01-15 16:48 [Qemu-devel] [PULL 00/15] Block patches for QEMU 1.4 Stefan Hajnoczi
2013-01-15 16:48 ` [Qemu-devel] [PATCH 01/15] qcow2: Fix segfault on zero-length write Stefan Hajnoczi
2013-01-15 16:48 ` [Qemu-devel] [PATCH 02/15] block: fix initialization in bdrv_io_limits_enable() Stefan Hajnoczi
2013-01-15 16:48 ` Stefan Hajnoczi [this message]
2013-01-15 16:48 ` [Qemu-devel] [PATCH 04/15] raw-posix: remember whether discard failed Stefan Hajnoczi
2013-01-15 16:48 ` [Qemu-devel] [PATCH 05/15] raw: support discard on block devices Stefan Hajnoczi
2013-01-15 16:48 ` [Qemu-devel] [PATCH 06/15] block: make discard asynchronous Stefan Hajnoczi
2013-01-15 16:48 ` [Qemu-devel] [PATCH 07/15] ide: fix TRIM with empty range entry Stefan Hajnoczi
2013-01-15 16:48 ` [Qemu-devel] [PATCH 08/15] ide: issue discard asynchronously but serialize the pieces Stefan Hajnoczi
2013-01-15 16:48 ` [Qemu-devel] [PATCH 09/15] block: clear dirty bitmap when discarding Stefan Hajnoczi
2013-01-15 16:48 ` [Qemu-devel] [PATCH 10/15] sheepdog: multiplex the rw FD to flush cache Stefan Hajnoczi
2013-01-15 16:48 ` [Qemu-devel] [PATCH 11/15] sheepdog: clean up sd_aio_setup() Stefan Hajnoczi
2013-01-15 16:48 ` [Qemu-devel] [PATCH 12/15] w32: Make qemu_vfree() accept NULL like the POSIX implementation Stefan Hajnoczi
2013-01-15 16:48 ` [Qemu-devel] [PATCH 13/15] scsi-disk: qemu_vfree(NULL) is fine, simplify Stefan Hajnoczi
2013-01-15 16:48 ` [Qemu-devel] [PATCH 14/15] win32-aio: Fix how win32_aio_process_completion() frees buffer Stefan Hajnoczi
2013-01-15 16:48 ` [Qemu-devel] [PATCH 15/15] block: Fix how mirror_run() frees its buffer Stefan Hajnoczi
2013-01-16 1:18 ` [Qemu-devel] [PULL 00/15] Block patches for QEMU 1.4 Anthony Liguori
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1358268511-27061-4-git-send-email-stefanha@redhat.com \
--to=stefanha@redhat.com \
--cc=aliguori@us.ibm.com \
--cc=qemu-devel@nongnu.org \
--cc=slash@ac.auone-net.jp \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).