From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:43902) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Y4U6t-0001Hr-VS for qemu-devel@nongnu.org; Fri, 26 Dec 2014 07:35:16 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Y4U6p-0001px-1N for qemu-devel@nongnu.org; Fri, 26 Dec 2014 07:35:15 -0500 Received: from mailhub.sw.ru ([195.214.232.25]:6294 helo=relay.sw.ru) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Y4U6o-0001pH-JT for qemu-devel@nongnu.org; Fri, 26 Dec 2014 07:35:10 -0500 From: "Denis V. Lunev" Date: Fri, 26 Dec 2014 15:35:11 +0300 Message-Id: <1419597313-20514-6-git-send-email-den@openvz.org> In-Reply-To: <1419597313-20514-1-git-send-email-den@openvz.org> References: <1419597313-20514-1-git-send-email-den@openvz.org> Subject: [Qemu-devel] [PATCH 5/7] block/raw-posix: refactor handle_aiocb_write_zeroes a bit List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Kevin Wolf , "Denis V. Lunev" , qemu-devel@nongnu.org, Stefan Hajnoczi move code dealing with a block device to a separate function. This will allow to implement additional processing for an ordinary files. Pls note, that xfs_code has been moved before checking for s->has_write_zeroes as xfs_write_zeroes does not touch this flag inside. This makes code a bit more consistent. Signed-off-by: Denis V. Lunev CC: Kevin Wolf CC: Stefan Hajnoczi --- block/raw-posix.c | 60 +++++++++++++++++++++++++++++++++++-------------------- 1 file changed, 38 insertions(+), 22 deletions(-) diff --git a/block/raw-posix.c b/block/raw-posix.c index 25a6947..7866d31 100644 --- a/block/raw-posix.c +++ b/block/raw-posix.c @@ -915,46 +915,62 @@ static int do_fallocate(int fd, int mode, off_t offset, off_t len) } #endif -static ssize_t handle_aiocb_write_zeroes(RawPosixAIOData *aiocb) +static ssize_t handle_aiocb_write_zeroes_block(RawPosixAIOData *aiocb) { int ret = -EOPNOTSUPP; BDRVRawState *s = aiocb->bs->opaque; - if (s->has_write_zeroes == 0) { + if (!s->has_write_zeroes) { return -ENOTSUP; } - if (aiocb->aio_type & QEMU_AIO_BLKDEV) { #ifdef BLKZEROOUT - do { - uint64_t range[2] = { aiocb->aio_offset, aiocb->aio_nbytes }; - if (ioctl(aiocb->aio_fildes, BLKZEROOUT, range) == 0) { - return 0; - } - } while (errno == EINTR); - - ret = -errno; -#endif - } else { -#ifdef CONFIG_XFS - if (s->is_xfs) { - return xfs_write_zeroes(s, aiocb->aio_offset, aiocb->aio_nbytes); + do { + uint64_t range[2] = { aiocb->aio_offset, aiocb->aio_nbytes }; + if (ioctl(aiocb->aio_fildes, BLKZEROOUT, range) == 0) { + return 0; } -#endif + } while (errno == EINTR); -#ifdef CONFIG_FALLOCATE_ZERO_RANGE - ret = do_fallocate(s->fd, FALLOC_FL_ZERO_RANGE, - aiocb->aio_offset, aiocb->aio_nbytes); + ret = translate_err(-errno); #endif - } - ret = translate_err(ret); if (ret == -ENOTSUP) { s->has_write_zeroes = false; } return ret; } +static ssize_t handle_aiocb_write_zeroes(RawPosixAIOData *aiocb) +{ + BDRVRawState *s; + + if (aiocb->aio_type & QEMU_AIO_BLKDEV) { + return handle_aiocb_write_zeroes_block(aiocb); + } + +#ifdef CONFIG_XFS + if (s->is_xfs) { + return xfs_write_zeroes(s, aiocb->aio_offset, aiocb->aio_nbytes); + } +#endif + + s = aiocb->bs->opaque; + +#ifdef CONFIG_FALLOCATE_ZERO_RANGE + if (s->has_write_zeroes) { + int ret = do_fallocate(s->fd, FALLOC_FL_ZERO_RANGE, + aiocb->aio_offset, aiocb->aio_nbytes); + if (ret == 0 && ret != -ENOTSUP) { + return ret; + } + } +#endif + + s->has_write_zeroes = false; + return -ENOTSUP; +} + static ssize_t handle_aiocb_discard(RawPosixAIOData *aiocb) { int ret = -EOPNOTSUPP; -- 1.9.1