<div dir="ltr">A bug will be hitted with libvirt+qemu+kvm when doing follow steps:<br>1.initial status :vm = base+z(z is a snapshot)<br>2. call snapshotCreateXML( ): vm =  base+z +z'<br>3. call blockRebase( ): vm = base+z''(z rebase to z')<br>4.(after rebasing work done) vm shutdown and then start<br><br>an error occured like this:<br>"unable to set user and group to '0:0' on '<br>/path/to/disk': No such file or directory<br><br>A second start may sucess.<br><br>The error message reported by virSecurityDACSetSecurityDiskLabel<br>when the disk chain is misused(that is base+z +z', after rebase,<br>but z' was deleted yet).virSecurityDACSetSecurityDiskLabel used<br>an old disk chain after rebasing.<br>In qemuProcessHandleBlockJob when rebase complete, the disk chain<br>in vm->def is updated but vm->newDef is not(when vm->newDef is not<br>null). In shutdown( actrully in qemuProcessStop ), if vm->newDef<br>is not null , vm->def will be replaced  by vm->newDef, which<br>contains a wrong disk chain!!! Then the next start will failed with<br>above message.<br>To fix it, update disk chain in vm->newDef in qemuProcessHandleBlockJob.<br><br>Signed-off-by: Weiwei Li <<a href="mailto:nuonuoli@tencent.com">nuonuoli@tencent.com</a>><br>---<br> src/qemu/qemu_process.c |   27 +++++++++++++++++++++++++++<br> 1 files changed, 27 insertions(+), 0 deletions(-)<br><br>diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c<br>index 24e5f0f..0491249 100644<br>--- a/src/qemu/qemu_process.c<br>+++ b/src/qemu/qemu_process.c<br>@@ -1033,6 +1033,7 @@ qemuProcessHandleBlockJob(qemuMonitorPtr mon ATTRIBUTE_UNUSED,<br>     virDomainDiskDefPtr disk;<br>     virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver);<br>     virDomainDiskDefPtr persistDisk = NULL;<br>+    virDomainDiskDefPtr newDisk = NULL;<br>     bool save = false;<br> <br>     virObjectLock(vm);<br>@@ -1101,6 +1102,32 @@ qemuProcessHandleBlockJob(qemuMonitorPtr mon ATTRIBUTE_UNUSED,<br>             disk->mirrorJob = VIR_DOMAIN_BLOCK_JOB_TYPE_UNKNOWN;<br>             ignore_value(qemuDomainDetermineDiskChain(driver, vm, disk,<br>                                                       true, true));<br>+            /* Chang vm->newDef disk chain  */<br>+            if (!persistDisk && vm->newDef){<br>+                int indx = virDomainDiskIndexByName(vm->newDef,<br>+                                                disk->dst,                     <br>+                                                false);                        <br>+                virStorageSourcePtr copy = NULL;<br>+<br>+                if (indx >=0){  <br>+                    newDisk = vm->newDef->disks[indx];<br>+                    copy = virStorageSourceCopy(disk->src, false);<br>+                    if (virStorageSourceInitChainElement(copy,<br>+                                                         newDisk->src,                  <br>+                                                         false) < 0) {                  <br>+                            VIR_WARN("Unable to update newDef definition "<br>+                                     "on vm %s after block job",    <br>+                                     vm->def->name);                <br>+                            virStorageSourceFree(copy);    <br>+                            copy = NULL;                   <br>+                            newDisk = NULL;                <br>+                    }<br>+                }<br>+                if (copy){<br>+                    virStorageSourceFree(newDisk->src);<br>+                    newDisk->src = copy;           <br>+                }<br>+            }<br>         } else if (disk->mirror &&<br>                    (type == VIR_DOMAIN_BLOCK_JOB_TYPE_COPY ||<br>                     type == VIR_DOMAIN_BLOCK_JOB_TYPE_ACTIVE_COMMIT)) {<br>-- <br>1.7.1<br></div>