mirror of https://gitee.com/openkylin/qemu.git
Revert "block: Fix unaligned zero write"
This reverts commitfc3959e466
. The core write code already handles the case, so remove this duplication. Because commit61007b316
moved the touched code from block.c to block/io.c, the change is manually reverted. Signed-off-by: Fam Zheng <famz@redhat.com> Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com> Reviewed-by: Kevin Wolf <kwolf@redhat.com> Message-id: 1431522721-3266-2-git-send-email-famz@redhat.com Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
This commit is contained in:
parent
459b4e6612
commit
d01c07f222
45
block/io.c
45
block/io.c
|
@ -934,19 +934,6 @@ out:
|
||||||
return ret;
|
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
|
* 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;
|
BlockDriver *drv = bs->drv;
|
||||||
BdrvTrackedRequest req;
|
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 *head_buf = NULL;
|
||||||
uint8_t *tail_buf = NULL;
|
uint8_t *tail_buf = NULL;
|
||||||
QEMUIOVector local_qiov;
|
QEMUIOVector local_qiov;
|
||||||
|
@ -1199,7 +1187,8 @@ static int coroutine_fn bdrv_co_do_pwritev(BlockDriverState *bs,
|
||||||
BdrvRequestFlags flags)
|
BdrvRequestFlags flags)
|
||||||
{
|
{
|
||||||
BdrvTrackedRequest req;
|
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 *head_buf = NULL;
|
||||||
uint8_t *tail_buf = NULL;
|
uint8_t *tail_buf = NULL;
|
||||||
QEMUIOVector local_qiov;
|
QEMUIOVector local_qiov;
|
||||||
|
@ -1298,10 +1287,6 @@ static int coroutine_fn bdrv_co_do_pwritev(BlockDriverState *bs,
|
||||||
bytes = ROUND_UP(bytes, align);
|
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,
|
ret = bdrv_aligned_pwritev(bs, &req, offset, bytes,
|
||||||
use_local_qiov ? &local_qiov : qiov,
|
use_local_qiov ? &local_qiov : qiov,
|
||||||
flags);
|
flags);
|
||||||
|
@ -1342,32 +1327,14 @@ int coroutine_fn bdrv_co_write_zeroes(BlockDriverState *bs,
|
||||||
int64_t sector_num, int nb_sectors,
|
int64_t sector_num, int nb_sectors,
|
||||||
BdrvRequestFlags flags)
|
BdrvRequestFlags flags)
|
||||||
{
|
{
|
||||||
int ret;
|
|
||||||
|
|
||||||
trace_bdrv_co_write_zeroes(bs, sector_num, nb_sectors, flags);
|
trace_bdrv_co_write_zeroes(bs, sector_num, nb_sectors, flags);
|
||||||
|
|
||||||
if (!(bs->open_flags & BDRV_O_UNMAP)) {
|
if (!(bs->open_flags & BDRV_O_UNMAP)) {
|
||||||
flags &= ~BDRV_REQ_MAY_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);
|
return bdrv_co_do_writev(bs, sector_num, nb_sectors, NULL,
|
||||||
memset(buf, 0, bytes);
|
BDRV_REQ_ZERO_WRITE | flags);
|
||||||
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,
|
|
||||||
BDRV_REQ_ZERO_WRITE | flags);
|
|
||||||
qemu_vfree(buf);
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int bdrv_flush_all(void)
|
int bdrv_flush_all(void)
|
||||||
|
|
Loading…
Reference in New Issue