Commit 37cc9f7f authored by Denis V. Lunev's avatar Denis V. Lunev Committed by Kevin Wolf
Browse files

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: default avatarDenis V. Lunev <den@openvz.org>
Reviewed-by: default avatarMax Reitz <mreitz@redhat.com>
Signed-off-by: default avatarKevin Wolf <kwolf@redhat.com>
parent 0b991712
Loading
Loading
Loading
Loading
+27 −19
Original line number Diff line number Diff line
@@ -914,16 +914,15 @@ 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;
    int ret = -ENOTSUP;
    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 };
@@ -932,21 +931,30 @@ static ssize_t handle_aiocb_write_zeroes(RawPosixAIOData *aiocb)
        }
    } while (errno == EINTR);

        ret = -errno;
    ret = translate_err(-errno);
#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
    if (s->is_xfs) {
        return xfs_write_zeroes(s, aiocb->aio_offset, aiocb->aio_nbytes);
    }
#endif
    }

    ret = translate_err(ret);
    if (ret == -ENOTSUP) {
        s->has_write_zeroes = false;
    }
    return ret;
    return -ENOTSUP;
}

static ssize_t handle_aiocb_discard(RawPosixAIOData *aiocb)