Commit d01c07f2 authored by Fam Zheng's avatar Fam Zheng Committed by Stefan Hajnoczi
Browse files

Revert "block: Fix unaligned zero write"



This reverts commit fc3959e4.

The core write code already handles the case, so remove this
duplication.

Because commit 61007b31 moved the touched code from block.c to
block/io.c, the change is manually reverted.

Signed-off-by: default avatarFam Zheng <famz@redhat.com>
Reviewed-by: default avatarStefan Hajnoczi <stefanha@redhat.com>
Reviewed-by: default avatarKevin Wolf <kwolf@redhat.com>
Message-id: 1431522721-3266-2-git-send-email-famz@redhat.com
Signed-off-by: default avatarStefan Hajnoczi <stefanha@redhat.com>
parent 459b4e66
Loading
Loading
Loading
Loading
+6 −39
Original line number Diff line number Diff line
@@ -934,19 +934,6 @@ out:
    return ret;
}

static inline uint64_t bdrv_get_align(BlockDriverState *bs)
{
    /* TODO Lift BDRV_SECTOR_SIZE restriction in BlockDriver interface */
    return MAX(BDRV_SECTOR_SIZE, bs->request_alignment);
}

static inline bool bdrv_req_is_aligned(BlockDriverState *bs,
                                       int64_t offset, size_t bytes)
{
    int64_t align = bdrv_get_align(bs);
    return !(offset & (align - 1) || (bytes & (align - 1)));
}

/*
 * Handle a read request in coroutine context
 */
@@ -957,7 +944,8 @@ static int coroutine_fn bdrv_co_do_preadv(BlockDriverState *bs,
    BlockDriver *drv = bs->drv;
    BdrvTrackedRequest req;

    uint64_t align = bdrv_get_align(bs);
    /* TODO Lift BDRV_SECTOR_SIZE restriction in BlockDriver interface */
    uint64_t align = MAX(BDRV_SECTOR_SIZE, bs->request_alignment);
    uint8_t *head_buf = NULL;
    uint8_t *tail_buf = NULL;
    QEMUIOVector local_qiov;
@@ -1199,7 +1187,8 @@ static int coroutine_fn bdrv_co_do_pwritev(BlockDriverState *bs,
    BdrvRequestFlags flags)
{
    BdrvTrackedRequest req;
    uint64_t align = bdrv_get_align(bs);
    /* TODO Lift BDRV_SECTOR_SIZE restriction in BlockDriver interface */
    uint64_t align = MAX(BDRV_SECTOR_SIZE, bs->request_alignment);
    uint8_t *head_buf = NULL;
    uint8_t *tail_buf = NULL;
    QEMUIOVector local_qiov;
@@ -1298,10 +1287,6 @@ static int coroutine_fn bdrv_co_do_pwritev(BlockDriverState *bs,
        bytes = ROUND_UP(bytes, align);
    }

    if (use_local_qiov) {
        /* Local buffer may have non-zero data. */
        flags &= ~BDRV_REQ_ZERO_WRITE;
    }
    ret = bdrv_aligned_pwritev(bs, &req, offset, bytes,
                               use_local_qiov ? &local_qiov : qiov,
                               flags);
@@ -1342,32 +1327,14 @@ int coroutine_fn bdrv_co_write_zeroes(BlockDriverState *bs,
                                      int64_t sector_num, int nb_sectors,
                                      BdrvRequestFlags flags)
{
    int ret;

    trace_bdrv_co_write_zeroes(bs, sector_num, nb_sectors, flags);

    if (!(bs->open_flags & BDRV_O_UNMAP)) {
        flags &= ~BDRV_REQ_MAY_UNMAP;
    }
    if (bdrv_req_is_aligned(bs, sector_num << BDRV_SECTOR_BITS,
                            nb_sectors << BDRV_SECTOR_BITS)) {
        ret = bdrv_co_do_writev(bs, sector_num, nb_sectors, NULL,
                                BDRV_REQ_ZERO_WRITE | flags);
    } else {
        uint8_t *buf;
        QEMUIOVector local_qiov;
        size_t bytes = nb_sectors << BDRV_SECTOR_BITS;

        buf = qemu_memalign(bdrv_opt_mem_align(bs), bytes);
        memset(buf, 0, bytes);
        qemu_iovec_init(&local_qiov, 1);
        qemu_iovec_add(&local_qiov, buf, bytes);

        ret = bdrv_co_do_writev(bs, sector_num, nb_sectors, &local_qiov,
    return bdrv_co_do_writev(bs, sector_num, nb_sectors, NULL,
                             BDRV_REQ_ZERO_WRITE | flags);
        qemu_vfree(buf);
    }
    return ret;
}

int bdrv_flush_all(void)