qemu: Move 'qemuDomainSnapshotForEachQcow2(Raw)' to qemu_snapshot.c

The functions are exclusively used in the snapshot module. Move and
rename them:

  qemuDomainSnapshotForEachQcow2Raw -> qemuSnapshotForEachQcow2Internal
  qemuDomainSnapshotForEachQcow2 -> qemuSnapshotForEachQcow2

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
This commit is contained in:
Peter Krempa 2024-11-11 17:20:39 +01:00
parent 60838fee08
commit 5dfd0a0ce8
3 changed files with 86 additions and 89 deletions

View File

@ -5705,87 +5705,6 @@ qemuDomainSnapshotWriteMetadata(virDomainObj *vm,
}
/* The domain is expected to be locked and inactive. Return -1 on normal
* failure, 1 if we skipped a disk due to try_all. */
static int
qemuDomainSnapshotForEachQcow2Raw(virDomainDef *def,
virDomainMomentObj *snap,
const char *op,
bool try_all,
int ndisks)
{
virDomainSnapshotDef *snapdef = virDomainSnapshotObjGetDef(snap);
size_t i;
bool skipped = false;
for (i = 0; i < ndisks; i++) {
g_autoptr(virCommand) cmd = virCommandNewArgList("qemu-img", "snapshot",
op, snap->def->name, NULL);
int format = virDomainDiskGetFormat(def->disks[i]);
/* FIXME: we also need to handle LVM here */
if (def->disks[i]->device != VIR_DOMAIN_DISK_DEVICE_DISK ||
snapdef->disks[i].snapshot != VIR_DOMAIN_SNAPSHOT_LOCATION_INTERNAL)
continue;
if (!virStorageSourceIsLocalStorage(def->disks[i]->src)) {
virReportError(VIR_ERR_OPERATION_INVALID,
_("can't manipulate inactive snapshots of disk '%1$s'"),
def->disks[i]->dst);
return -1;
}
if (format > 0 && format != VIR_STORAGE_FILE_QCOW2) {
if (try_all) {
/* Continue on even in the face of error, since other
* disks in this VM may have the same snapshot name.
*/
VIR_WARN("skipping snapshot action on %s",
def->disks[i]->dst);
skipped = true;
continue;
} else if (STREQ(op, "-c") && i) {
/* We must roll back partial creation by deleting
* all earlier snapshots. */
qemuDomainSnapshotForEachQcow2Raw(def, snap, "-d", false, i);
}
virReportError(VIR_ERR_OPERATION_INVALID,
_("Disk device '%1$s' does not support snapshotting"),
def->disks[i]->dst);
return -1;
}
virCommandAddArg(cmd, virDomainDiskGetSource(def->disks[i]));
if (virCommandRun(cmd, NULL) < 0) {
if (try_all) {
VIR_WARN("skipping snapshot action on %s",
def->disks[i]->dst);
skipped = true;
continue;
} else if (STREQ(op, "-c") && i) {
/* We must roll back partial creation by deleting
* all earlier snapshots. */
qemuDomainSnapshotForEachQcow2Raw(def, snap, "-d", false, i);
}
return -1;
}
}
return skipped ? 1 : 0;
}
/* The domain is expected to be locked and inactive. Return -1 on normal
* failure, 1 if we skipped a disk due to try_all. */
int
qemuDomainSnapshotForEachQcow2(virDomainDef *def,
virDomainMomentObj *snap,
const char *op,
bool try_all)
{
return qemuDomainSnapshotForEachQcow2Raw(def, snap, op, try_all, def->ndisks);
}
/* Hash iterator callback to discard multiple snapshots. */
int qemuDomainMomentDiscardAll(void *payload,
const char *name G_GNUC_UNUSED,

View File

@ -670,11 +670,6 @@ int qemuDomainSnapshotWriteMetadata(virDomainObj *vm,
virDomainXMLOption *xmlopt,
const char *snapshotDir);
int qemuDomainSnapshotForEachQcow2(virDomainDef *def,
virDomainMomentObj *snap,
const char *op,
bool try_all);
typedef struct _virQEMUMomentRemove virQEMUMomentRemove;
struct _virQEMUMomentRemove {
virQEMUDriver *driver;

View File

@ -249,12 +249,95 @@ qemuSnapshotCreateQcow2Files(virDomainDef *def,
}
/* The domain is expected to be locked and inactive. Return -1 on normal
* failure, 1 if we skipped a disk due to try_all. */
static int
qemuSnapshotForEachQcow2Internal(virDomainDef *def,
virDomainMomentObj *snap,
const char *op,
bool try_all,
int ndisks)
{
virDomainSnapshotDef *snapdef = virDomainSnapshotObjGetDef(snap);
size_t i;
bool skipped = false;
for (i = 0; i < ndisks; i++) {
g_autoptr(virCommand) cmd = virCommandNewArgList("qemu-img", "snapshot",
op, snap->def->name, NULL);
int format = virDomainDiskGetFormat(def->disks[i]);
/* FIXME: we also need to handle LVM here */
if (def->disks[i]->device != VIR_DOMAIN_DISK_DEVICE_DISK ||
snapdef->disks[i].snapshot != VIR_DOMAIN_SNAPSHOT_LOCATION_INTERNAL)
continue;
if (!virStorageSourceIsLocalStorage(def->disks[i]->src)) {
virReportError(VIR_ERR_OPERATION_INVALID,
_("can't manipulate inactive snapshots of disk '%1$s'"),
def->disks[i]->dst);
return -1;
}
if (format > 0 && format != VIR_STORAGE_FILE_QCOW2) {
if (try_all) {
/* Continue on even in the face of error, since other
* disks in this VM may have the same snapshot name.
*/
VIR_WARN("skipping snapshot action on %s",
def->disks[i]->dst);
skipped = true;
continue;
} else if (STREQ(op, "-c") && i) {
/* We must roll back partial creation by deleting
* all earlier snapshots. */
qemuSnapshotForEachQcow2Internal(def, snap, "-d", false, i);
}
virReportError(VIR_ERR_OPERATION_INVALID,
_("Disk device '%1$s' does not support snapshotting"),
def->disks[i]->dst);
return -1;
}
virCommandAddArg(cmd, virDomainDiskGetSource(def->disks[i]));
if (virCommandRun(cmd, NULL) < 0) {
if (try_all) {
VIR_WARN("skipping snapshot action on %s",
def->disks[i]->dst);
skipped = true;
continue;
} else if (STREQ(op, "-c") && i) {
/* We must roll back partial creation by deleting
* all earlier snapshots. */
qemuSnapshotForEachQcow2Internal(def, snap, "-d", false, i);
}
return -1;
}
}
return skipped ? 1 : 0;
}
/* The domain is expected to be locked and inactive. Return -1 on normal
* failure, 1 if we skipped a disk due to try_all. */
static int
qemuSnapshotForEachQcow2(virDomainDef *def,
virDomainMomentObj *snap,
const char *op,
bool try_all)
{
return qemuSnapshotForEachQcow2Internal(def, snap, op, try_all, def->ndisks);
}
/* The domain is expected to be locked and inactive. */
static int
qemuSnapshotCreateInactiveInternal(virDomainObj *vm,
virDomainMomentObj *snap)
{
return qemuDomainSnapshotForEachQcow2(vm->def, snap, "-c", false);
return qemuSnapshotForEachQcow2(vm->def, snap, "-c", false);
}
@ -2551,7 +2634,7 @@ qemuSnapshotInternalRevertInactive(virDomainObj *vm,
}
/* Try all disks, but report failure if we skipped any. */
if (qemuDomainSnapshotForEachQcow2(def, snap, "-a", true) != 0)
if (qemuSnapshotForEachQcow2(def, snap, "-a", true) != 0)
return -1;
return 0;
@ -3919,7 +4002,7 @@ qemuSnapshotDiscardImpl(virDomainObj *vm,
if (qemuSnapshotDiscardExternal(vm, snap, externalData) < 0)
return -1;
} else {
if (qemuDomainSnapshotForEachQcow2(def, snap, "-d", true) < 0)
if (qemuSnapshotForEachQcow2(def, snap, "-d", true) < 0)
return -1;
}
} else {