mirror of https://gitee.com/openkylin/qemu.git
stream: do not copy unallocated sectors from the base
Unallocated sectors should really never be accessed by the guest, so there's no need to copy them during the streaming process. If they are read by the guest during streaming, guest-initiated copy-on-read will copy them (we're in the base == NULL case, which enables copy on read). If they are read after we disconnect the image from the base, they will read as zeroes anyway. Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
parent
b21d677ee9
commit
efcc7a2324
|
@ -130,14 +130,9 @@ static int coroutine_fn is_allocated_base(BlockDriverState *top,
|
|||
*/
|
||||
intermediate = top->backing_hd;
|
||||
|
||||
while (intermediate) {
|
||||
while (intermediate != base) {
|
||||
int pnum_inter;
|
||||
|
||||
/* reached base */
|
||||
if (intermediate == base) {
|
||||
*pnum = n;
|
||||
return 1;
|
||||
}
|
||||
ret = bdrv_co_is_allocated(intermediate, sector_num, nb_sectors,
|
||||
&pnum_inter);
|
||||
if (ret < 0) {
|
||||
|
@ -160,6 +155,7 @@ static int coroutine_fn is_allocated_base(BlockDriverState *top,
|
|||
intermediate = intermediate->backing_hd;
|
||||
}
|
||||
|
||||
*pnum = n;
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
@ -203,14 +199,8 @@ wait:
|
|||
break;
|
||||
}
|
||||
|
||||
if (base) {
|
||||
ret = is_allocated_base(bs, base, sector_num,
|
||||
STREAM_BUFFER_SIZE / BDRV_SECTOR_SIZE, &n);
|
||||
} else {
|
||||
ret = bdrv_co_is_allocated(bs, sector_num,
|
||||
STREAM_BUFFER_SIZE / BDRV_SECTOR_SIZE,
|
||||
&n);
|
||||
}
|
||||
ret = is_allocated_base(bs, base, sector_num,
|
||||
STREAM_BUFFER_SIZE / BDRV_SECTOR_SIZE, &n);
|
||||
trace_stream_one_iteration(s, sector_num, n, ret);
|
||||
if (ret == 0) {
|
||||
if (s->common.speed) {
|
||||
|
|
|
@ -83,8 +83,9 @@ class TestSingleDrive(ImageStreamingTestCase):
|
|||
self.assert_no_active_streams()
|
||||
self.vm.shutdown()
|
||||
|
||||
self.assertFalse('sectors not allocated' in qemu_io('-c', 'map', test_img),
|
||||
'image file not fully populated after streaming')
|
||||
self.assertEqual(qemu_io('-c', 'map', backing_img),
|
||||
qemu_io('-c', 'map', test_img),
|
||||
'image file map does not match backing file after streaming')
|
||||
|
||||
def test_stream_partial(self):
|
||||
self.assert_no_active_streams()
|
||||
|
|
Loading…
Reference in New Issue