[libvirt] [PATCH 2/2] snapshot: enforce REVERT_FORCE on qemu

Eric Blake eblake at redhat.com
Wed Oct 5 16:55:44 UTC 2011


On 10/04/2011 04:02 PM, Eric Blake wrote:
>>> * src/qemu/qemu_driver.c (qemuDomainRevertToSnapshot): Check for
>>> risky situations, and allow force to get past them.
>>
>> ACK.
>
> Before pushing this, I'm running some sanity tests. So far, this test
> sequence (adjusted to the fixed code) shows where force helps with older
> snapshots (I'll send separate email for showing how force helps active
> ABI-incompatible snapshots):

Test 2:
$ virsh define dom # domain with qcow2 disk
$ virsh start dom
$ virsh snapshot-create-as dom snap
$ virsh shutdown dom # and wait for it to work
$ virsh edit dom # and add a second disk
$ virsh start dom
$ virt-manager # and open a window on the guest
$ virsh snapshot-revert dom snap
error: unsupported configuration: Target domain disk count 1 does not 
match source 2
# Error was expected(*), cannot do live revert across ABI break
$ virsh snapshot-revert dom snap --force
# --force let things work, and virt-manager display bounced due to
# need to start a new qemu process
$ virsh dumpxml dom # confirm only one disk present
$ virsh snapshot-revert dom snap
# revert happens without complaint and without display bounce

(*)That was the message shown before squashing in this patch; after 
squashing in this patch, the message properly mentions "force":

error: revert requires force: Target domain disk count 1 does not match 
source 2

diff --git i/src/qemu/qemu_driver.c w/src/qemu/qemu_driver.c
index 55398f6..2e6f3e4 100644
--- i/src/qemu/qemu_driver.c
+++ w/src/qemu/qemu_driver.c
@@ -9771,12 +9771,16 @@ static int 
qemuDomainRevertToSnapshot(virDomainSnapshotPtr snapshot,
              /* Transitions 5, 6, 8, 9 */
              /* Check for ABI compatibility.  */
              if (config && !virDomainDefCheckABIStability(vm->def, 
config)) {
+                virErrorPtr err = virGetLastError();
+
                  if (!(flags & VIR_DOMAIN_SNAPSHOT_REVERT_FORCE)) {
-                    /* Alter existing error to give correct category. */
-                    virErrorPtr err = virGetLastError();
-                    err->code = VIR_ERR_SNAPSHOT_REVERT_RISKY;
+                    /* Re-spawn error using correct category. */
+                    if (err->code == VIR_ERR_CONFIG_UNSUPPORTED)
+                        qemuReportError(VIR_ERR_SNAPSHOT_REVERT_RISKY, 
"%s",
+                                        err->str2);
                      goto endjob;
                  }
+                virResetError(err);
                  qemuProcessStop(driver, vm, 0,
                                  VIR_DOMAIN_SHUTOFF_FROM_SNAPSHOT);
                  virDomainAuditStop(vm, "from-snapshot");


-- 
Eric Blake   eblake at redhat.com    +1-801-349-2682
Libvirt virtualization library http://libvirt.org




More information about the libvir-list mailing list