Message ID | 160137728185.31007.9248844824207037822.stgit@pasha-ThinkPad-X280 (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Reverse debugging | expand |
Pavel Dovgalyuk <pavel.dovgalyuk@ispras.ru> writes: > From: Pavel Dovgalyuk <Pavel.Dovgaluk@ispras.ru> > > This patch introduces the icount field for saving within the snapshot. > It is required for navigation between the snapshots in record/replay mode. > > Signed-off-by: Pavel Dovgalyuk <Pavel.Dovgalyuk@ispras.ru> > Acked-by: Kevin Wolf <kwolf@redhat.com> > --- > block/qcow2-snapshot.c | 7 +++++++ > block/qcow2.h | 3 +++ > docs/interop/qcow2.txt | 5 +++++ > 3 files changed, 15 insertions(+) > > diff --git a/block/qcow2-snapshot.c b/block/qcow2-snapshot.c > index 9b68690f56..d68b25e0c5 100644 > --- a/block/qcow2-snapshot.c > +++ b/block/qcow2-snapshot.c > @@ -164,6 +164,12 @@ static int qcow2_do_read_snapshots(BlockDriverState *bs, bool repair, > sn->disk_size = bs->total_sectors * BDRV_SECTOR_SIZE; > } > > + if (sn->extra_data_size >= endof(QCowSnapshotExtraData, icount)) { > + sn->icount = be64_to_cpu(extra.icount); > + } else { > + sn->icount = -1ULL; > + } > + > if (sn->extra_data_size > sizeof(extra)) { > uint64_t extra_data_end; > size_t unknown_extra_data_size; > @@ -333,6 +339,7 @@ int qcow2_write_snapshots(BlockDriverState *bs) > memset(&extra, 0, sizeof(extra)); > extra.vm_state_size_large = cpu_to_be64(sn->vm_state_size); > extra.disk_size = cpu_to_be64(sn->disk_size); > + extra.icount = cpu_to_be64(sn->icount); > > id_str_size = strlen(sn->id_str); > name_size = strlen(sn->name); > diff --git a/block/qcow2.h b/block/qcow2.h > index b71e444fca..125ea9679b 100644 > --- a/block/qcow2.h > +++ b/block/qcow2.h > @@ -206,6 +206,7 @@ typedef struct QEMU_PACKED QCowSnapshotHeader { > typedef struct QEMU_PACKED QCowSnapshotExtraData { > uint64_t vm_state_size_large; > uint64_t disk_size; > + uint64_t icount; > } QCowSnapshotExtraData; > > > @@ -219,6 +220,8 @@ typedef struct QCowSnapshot { > uint32_t date_sec; > uint32_t date_nsec; > uint64_t vm_clock_nsec; > + /* icount value for the moment when snapshot was taken */ > + uint64_t icount; > /* Size of all extra data, including QCowSnapshotExtraData if available */ > uint32_t extra_data_size; > /* Data beyond QCowSnapshotExtraData, if any */ > diff --git a/docs/interop/qcow2.txt b/docs/interop/qcow2.txt > index 7da0d81df8..0463f761ef 100644 > --- a/docs/interop/qcow2.txt > +++ b/docs/interop/qcow2.txt > @@ -707,6 +707,11 @@ Snapshot table entry: > > Byte 48 - 55: Virtual disk size of the snapshot in bytes > > + Byte 56 - 63: icount value which corresponds to > + the record/replay instruction count > + when the snapshot was taken. Set to -1 > + if icount was disabled > + > Version 3 images must include extra data at least up to > byte 55. > Hmm is this why I'm seeing some of the iotests fail on the CI: 261 fail [11:34:17] [11:34:44] output mismatch (see 261.out.bad) --- /builds/stsquad/qemu/tests/qemu-iotests/261.out 2020-10-01 11:16:22.000000000 +0000 +++ /builds/stsquad/qemu/build/tests/qemu-iotests/261.out.bad 2020-10-01 11:34:44.000000000 +0000 @@ -29,9 +29,10 @@ [0] ID: 1 Name: sn0 - Extra data size: 16 + Extra data size: 24 VM state size: 0 Disk size: 67108864 + Unknown extra data: �������� [1] ID: 2 Name: sn1 @@ -42,9 +43,10 @@ [2] ID: 3 Name: sn2 - Extra data size: 16 + Extra data size: 24 VM state size: 0 Disk size: 67108864 + Unknown extra data: �������� === Repair botched v3 === @@ -61,9 +63,10 @@ [0] ID: 1 Name: sn0 - Extra data size: 16 + Extra data size: 24 VM state size: 0 Disk size: 67108864 + Unknown extra data: �������� [1] ID: 2 Name: sn1 @@ -74,9 +77,10 @@ [2] ID: 3 Name: sn2 - Extra data size: 16 + Extra data size: 24 VM state size: 0 Disk size: 67108864 + Unknown extra data: �������� === Add new snapshot === @@ -85,9 +89,10 @@ [0] ID: 1 Name: sn0 - Extra data size: 16 + Extra data size: 24 VM state size: 0 Disk size: 67108864 + Unknown extra data: �������� [1] ID: 2 Name: sn1 @@ -98,15 +103,17 @@ [2] ID: 3 Name: sn2 - Extra data size: 16 + Extra data size: 24 VM state size: 0 Disk size: 67108864 + Unknown extra data: �������� [3] ID: 4 Name: sn3 - Extra data size: 16 + Extra data size: 24 VM state size: 0 Disk size: 67108864 + Unknown extra data: === Remove different snapshots === @@ -123,9 +130,10 @@ [1] ID: 3 Name: sn2 - Extra data size: 16 + Extra data size: 24 VM state size: 0 Disk size: 67108864 + Unknown extra data: �������� --- sn1 --- No errors were found on the image. @@ -133,15 +141,17 @@ [0] ID: 1 Name: sn0 - Extra data size: 16 + Extra data size: 24 VM state size: 0 Disk size: 67108864 + Unknown extra data: �������� [1] ID: 3 Name: sn2 - Extra data size: 16 + Extra data size: 24 VM state size: 0 Disk size: 67108864 + Unknown extra data: �������� --- sn2 --- No errors were found on the image. @@ -149,9 +159,10 @@ [0] ID: 1 Name: sn0 - Extra data size: 16 + Extra data size: 24 VM state size: 0 Disk size: 67108864 + Unknown extra data: �������� [1] ID: 2 Name: sn1 @@ -210,7 +221,7 @@ No errors were found on the image. 507 snapshots should remain: - qemu-img info reports 507 snapshots + qemu-img info reports 0 snapshots Image header reports 507 snapshots === Snapshot table too big with one entry with too much extra data === @@ -341,6 +352,6 @@ No errors were found on the image. 65536 snapshots should remain: - qemu-img info reports 65536 snapshots + qemu-img info reports 0 snapshots Image header reports 65536 snapshots *** done
diff --git a/block/qcow2-snapshot.c b/block/qcow2-snapshot.c index 9b68690f56..d68b25e0c5 100644 --- a/block/qcow2-snapshot.c +++ b/block/qcow2-snapshot.c @@ -164,6 +164,12 @@ static int qcow2_do_read_snapshots(BlockDriverState *bs, bool repair, sn->disk_size = bs->total_sectors * BDRV_SECTOR_SIZE; } + if (sn->extra_data_size >= endof(QCowSnapshotExtraData, icount)) { + sn->icount = be64_to_cpu(extra.icount); + } else { + sn->icount = -1ULL; + } + if (sn->extra_data_size > sizeof(extra)) { uint64_t extra_data_end; size_t unknown_extra_data_size; @@ -333,6 +339,7 @@ int qcow2_write_snapshots(BlockDriverState *bs) memset(&extra, 0, sizeof(extra)); extra.vm_state_size_large = cpu_to_be64(sn->vm_state_size); extra.disk_size = cpu_to_be64(sn->disk_size); + extra.icount = cpu_to_be64(sn->icount); id_str_size = strlen(sn->id_str); name_size = strlen(sn->name); diff --git a/block/qcow2.h b/block/qcow2.h index b71e444fca..125ea9679b 100644 --- a/block/qcow2.h +++ b/block/qcow2.h @@ -206,6 +206,7 @@ typedef struct QEMU_PACKED QCowSnapshotHeader { typedef struct QEMU_PACKED QCowSnapshotExtraData { uint64_t vm_state_size_large; uint64_t disk_size; + uint64_t icount; } QCowSnapshotExtraData; @@ -219,6 +220,8 @@ typedef struct QCowSnapshot { uint32_t date_sec; uint32_t date_nsec; uint64_t vm_clock_nsec; + /* icount value for the moment when snapshot was taken */ + uint64_t icount; /* Size of all extra data, including QCowSnapshotExtraData if available */ uint32_t extra_data_size; /* Data beyond QCowSnapshotExtraData, if any */ diff --git a/docs/interop/qcow2.txt b/docs/interop/qcow2.txt index 7da0d81df8..0463f761ef 100644 --- a/docs/interop/qcow2.txt +++ b/docs/interop/qcow2.txt @@ -707,6 +707,11 @@ Snapshot table entry: Byte 48 - 55: Virtual disk size of the snapshot in bytes + Byte 56 - 63: icount value which corresponds to + the record/replay instruction count + when the snapshot was taken. Set to -1 + if icount was disabled + Version 3 images must include extra data at least up to byte 55.