[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH 2/2] block: use fallocate(FALLOC_FL_PUNCH_HOLE)
From: |
Roman Kagan |
Subject: |
Re: [Qemu-devel] [PATCH 2/2] block: use fallocate(FALLOC_FL_PUNCH_HOLE) & fallocate(0) to write zeroes |
Date: |
Fri, 26 Dec 2014 12:25:48 +0300 |
User-agent: |
Mutt/1.5.23 (2014-03-12) |
On Thu, Dec 25, 2014 at 08:37:30AM +0300, Denis V. Lunev wrote:
> 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 <address@hidden>
> CC: Kevin Wolf <address@hidden>
> CC: Stefan Hajnoczi <address@hidden>
> ---
> 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
This is suboptimal in that fallocate(FALLOC_FL_ZERO_RANGE) would always
be called in vain for such systems. Might be worth another flag in
BDRVRawState?
Roman.