mirror of https://github.com/xqemu/xqemu.git
qcow2: Let vmstate call qcow2_co_preadv/pwrite directly
We don't really want to go through the block layer in order to read from or write to the vmstate in a qcow2 image. Doing so required a few ugly hacks like saving and restoring the old image size (because writing to vmstate offsets would increase the image size) or disabling the "reads after EOF = zeroes" logic. When calling the right functions directly, these hacks aren't necessary any more. Note that .bdrv_vmstate_load/save() return 0 instead of the number of bytes in case of success now. Signed-off-by: Kevin Wolf <kwolf@redhat.com> Reviewed-by: Fam Zheng <famz@redhat.com> Reviewed-by: Eric Blake <eblake@redhat.com> Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
This commit is contained in:
parent
1a8ae82217
commit
734a77584a
|
@ -2909,36 +2909,20 @@ static int qcow2_save_vmstate(BlockDriverState *bs, QEMUIOVector *qiov,
|
||||||
int64_t pos)
|
int64_t pos)
|
||||||
{
|
{
|
||||||
BDRVQcow2State *s = bs->opaque;
|
BDRVQcow2State *s = bs->opaque;
|
||||||
int64_t total_sectors = bs->total_sectors;
|
|
||||||
bool zero_beyond_eof = bs->zero_beyond_eof;
|
|
||||||
int ret;
|
|
||||||
|
|
||||||
BLKDBG_EVENT(bs->file, BLKDBG_VMSTATE_SAVE);
|
BLKDBG_EVENT(bs->file, BLKDBG_VMSTATE_SAVE);
|
||||||
bs->zero_beyond_eof = false;
|
return bs->drv->bdrv_co_pwritev(bs, qcow2_vm_state_offset(s) + pos,
|
||||||
ret = bdrv_pwritev(bs, qcow2_vm_state_offset(s) + pos, qiov);
|
qiov->size, qiov, 0);
|
||||||
bs->zero_beyond_eof = zero_beyond_eof;
|
|
||||||
|
|
||||||
/* bdrv_co_do_writev will have increased the total_sectors value to include
|
|
||||||
* the VM state - the VM state is however not an actual part of the block
|
|
||||||
* device, therefore, we need to restore the old value. */
|
|
||||||
bs->total_sectors = total_sectors;
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int qcow2_load_vmstate(BlockDriverState *bs, QEMUIOVector *qiov,
|
static int qcow2_load_vmstate(BlockDriverState *bs, QEMUIOVector *qiov,
|
||||||
int64_t pos)
|
int64_t pos)
|
||||||
{
|
{
|
||||||
BDRVQcow2State *s = bs->opaque;
|
BDRVQcow2State *s = bs->opaque;
|
||||||
bool zero_beyond_eof = bs->zero_beyond_eof;
|
|
||||||
int ret;
|
|
||||||
|
|
||||||
BLKDBG_EVENT(bs->file, BLKDBG_VMSTATE_LOAD);
|
BLKDBG_EVENT(bs->file, BLKDBG_VMSTATE_LOAD);
|
||||||
bs->zero_beyond_eof = false;
|
return bs->drv->bdrv_co_preadv(bs, qcow2_vm_state_offset(s) + pos,
|
||||||
ret = bdrv_preadv(bs, qcow2_vm_state_offset(s) + pos, qiov);
|
qiov->size, qiov, 0);
|
||||||
bs->zero_beyond_eof = zero_beyond_eof;
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
Loading…
Reference in New Issue