Loading block/vhdx.c +12 −1 Original line number Diff line number Diff line Loading @@ -1174,7 +1174,18 @@ static void vhdx_update_bat_table_entry(BlockDriverState *bs, BDRVVHDXState *s, { /* The BAT entry is a uint64, with 44 bits for the file offset in units of * 1MB, and 3 bits for the block state. */ if ((state == PAYLOAD_BLOCK_ZERO) || (state == PAYLOAD_BLOCK_UNDEFINED) || (state == PAYLOAD_BLOCK_NOT_PRESENT) || (state == PAYLOAD_BLOCK_UNMAPPED)) { s->bat[sinfo->bat_idx] = 0; /* For PAYLOAD_BLOCK_ZERO, the FileOffsetMB field is denoted as 'reserved' in the v1.0 spec. If it is non-zero, MS Hyper-V will fail to read the disk image */ } else { s->bat[sinfo->bat_idx] = sinfo->file_offset; } s->bat[sinfo->bat_idx] |= state & VHDX_BAT_STATE_BIT_MASK; Loading tests/qemu-iotests/064 +17 −2 Original line number Diff line number Diff line Loading @@ -54,7 +54,15 @@ $QEMU_IO -r -c "read -pP 0x96 33M 33M" "$TEST_IMG" | _filter_qemu_io echo echo "=== Verify pattern 0x00, 66M - 1024M ===" $QEMU_IO -r -c "read -pP 0x00 66M 958M" "$TEST_IMG" | _filter_qemu_io $QEMU_IO -r -c "read -pP 0x00 66M 62M" \ -c "read -pP 0x00 128M 128M" \ -c "read -pP 0x00 256M 128M" \ -c "read -pP 0x00 384M 128M" \ -c "read -pP 0x00 512M 128M" \ -c "read -pP 0x00 640M 128M" \ -c "read -pP 0x00 768M 128M" \ -c "read -pP 0x00 896M 128M" \ "$TEST_IMG" | _filter_qemu_io echo echo "=== Verify pattern write, 0xc3 99M-157M ===" Loading @@ -63,7 +71,14 @@ $QEMU_IO -c "write -pP 0xc3 99M 58M" "$TEST_IMG" | _filter_qemu_io $QEMU_IO -c "read -pP 0xa5 0 33M" "$TEST_IMG" | _filter_qemu_io $QEMU_IO -c "read -pP 0x96 33M 33M" "$TEST_IMG" | _filter_qemu_io $QEMU_IO -c "read -pP 0x00 66M 33M" "$TEST_IMG" | _filter_qemu_io $QEMU_IO -c "read -pP 0x00 157MM 867MM" "$TEST_IMG" | _filter_qemu_io $QEMU_IO -c "read -pP 0x00 157M 99M" \ -c "read -pP 0x00 256M 128M" \ -c "read -pP 0x00 384M 128M" \ -c "read -pP 0x00 512M 128M" \ -c "read -pP 0x00 640M 128M" \ -c "read -pP 0x00 768M 128M" \ -c "read -pP 0x00 896M 128M" \ "$TEST_IMG" | _filter_qemu_io # now verify what we should have actually written $QEMU_IO -c "read -pP 0xc3 99M 58M" "$TEST_IMG" | _filter_qemu_io Loading tests/qemu-iotests/064.out +30 −4 Original line number Diff line number Diff line Loading @@ -9,8 +9,22 @@ read 34603008/34603008 bytes at offset 34603008 33 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) === Verify pattern 0x00, 66M - 1024M === read 1004535808/1004535808 bytes at offset 69206016 958 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) read 65011712/65011712 bytes at offset 69206016 62 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) read 134217728/134217728 bytes at offset 134217728 128 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) read 134217728/134217728 bytes at offset 268435456 128 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) read 134217728/134217728 bytes at offset 402653184 128 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) read 134217728/134217728 bytes at offset 536870912 128 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) read 134217728/134217728 bytes at offset 671088640 128 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) read 134217728/134217728 bytes at offset 805306368 128 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) read 134217728/134217728 bytes at offset 939524096 128 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) === Verify pattern write, 0xc3 99M-157M === wrote 60817408/60817408 bytes at offset 103809024 Loading @@ -21,8 +35,20 @@ read 34603008/34603008 bytes at offset 34603008 33 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) read 34603008/34603008 bytes at offset 69206016 33 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) read 909115392/909115392 bytes at offset 164626432 867 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) read 103809024/103809024 bytes at offset 164626432 99 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) read 134217728/134217728 bytes at offset 268435456 128 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) read 134217728/134217728 bytes at offset 402653184 128 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) read 134217728/134217728 bytes at offset 536870912 128 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) read 134217728/134217728 bytes at offset 671088640 128 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) read 134217728/134217728 bytes at offset 805306368 128 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) read 134217728/134217728 bytes at offset 939524096 128 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) read 60817408/60817408 bytes at offset 103809024 58 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) *** done Loading
block/vhdx.c +12 −1 Original line number Diff line number Diff line Loading @@ -1174,7 +1174,18 @@ static void vhdx_update_bat_table_entry(BlockDriverState *bs, BDRVVHDXState *s, { /* The BAT entry is a uint64, with 44 bits for the file offset in units of * 1MB, and 3 bits for the block state. */ if ((state == PAYLOAD_BLOCK_ZERO) || (state == PAYLOAD_BLOCK_UNDEFINED) || (state == PAYLOAD_BLOCK_NOT_PRESENT) || (state == PAYLOAD_BLOCK_UNMAPPED)) { s->bat[sinfo->bat_idx] = 0; /* For PAYLOAD_BLOCK_ZERO, the FileOffsetMB field is denoted as 'reserved' in the v1.0 spec. If it is non-zero, MS Hyper-V will fail to read the disk image */ } else { s->bat[sinfo->bat_idx] = sinfo->file_offset; } s->bat[sinfo->bat_idx] |= state & VHDX_BAT_STATE_BIT_MASK; Loading
tests/qemu-iotests/064 +17 −2 Original line number Diff line number Diff line Loading @@ -54,7 +54,15 @@ $QEMU_IO -r -c "read -pP 0x96 33M 33M" "$TEST_IMG" | _filter_qemu_io echo echo "=== Verify pattern 0x00, 66M - 1024M ===" $QEMU_IO -r -c "read -pP 0x00 66M 958M" "$TEST_IMG" | _filter_qemu_io $QEMU_IO -r -c "read -pP 0x00 66M 62M" \ -c "read -pP 0x00 128M 128M" \ -c "read -pP 0x00 256M 128M" \ -c "read -pP 0x00 384M 128M" \ -c "read -pP 0x00 512M 128M" \ -c "read -pP 0x00 640M 128M" \ -c "read -pP 0x00 768M 128M" \ -c "read -pP 0x00 896M 128M" \ "$TEST_IMG" | _filter_qemu_io echo echo "=== Verify pattern write, 0xc3 99M-157M ===" Loading @@ -63,7 +71,14 @@ $QEMU_IO -c "write -pP 0xc3 99M 58M" "$TEST_IMG" | _filter_qemu_io $QEMU_IO -c "read -pP 0xa5 0 33M" "$TEST_IMG" | _filter_qemu_io $QEMU_IO -c "read -pP 0x96 33M 33M" "$TEST_IMG" | _filter_qemu_io $QEMU_IO -c "read -pP 0x00 66M 33M" "$TEST_IMG" | _filter_qemu_io $QEMU_IO -c "read -pP 0x00 157MM 867MM" "$TEST_IMG" | _filter_qemu_io $QEMU_IO -c "read -pP 0x00 157M 99M" \ -c "read -pP 0x00 256M 128M" \ -c "read -pP 0x00 384M 128M" \ -c "read -pP 0x00 512M 128M" \ -c "read -pP 0x00 640M 128M" \ -c "read -pP 0x00 768M 128M" \ -c "read -pP 0x00 896M 128M" \ "$TEST_IMG" | _filter_qemu_io # now verify what we should have actually written $QEMU_IO -c "read -pP 0xc3 99M 58M" "$TEST_IMG" | _filter_qemu_io Loading
tests/qemu-iotests/064.out +30 −4 Original line number Diff line number Diff line Loading @@ -9,8 +9,22 @@ read 34603008/34603008 bytes at offset 34603008 33 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) === Verify pattern 0x00, 66M - 1024M === read 1004535808/1004535808 bytes at offset 69206016 958 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) read 65011712/65011712 bytes at offset 69206016 62 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) read 134217728/134217728 bytes at offset 134217728 128 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) read 134217728/134217728 bytes at offset 268435456 128 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) read 134217728/134217728 bytes at offset 402653184 128 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) read 134217728/134217728 bytes at offset 536870912 128 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) read 134217728/134217728 bytes at offset 671088640 128 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) read 134217728/134217728 bytes at offset 805306368 128 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) read 134217728/134217728 bytes at offset 939524096 128 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) === Verify pattern write, 0xc3 99M-157M === wrote 60817408/60817408 bytes at offset 103809024 Loading @@ -21,8 +35,20 @@ read 34603008/34603008 bytes at offset 34603008 33 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) read 34603008/34603008 bytes at offset 69206016 33 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) read 909115392/909115392 bytes at offset 164626432 867 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) read 103809024/103809024 bytes at offset 164626432 99 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) read 134217728/134217728 bytes at offset 268435456 128 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) read 134217728/134217728 bytes at offset 402653184 128 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) read 134217728/134217728 bytes at offset 536870912 128 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) read 134217728/134217728 bytes at offset 671088640 128 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) read 134217728/134217728 bytes at offset 805306368 128 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) read 134217728/134217728 bytes at offset 939524096 128 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) read 60817408/60817408 bytes at offset 103809024 58 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) *** done