Use the new storage driver based "stat" api to detect exiting files just
as we did with local files.
---
Notes:
Version 5:
- new in sereis
src/qemu/qemu_driver.c | 59 +++++++++++++++++++++++---------------------------
1 file changed, 27 insertions(+), 32 deletions(-)
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index b94382d..eec2a44 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -12366,7 +12366,6 @@
qemuDomainSnapshotPrepareDiskExternalOverlayInactive(virDomainSnapshotDiskDefPtr
}
-
static int
qemuDomainSnapshotPrepareDiskExternal(virConnectPtr conn,
virDomainDiskDefPtr disk,
@@ -12374,7 +12373,8 @@ qemuDomainSnapshotPrepareDiskExternal(virConnectPtr conn,
bool active,
bool reuse)
{
- int actualType;
+ virStorageFilePtr snapfile = NULL;
+ int ret = -1;
struct stat st;
if (qemuTranslateSnapshotDiskSourcePool(conn, snapdisk) < 0)
@@ -12397,40 +12397,35 @@ qemuDomainSnapshotPrepareDiskExternal(virConnectPtr conn,
return -1;
}
- actualType = qemuSnapshotDiskGetActualType(snapdisk);
+ if (!(snapfile = virStorageFileInitFromSnapshotDef(conn, snapdisk)))
+ return -1;
- switch ((enum virDomainDiskType) actualType) {
- case VIR_DOMAIN_DISK_TYPE_BLOCK:
- case VIR_DOMAIN_DISK_TYPE_FILE:
- if (stat(snapdisk->file, &st) < 0) {
- if (errno != ENOENT) {
- virReportSystemError(errno,
- _("unable to stat for disk %s: %s"),
- snapdisk->name, snapdisk->file);
- return -1;
- } else if (reuse) {
- virReportSystemError(errno,
- _("missing existing file for disk %s:
%s"),
- snapdisk->name, snapdisk->file);
- return -1;
- }
- } else if (!S_ISBLK(st.st_mode) && st.st_size && !reuse) {
- virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
- _("external snapshot file for disk %s already "
- "exists and is not a block device: %s"),
- snapdisk->name, snapdisk->file);
- return -1;
+ if (virStorageFileStat(snapfile, &st) < 0) {
+ if (errno != ENOENT) {
+ virReportSystemError(errno,
+ _("unable to stat for disk %s: %s"),
+ snapdisk->name, snapdisk->file);
+ goto cleanup;
+ } else if (reuse) {
+ virReportSystemError(errno,
+ _("missing existing file for disk %s: %s"),
+ snapdisk->name, snapdisk->file);
+ goto cleanup;
}
- break;
-
- case VIR_DOMAIN_DISK_TYPE_NETWORK:
- case VIR_DOMAIN_DISK_TYPE_DIR:
- case VIR_DOMAIN_DISK_TYPE_VOLUME:
- case VIR_DOMAIN_DISK_TYPE_LAST:
- break;
+ } else if (!S_ISBLK(st.st_mode) && st.st_size && !reuse) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+ _("external snapshot file for disk %s already "
+ "exists and is not a block device: %s"),
+ snapdisk->name, snapdisk->file);
+ goto cleanup;
}
- return 0;
+ ret = 0;
+
+cleanup:
+ virStorageFileFree(snapfile);
+
+ return ret;;
}
--
1.8.5.3