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: Denis V. Lunev <den@openvz.org> Reviewed-by: Max Reitz <mreitz@redhat.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
parent
0b99171230
commit
37cc9f7f68
@ -914,41 +914,49 @@ 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 };
|
||||||
if (ioctl(aiocb->aio_fildes, BLKZEROOUT, range) == 0) {
|
if (ioctl(aiocb->aio_fildes, BLKZEROOUT, range) == 0) {
|
||||||
return 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);
|
|
||||||
}
|
}
|
||||||
#endif
|
} while (errno == EINTR);
|
||||||
}
|
|
||||||
|
ret = translate_err(-errno);
|
||||||
|
#endif
|
||||||
|
|
||||||
ret = translate_err(ret);
|
|
||||||
if (ret == -ENOTSUP) {
|
if (ret == -ENOTSUP) {
|
||||||
s->has_write_zeroes = false;
|
s->has_write_zeroes = false;
|
||||||
}
|
}
|
||||||
return ret;
|
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
|
||||||
|
if (s->is_xfs) {
|
||||||
|
return xfs_write_zeroes(s, aiocb->aio_offset, aiocb->aio_nbytes);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return -ENOTSUP;
|
||||||
|
}
|
||||||
|
|
||||||
static ssize_t handle_aiocb_discard(RawPosixAIOData *aiocb)
|
static ssize_t handle_aiocb_discard(RawPosixAIOData *aiocb)
|
||||||
{
|
{
|
||||||
int ret = -EOPNOTSUPP;
|
int ret = -EOPNOTSUPP;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user