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 <d...@openvz.org> CC: Kevin Wolf <kw...@redhat.com> CC: Stefan Hajnoczi <stefa...@redhat.com> --- 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 <fcntl.h> +#include <linux/falloc.h> + +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