if (!disk->src)
continue;
- if (qemuDomainDetermineDiskChain(driver, disk, false) >= 0 &&
+ if (qemuDomainDetermineDiskChain(driver, vm, disk, false) >= 0 &&
qemuDiskChainCheckBroken(disk) >= 0)
continue;
return 0;
}
+static void
+qemuDomainGetImageIds(virQEMUDriverConfigPtr cfg,
+ virDomainObjPtr vm,
+ virDomainDiskDefPtr disk,
+ uid_t *uid, gid_t *gid)
+{
+ virSecurityLabelDefPtr vmlabel;
+ virSecurityDeviceLabelDefPtr disklabel;
+
+ if (uid)
+ *uid = -1;
+ if (gid)
+ *gid = -1;
+
+ if (cfg) {
+ if (uid)
+ *uid = cfg->user;
+
+ if (gid)
+ *gid = cfg->group;
+ }
+
+ if (vm && (vmlabel = virDomainDefGetSecurityLabelDef(vm->def, "dac")))
+ virParseOwnershipIds(vmlabel->label, uid, gid);
+
+ if ((disklabel = virDomainDiskDefGetSecurityLabelDef(disk, "dac")))
+ virParseOwnershipIds(disklabel->label, uid, gid);
+}
+
+
int
qemuDomainDetermineDiskChain(virQEMUDriverPtr driver,
+ virDomainObjPtr vm,
virDomainDiskDefPtr disk,
bool force)
{
virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver);
int ret = 0;
+ uid_t uid;
+ gid_t gid;
if (!disk->src ||
disk->type == VIR_DOMAIN_DISK_TYPE_NETWORK ||
goto cleanup;
}
}
+
+ qemuDomainGetImageIds(cfg, vm, disk, &uid, &gid);
+
disk->backingChain = virStorageFileGetMetadata(disk->src, disk->format,
- cfg->user, cfg->group,
+ uid, gid,
cfg->allowDiskFormatProbing);
if (!disk->backingChain)
ret = -1;
int qemuDiskChainCheckBroken(virDomainDiskDefPtr disk);
int qemuDomainDetermineDiskChain(virQEMUDriverPtr driver,
+ virDomainObjPtr vm,
virDomainDiskDefPtr disk,
bool force);
if (qemuTranslateDiskSourcePool(conn, disk) < 0)
goto end;
- if (qemuDomainDetermineDiskChain(driver, disk, false) < 0)
+ if (qemuDomainDetermineDiskChain(driver, vm, disk, false) < 0)
goto end;
if (qemuSetupDiskCgroup(vm, disk) < 0)
disk->src = disk->mirror;
disk->format = disk->mirrorFormat;
disk->backingChain = NULL;
- if (qemuDomainDetermineDiskChain(driver, disk, false) < 0) {
+ if (qemuDomainDetermineDiskChain(driver, vm, disk, false) < 0) {
disk->src = oldsrc;
disk->format = oldformat;
disk->backingChain = oldchain;
goto endjob;
}
- if (qemuDomainDetermineDiskChain(driver, disk, false) < 0)
+ if (qemuDomainDetermineDiskChain(driver, vm, disk, false) < 0)
goto endjob;
if ((flags & VIR_DOMAIN_BLOCK_REBASE_SHALLOW) &&
disk->dst);
goto endjob;
}
- if (qemuDomainDetermineDiskChain(driver, disk, false) < 0)
+ if (qemuDomainDetermineDiskChain(driver, vm, disk, false) < 0)
goto endjob;
if (!top) {
if (qemuSetUnprivSGIO(dev) < 0)
goto end;
- if (qemuDomainDetermineDiskChain(driver, disk, false) < 0)
+ if (qemuDomainDetermineDiskChain(driver, vm, disk, false) < 0)
goto end;
if (qemuSetupDiskCgroup(vm, disk) < 0)
if ((type == VIR_DOMAIN_BLOCK_JOB_TYPE_PULL ||
type == VIR_DOMAIN_BLOCK_JOB_TYPE_COMMIT) &&
status == VIR_DOMAIN_BLOCK_JOB_COMPLETED)
- qemuDomainDetermineDiskChain(driver, disk, true);
+ qemuDomainDetermineDiskChain(driver, vm, disk, true);
if (disk->mirror && type == VIR_DOMAIN_BLOCK_JOB_TYPE_COPY &&
status == VIR_DOMAIN_BLOCK_JOB_READY)
disk->mirroring = true;