提交 37cc9f7f 编写于 作者: D Denis V. Lunev 提交者: Kevin Wolf

block/raw-posix: refactor handle_aiocb_write_zeroes a bit

move code dealing with a block device to a separate function. This will
allow to implement additional processing for ordinary files.

Please 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.

CC: Kevin Wolf <kwolf@redhat.com>
CC: Stefan Hajnoczi <stefanha@redhat.com>
CC: Peter Lieven <pl@kamp.de>
CC: Fam Zheng <famz@redhat.com>
Signed-off-by: NDenis V. Lunev <den@openvz.org>
Reviewed-by: NMax Reitz <mreitz@redhat.com>
Signed-off-by: NKevin Wolf <kwolf@redhat.com>
上级 0b991712
...@@ -914,16 +914,15 @@ static int do_fallocate(int fd, int mode, off_t offset, off_t len) ...@@ -914,16 +914,15 @@ static int do_fallocate(int fd, int mode, off_t offset, off_t len)
} }
#endif #endif
static ssize_t handle_aiocb_write_zeroes(RawPosixAIOData *aiocb) static ssize_t handle_aiocb_write_zeroes_block(RawPosixAIOData *aiocb)
{ {
int ret = -EOPNOTSUPP; int ret = -ENOTSUP;
BDRVRawState *s = aiocb->bs->opaque; BDRVRawState *s = aiocb->bs->opaque;
if (s->has_write_zeroes == 0) { if (!s->has_write_zeroes) {
return -ENOTSUP; return -ENOTSUP;
} }
if (aiocb->aio_type & QEMU_AIO_BLKDEV) {
#ifdef BLKZEROOUT #ifdef BLKZEROOUT
do { do {
uint64_t range[2] = { aiocb->aio_offset, aiocb->aio_nbytes }; uint64_t range[2] = { aiocb->aio_offset, aiocb->aio_nbytes };
...@@ -932,21 +931,30 @@ static ssize_t handle_aiocb_write_zeroes(RawPosixAIOData *aiocb) ...@@ -932,21 +931,30 @@ static ssize_t handle_aiocb_write_zeroes(RawPosixAIOData *aiocb)
} }
} while (errno == EINTR); } while (errno == EINTR);
ret = -errno; ret = translate_err(-errno);
#endif #endif
} else {
if (ret == -ENOTSUP) {
s->has_write_zeroes = false;
}
return ret;
}
static ssize_t handle_aiocb_write_zeroes(RawPosixAIOData *aiocb)
{
BDRVRawState *s = aiocb->bs->opaque;
if (aiocb->aio_type & QEMU_AIO_BLKDEV) {
return handle_aiocb_write_zeroes_block(aiocb);
}
#ifdef CONFIG_XFS #ifdef CONFIG_XFS
if (s->is_xfs) { if (s->is_xfs) {
return xfs_write_zeroes(s, aiocb->aio_offset, aiocb->aio_nbytes); return xfs_write_zeroes(s, aiocb->aio_offset, aiocb->aio_nbytes);
} }
#endif #endif
}
ret = translate_err(ret); return -ENOTSUP;
if (ret == -ENOTSUP) {
s->has_write_zeroes = false;
}
return ret;
} }
static ssize_t handle_aiocb_discard(RawPosixAIOData *aiocb) static ssize_t handle_aiocb_discard(RawPosixAIOData *aiocb)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册