# util/virstoragefile.h
+virStorageFileChainGetBroken;
virStorageFileChainLookup;
virStorageFileFeatureTypeFromString;
virStorageFileFeatureTypeToString;
priv->ncleanupCallbacks_max = 0;
}
+int
+qemuDiskChainCheckBroken(virDomainDiskDefPtr disk)
+{
+ char *brokenFile = NULL;
+
+ if (!disk->src || !disk->backingChain)
+ return 0;
+
+ if (virStorageFileChainGetBroken(disk->backingChain, &brokenFile) < 0)
+ return -1;
+
+ if (brokenFile) {
+ virReportError(VIR_ERR_INVALID_ARG,
+ _("Backing file '%s' of image '%s' is missing."),
+ brokenFile, disk->src);
+ VIR_FREE(brokenFile);
+ return -1;
+ }
+
+ return 0;
+}
+
int
qemuDomainDetermineDiskChain(virQEMUDriverPtr driver,
virDomainDiskDefPtr disk,
int qemuDomainCheckDiskPresence(virQEMUDriverPtr driver,
virDomainObjPtr vm,
bool start_with_state);
+
+int qemuDiskChainCheckBroken(virDomainDiskDefPtr disk);
+
int qemuDomainDetermineDiskChain(virQEMUDriverPtr driver,
virDomainDiskDefPtr disk,
bool force);
goto cleanup;
}
+ if (virFileAccessibleAs(combined, F_OK, getuid(), getgid()) < 0) {
+ virReportSystemError(errno,
+ _("Cannot access backing file '%s'"),
+ combined);
+ goto cleanup;
+ }
+
if (!(*canonical = canonicalize_file_name(combined))) {
virReportSystemError(errno,
_("Can't canonicalize path '%s'"), path);
return ret;
}
+/**
+ * virStorageFileChainCheckBroken
+ *
+ * If CHAIN is broken, set *brokenFile to the broken file name,
+ * otherwise set it to NULL. Caller MUST free *brokenFile after use.
+ * Return 0 on success, negative on error.
+ */
+int
+virStorageFileChainGetBroken(virStorageFileMetadataPtr chain,
+ char **brokenFile)
+{
+ virStorageFileMetadataPtr tmp;
+ int ret = -1;
+
+ if (!chain)
+ return 0;
+
+ *brokenFile = NULL;
+
+ tmp = chain;
+ while (tmp) {
+ /* Break if no backing store or backing store is not file */
+ if (!tmp->backingStoreRaw)
+ break;
+ if (!tmp->backingStore) {
+ if (VIR_STRDUP(*brokenFile, tmp->backingStoreRaw) < 0)
+ goto error;
+ break;
+ }
+ tmp = tmp->backingMeta;
+ }
+
+ ret = 0;
+
+error:
+ return ret;
+}
+
+
/**
* virStorageFileFreeMetadata:
*
virStorageFileMetadataPtr virStorageFileGetMetadataFromFD(const char *path,
int fd,
int format);
+int virStorageFileChainGetBroken(virStorageFileMetadataPtr chain,
+ char **broken_file);
const char *virStorageFileChainLookup(virStorageFileMetadataPtr chain,
const char *start,