提交 9d673776 编写于 作者: P Peter Krempa

qemu: Split out preparing of single snapshot from qemuDomainSnapshotDiskDataCollect

Move the internals into qemuDomainSnapshotDiskDataCollectOne to make it
obvious what's happening after moving more code here.
Signed-off-by: NPeter Krempa <pkrempa@redhat.com>
Reviewed-by: NJán Tomko <jtomko@redhat.com>
上级 9d80fdcd
......@@ -15302,46 +15302,24 @@ qemuDomainSnapshotDiskDataCleanup(qemuDomainSnapshotDiskDataPtr data,
}
/**
* qemuDomainSnapshotDiskDataCollect:
*
* Collects and prepares a list of structures that hold information about disks
* that are selected for the snapshot.
*/
static int
qemuDomainSnapshotDiskDataCollect(virQEMUDriverPtr driver,
qemuDomainSnapshotDiskDataCollectOne(virQEMUDriverPtr driver,
virDomainObjPtr vm,
virDomainMomentObjPtr snap,
bool reuse,
qemuDomainSnapshotDiskDataPtr *rdata,
size_t *rndata)
virDomainDiskDefPtr disk,
virDomainSnapshotDiskDefPtr snapdisk,
qemuDomainSnapshotDiskDataPtr dd,
bool reuse)
{
size_t i;
qemuDomainSnapshotDiskDataPtr data;
size_t ndata = 0;
qemuDomainSnapshotDiskDataPtr dd;
char *backingStoreStr;
virDomainSnapshotDefPtr snapdef = virDomainSnapshotObjGetDef(snap);
virDomainDiskDefPtr persistdisk;
int ret = -1;
if (VIR_ALLOC_N(data, snapdef->ndisks) < 0)
return -1;
for (i = 0; i < snapdef->ndisks; i++) {
if (snapdef->disks[i].snapshot == VIR_DOMAIN_SNAPSHOT_LOCATION_NONE)
continue;
dd = data + ndata;
ndata++;
dd->disk = vm->def->disks[i];
dd->disk = disk;
if (!(dd->src = virStorageSourceCopy(snapdef->disks[i].src, false)))
goto cleanup;
if (!(dd->src = virStorageSourceCopy(snapdisk->src, false)))
return -1;
if (virStorageSourceInitChainElement(dd->src, dd->disk->src, false) < 0)
goto cleanup;
return -1;
/* modify disk in persistent definition only when the source is the same */
if (vm->newDef &&
......@@ -15351,15 +15329,15 @@ qemuDomainSnapshotDiskDataCollect(virQEMUDriverPtr driver,
dd->persistdisk = persistdisk;
if (!(dd->persistsrc = virStorageSourceCopy(dd->src, false)))
goto cleanup;
return -1;
if (virStorageSourceInitChainElement(dd->persistsrc,
dd->persistdisk->src, false) < 0)
goto cleanup;
return -1;
}
if (qemuDomainStorageFileInit(driver, vm, dd->src, NULL) < 0)
goto cleanup;
return -1;
dd->initialized = true;
......@@ -15367,7 +15345,7 @@ qemuDomainSnapshotDiskDataCollect(virQEMUDriverPtr driver,
* block commit still works */
if (reuse) {
if (virStorageFileGetBackingStoreStr(dd->src, &backingStoreStr) < 0)
goto cleanup;
return -1;
if (backingStoreStr != NULL) {
if (virStorageIsRelative(backingStoreStr))
VIR_STEAL_PTR(dd->relPath, backingStoreStr);
......@@ -15375,6 +15353,42 @@ qemuDomainSnapshotDiskDataCollect(virQEMUDriverPtr driver,
VIR_FREE(backingStoreStr);
}
}
return 0;
}
/**
* qemuDomainSnapshotDiskDataCollect:
*
* Collects and prepares a list of structures that hold information about disks
* that are selected for the snapshot.
*/
static int
qemuDomainSnapshotDiskDataCollect(virQEMUDriverPtr driver,
virDomainObjPtr vm,
virDomainMomentObjPtr snap,
bool reuse,
qemuDomainSnapshotDiskDataPtr *rdata,
size_t *rndata)
{
size_t i;
qemuDomainSnapshotDiskDataPtr data;
size_t ndata = 0;
virDomainSnapshotDefPtr snapdef = virDomainSnapshotObjGetDef(snap);
int ret = -1;
if (VIR_ALLOC_N(data, snapdef->ndisks) < 0)
return -1;
for (i = 0; i < snapdef->ndisks; i++) {
if (snapdef->disks[i].snapshot == VIR_DOMAIN_SNAPSHOT_LOCATION_NONE)
continue;
if (qemuDomainSnapshotDiskDataCollectOne(driver, vm, vm->def->disks[i],
snapdef->disks + i,
data + ndata++, reuse) < 0)
goto cleanup;
}
VIR_STEAL_PTR(*rdata, data);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册