diff --git a/block/stream.c b/block/stream.c index a2c8f67711fa5af156bd2ba7ed86161f07979cd0..608a860aa250f1035043989e0c9dd6428bbda192 100644 --- a/block/stream.c +++ b/block/stream.c @@ -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) { diff --git a/tests/qemu-iotests/030 b/tests/qemu-iotests/030 index 277a98be720945e0590caf5c833012f8dab55e4f..eb7bf996d1e13507e09076c56d5aa82fe1403dab 100755 --- a/tests/qemu-iotests/030 +++ b/tests/qemu-iotests/030 @@ -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()