From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:53126) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Y4176-0007Sr-As for qemu-devel@nongnu.org; Thu, 25 Dec 2014 00:37:33 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Y4172-00042e-Jo for qemu-devel@nongnu.org; Thu, 25 Dec 2014 00:37:32 -0500 Received: from mailhub.sw.ru ([195.214.232.25]:37702 helo=relay.sw.ru) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Y4172-00042Y-8h for qemu-devel@nongnu.org; Thu, 25 Dec 2014 00:37:28 -0500 From: "Denis V. Lunev" Date: Thu, 25 Dec 2014 08:37:30 +0300 Message-Id: <1419485850-21455-3-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 2/2] block: use fallocate(FALLOC_FL_PUNCH_HOLE) & fallocate(0) to 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 sequence works efficiently if FALLOC_FL_ZERO_RANGE is not supported. The idea is that FALLOC_FL_PUNCH_HOLE could not increase file size but it cleans already allocated blocks inside the file. If we have to create something new, simple fallocate will do the job. This should increase performance a bit for not-so-modern kernels or for filesystems which do not support FALLOC_FL_ZERO_RANGE. Signed-off-by: Denis V. Lunev CC: Kevin Wolf CC: Stefan Hajnoczi --- block/raw-posix.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/block/raw-posix.c b/block/raw-posix.c index 9e66cb7..60972a1 100644 --- a/block/raw-posix.c +++ b/block/raw-posix.c @@ -930,6 +930,18 @@ static ssize_t handle_aiocb_write_zeroes(RawPosixAIOData *aiocb) ret = -errno; #endif +#ifdef CONFIG_FALLOCATE_PUNCH_HOLE + do { + if (fallocate(s->fd, FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE, + aiocb->aio_offset, aiocb->aio_nbytes) == 0 && + fallocate(s->fd, 0, + aiocb->aio_offset, aiocb->aio_nbytes) == 0) { + return 0; + } + } while (errno == EINTR); + + ret = -errno; +#endif } if (ret == -ENODEV || ret == -ENOSYS || ret == -EOPNOTSUPP || -- 1.9.1