On 8/19/19 1:55 PM, Max Reitz wrote: > qcow2 v3 requires every snapshot table entry to have two extra data > fields: The 64-bit VM state size, and the virtual disk size. Both are > optional for v2 images, so they may not be present. > > qcow2_upgrade() therefore should update the snapshot table to ensure all > entries have these extra data fields. > > Buglink: https://bugzilla.redhat.com/show_bug.cgi?id=1727347 > Reported-by: Eric Blake <ebl...@redhat.com> > Signed-off-by: Max Reitz <mre...@redhat.com> > --- > block/qcow2.c | 32 ++++++++++++++++++++++++++++++-- > 1 file changed, 30 insertions(+), 2 deletions(-) >
> @@ -4768,7 +4770,33 @@ static int qcow2_upgrade(BlockDriverState *bs, int > target_version, > /* There are no other versions (yet) that you can upgrade to */ > assert(target_version == 3); > > - status_cb(bs, 0, 1, cb_opaque); > + status_cb(bs, 0, 2, cb_opaque); > + > + /* > + * In v2, snapshots do not need to have extra data. v3 requires > + * the 64-bit VM state size and the virtual disk size to be > + * present. > + * qcow2_write_snapshots() will always write the list in the > + * v3-compliant format. > + */ > + need_snapshot_update = false; > + for (i = 0; i < s->nb_snapshots; i++) { > + if (s->snapshots[i].extra_data_size < > + sizeof_field(QCowSnapshotExtraData, vm_state_size_large) + > + sizeof_field(QCowSnapshotExtraData, disk_size)) sizeof(extra) would be more concise than two sizeof_field() added together, but might cause problems if we later expand the size of extra for other reasons, but don't revisit this code. So I actually like what you did here. Reviewed-by: Eric Blake <ebl...@redhat.com> -- Eric Blake, Principal Software Engineer Red Hat, Inc. +1-919-301-3226 Virtualization: qemu.org | libvirt.org
signature.asc
Description: OpenPGP digital signature