diff -uNrp libvirt-0.9.7.orig/src/qemu/qemu_driver.c libvirt-0.9.7/src/qemu/qemu_driver.c --- libvirt-0.9.7.orig/src/qemu/qemu_driver.c 2011-10-31 12:46:04.000000000 +0900 +++ libvirt-0.9.7/src/qemu/qemu_driver.c 2011-11-07 13:03:07.162639142 +0900 @@ -8976,6 +8976,25 @@ cleanup: return ret; } +static int ATTRIBUTE_NONNULL(1) +qemuDomainSnapshotCheckSrcQcow2(const char *src) +{ + const char *qemuimgarg[] = {NULL, "check", "-f", "qcow2", NULL, NULL}; + int ret = -1; + + qemuimgarg[0] = virFindFileInPath("qemu-img"); + if (!qemuimgarg[0]) { + qemuReportError(VIR_ERR_INTERNAL_ERROR, + "%s", _("unable to find qemu-img")); + return ret; + } + qemuimgarg[4] = src; + + ret = virRun(qemuimgarg, NULL); + VIR_FREE(qemuimgarg[0]); + return ret; +} + /* The domain is expected to hold monitor lock. */ static int qemuDomainSnapshotCreateSingleDiskActive(struct qemud_driver *driver, @@ -9002,6 +9021,13 @@ qemuDomainSnapshotCreateSingleDiskActive return -1; } + ret = qemuDomainSnapshotCheckSrcQcow2(src->disk); + if (ret) { + qemuReportError(VIR_ERR_INTERNAL_ERROR, + "%s", _("src image is not qcow2 format")); + return ret; + } + if (virAsprintf(&device, "drive-%s", disk->info.alias) < 0 || !(source = strdup(snap->file)) || (STRNEQ_NULLABLE(disk->driverType, "qcow2") &&