diff --git a/src/qemu/qemu_conf.h b/src/qemu/qemu_conf.h index f876f9117c..0b5b5a314f 100644 --- a/src/qemu/qemu_conf.h +++ b/src/qemu/qemu_conf.h @@ -92,6 +92,7 @@ struct _virQEMUDriverConfig { bool dynamicOwnership; virBitmapPtr namespaces; + bool rememberOwner; int cgroupControllers; char **cgroupDeviceACL; diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index 1beb5969c1..2f65bbe34e 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -1963,6 +1963,8 @@ qemuDomainObjPrivateDataClear(qemuDomainObjPrivatePtr priv) virBitmapFree(priv->namespaces); priv->namespaces = NULL; + priv->rememberOwner = false; + priv->reconnectBlockjobs = VIR_TRISTATE_BOOL_ABSENT; priv->allowReboot = VIR_TRISTATE_BOOL_ABSENT; @@ -2480,6 +2482,9 @@ qemuDomainObjPrivateXMLFormat(virBufferPtr buf, if (priv->chardevStdioLogd) virBufferAddLit(buf, "\n"); + if (priv->rememberOwner) + virBufferAddLit(buf, "\n"); + qemuDomainObjPrivateXMLFormatAllowReboot(buf, priv->allowReboot); qemuDomainObjPrivateXMLFormatPR(buf, priv); @@ -2891,6 +2896,8 @@ qemuDomainObjPrivateXMLParse(xmlXPathContextPtr ctxt, priv->namespaces = NULL; } + priv->rememberOwner = virXPathBoolean("count(./rememberOwner) > 0", ctxt); + if ((n = virXPathNodeSet("./vcpus/vcpu", ctxt, &nodes)) < 0) goto error; diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h index 87de433b22..53b5ea1678 100644 --- a/src/qemu/qemu_domain.h +++ b/src/qemu/qemu_domain.h @@ -369,6 +369,9 @@ struct _qemuDomainObjPrivate { /* qemuProcessStartCPUs stores the reason for starting vCPUs here for the * RESUME event handler to use it */ virDomainRunningReason runningReason; + + /* true if libvirt remembers the original owner for files */ + bool rememberOwner; }; # define QEMU_DOMAIN_PRIVATE(vm) \ diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index 36164a3183..031383b987 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -5898,6 +5898,9 @@ qemuProcessPrepareDomain(virQEMUDriverPtr driver, priv->chardevStdioLogd = true; } + /* Track if this domain remembers original owner */ + priv->rememberOwner = cfg->rememberOwner; + qemuProcessPrepareAllowReboot(vm); /* clear the 'blockdev' capability for VMs which have disks that need