Commit 0d51b4de authored by Asias He's avatar Asias He Committed by Stefan Hajnoczi
Browse files

block: Introduce bs->zero_beyond_eof



In 4146b46c42e0989cb5842e04d88ab6ccb1713a48 (block: Produce zeros when
protocols reading beyond end of file), we break qemu-iotests ./check
-qcow2 022. This happens because qcow2 temporarily sets ->growable = 1
for vmstate accesses (which are stored beyond the end of regular image
data).

We introduce the bs->zero_beyond_eof to allow qcow2_load_vmstate() to
disable ->zero_beyond_eof temporarily in addition to enable ->growable.

[Since the broken patch "block: Produce zeros when protocols reading
beyond end of file" has not been merged yet, I have applied this fix
*first* and will then apply the next patch to keep the tree bisectable.
-- Stefan]
Suggested-by: default avatarStefan Hajnoczi <stefanha@redhat.com>
Signed-off-by: default avatarAsias He <asias@redhat.com>
Signed-off-by: default avatarStefan Hajnoczi <stefanha@redhat.com>
parent 8ad1898c
...@@ -706,6 +706,7 @@ static int bdrv_open_common(BlockDriverState *bs, BlockDriverState *file, ...@@ -706,6 +706,7 @@ static int bdrv_open_common(BlockDriverState *bs, BlockDriverState *file,
bs->open_flags = flags; bs->open_flags = flags;
bs->buffer_alignment = 512; bs->buffer_alignment = 512;
bs->zero_beyond_eof = true;
open_flags = bdrv_open_flags(bs, flags); open_flags = bdrv_open_flags(bs, flags);
bs->read_only = !(open_flags & BDRV_O_RDWR); bs->read_only = !(open_flags & BDRV_O_RDWR);
...@@ -1402,6 +1403,7 @@ void bdrv_close(BlockDriverState *bs) ...@@ -1402,6 +1403,7 @@ void bdrv_close(BlockDriverState *bs)
bs->valid_key = 0; bs->valid_key = 0;
bs->sg = 0; bs->sg = 0;
bs->growable = 0; bs->growable = 0;
bs->zero_beyond_eof = false;
QDECREF(bs->options); QDECREF(bs->options);
bs->options = NULL; bs->options = NULL;
......
...@@ -1722,12 +1722,15 @@ static int qcow2_load_vmstate(BlockDriverState *bs, uint8_t *buf, ...@@ -1722,12 +1722,15 @@ static int qcow2_load_vmstate(BlockDriverState *bs, uint8_t *buf,
{ {
BDRVQcowState *s = bs->opaque; BDRVQcowState *s = bs->opaque;
int growable = bs->growable; int growable = bs->growable;
bool zero_beyond_eof = bs->zero_beyond_eof;
int ret; int ret;
BLKDBG_EVENT(bs->file, BLKDBG_VMSTATE_LOAD); BLKDBG_EVENT(bs->file, BLKDBG_VMSTATE_LOAD);
bs->growable = 1; bs->growable = 1;
bs->zero_beyond_eof = false;
ret = bdrv_pread(bs, qcow2_vm_state_offset(s) + pos, buf, size); ret = bdrv_pread(bs, qcow2_vm_state_offset(s) + pos, buf, size);
bs->growable = growable; bs->growable = growable;
bs->zero_beyond_eof = zero_beyond_eof;
return ret; return ret;
} }
......
...@@ -281,6 +281,9 @@ struct BlockDriverState { ...@@ -281,6 +281,9 @@ struct BlockDriverState {
/* Whether the disk can expand beyond total_sectors */ /* Whether the disk can expand beyond total_sectors */
int growable; int growable;
/* Whether produces zeros when read beyond eof */
bool zero_beyond_eof;
/* the memory alignment required for the buffers handled by this driver */ /* the memory alignment required for the buffers handled by this driver */
int buffer_alignment; int buffer_alignment;
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment