From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:53133) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Y417G-0007j8-MV for qemu-devel@nongnu.org; Thu, 25 Dec 2014 00:37:46 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Y4171-00042P-IE for qemu-devel@nongnu.org; Thu, 25 Dec 2014 00:37:42 -0500 Received: from mailhub.sw.ru ([195.214.232.25]:16955 helo=relay.sw.ru) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Y4171-00042I-7i for qemu-devel@nongnu.org; Thu, 25 Dec 2014 00:37:27 -0500 From: "Denis V. Lunev" Date: Thu, 25 Dec 2014 08:37:29 +0300 Message-Id: <1419485850-21455-2-git-send-email-den@openvz.org> In-Reply-To: <1419485850-21455-1-git-send-email-den@openvz.org> References: <1419485850-21455-1-git-send-email-den@openvz.org> Subject: [Qemu-devel] [PATCH 1/2] block: use fallocate(FALLOC_FL_ZERO_RANGE) in handle_aiocb_write_zeroes List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Kevin Wolf , "Denis V. Lunev" , qemu-devel@nongnu.org, Stefan Hajnoczi this efficiently writes zeroes in the middle of the file on Linux systems if the kernel is capable enough. Signed-off-by: Denis V. Lunev CC: Kevin Wolf CC: Stefan Hajnoczi --- block/raw-posix.c | 11 +++++++++++ configure | 19 +++++++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/block/raw-posix.c b/block/raw-posix.c index e51293a..9e66cb7 100644 --- a/block/raw-posix.c +++ b/block/raw-posix.c @@ -919,6 +919,17 @@ static ssize_t handle_aiocb_write_zeroes(RawPosixAIOData *aiocb) return xfs_write_zeroes(s, aiocb->aio_offset, aiocb->aio_nbytes); } #endif + +#ifdef CONFIG_FALLOCATE_ZERO_RANGE + do { + if (fallocate(s->fd, CONFIG_FALLOCATE_ZERO_RANGE, + aiocb->aio_offset, aiocb->aio_nbytes) == 0) { + return 0; + } + } while (errno == EINTR); + + ret = -errno; +#endif } if (ret == -ENODEV || ret == -ENOSYS || ret == -EOPNOTSUPP || diff --git a/configure b/configure index cae588c..dfcf7b3 100755 --- a/configure +++ b/configure @@ -3309,6 +3309,22 @@ if compile_prog "" "" ; then fallocate_punch_hole=yes fi +# check that fallocate supports range zeroing inside the file +fallocate_zero_range=no +cat > $TMPC << EOF +#include +#include + +int main(void) +{ + fallocate(0, FALLOC_FL_ZERO_RANGE, 0, 0); + return 0; +} +EOF +if compile_prog "" "" ; then + fallocate_zero_range=yes +fi + # check for posix_fallocate posix_fallocate=no cat > $TMPC << EOF @@ -4538,6 +4554,9 @@ fi if test "$fallocate_punch_hole" = "yes" ; then echo "CONFIG_FALLOCATE_PUNCH_HOLE=y" >> $config_host_mak fi +if test "$fallocate_zero_range" = "yes" ; then + echo "CONFIG_FALLOCATE_ZERO_RANGE=y" >> $config_host_mak +fi if test "$posix_fallocate" = "yes" ; then echo "CONFIG_POSIX_FALLOCATE=y" >> $config_host_mak fi -- 1.9.1