Deciding if a user string represents a local file instead of a network path is an operation worth exposing directly, particularly since the next patch will be removing a redundant variable that was caching the information. * src/util/virstoragefile.h (virStorageIsFile): New declaration. * src/util/virstoragefile.c (virBackingStoreIsFile): Rename... (virStorageIsFile): ...export, and allow NULL input. (virStorageFileGetMetadataInternal) (virStorageFileGetMetadataRecurse, virStorageFileGetMetadata): Update callers. * src/conf/domain_conf.c (virDomainDiskDefForeachPath): Use it. * src/storage/storage_backend_fs.c (virStorageBackendProbeTarget): Likewise. * src/libvirt_private.syms (virstoragefile.h): Export function. Signed-off-by: Eric Blake <eblake@xxxxxxxxxx> --- src/conf/domain_conf.c | 2 +- src/libvirt_private.syms | 1 + src/storage/storage_backend_fs.c | 2 +- src/util/virstoragefile.c | 20 +++++++++++++------- src/util/virstoragefile.h | 1 + 5 files changed, 17 insertions(+), 9 deletions(-) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 1c4f9d2..726c8ba 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -18565,7 +18565,7 @@ virDomainDiskDefForeachPath(virDomainDiskDefPtr disk, goto cleanup; tmp = disk->backingChain; - while (tmp && tmp->backingStoreIsFile) { + while (tmp && virStorageIsFile(tmp->backingStore)) { if (!ignoreOpenFailure && !tmp->backingMeta) { virReportError(VIR_ERR_INTERNAL_ERROR, _("unable to visit backing chain file %s"), diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 9c189dc..cd43335 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -1833,6 +1833,7 @@ virStorageFileIsClusterFS; virStorageFileProbeFormat; virStorageFileProbeFormatFromBuf; virStorageFileResize; +virStorageIsFile; virStorageNetHostDefClear; virStorageNetHostDefCopy; virStorageNetHostDefFree; diff --git a/src/storage/storage_backend_fs.c b/src/storage/storage_backend_fs.c index bb20385..5730e3b 100644 --- a/src/storage/storage_backend_fs.c +++ b/src/storage/storage_backend_fs.c @@ -118,7 +118,7 @@ virStorageBackendProbeTarget(virStorageSourcePtr target, *backingStore = meta->backingStore; meta->backingStore = NULL; if (meta->backingStoreFormat == VIR_STORAGE_FILE_AUTO && - meta->backingStoreIsFile) { + virStorageIsFile(*backingStore)) { if ((ret = virStorageFileProbeFormat(*backingStore, -1, -1)) < 0) { /* If the backing file is currently unavailable, only log an error, * but continue. Returning -1 here would disable the whole storage diff --git a/src/util/virstoragefile.c b/src/util/virstoragefile.c index 7a91a01..cb66da4 100644 --- a/src/util/virstoragefile.c +++ b/src/util/virstoragefile.c @@ -688,11 +688,17 @@ virStorageFileMatchesVersion(int format, return false; } -static bool -virBackingStoreIsFile(const char *backing) +bool +virStorageIsFile(const char *backing) { - char *colon = strchr(backing, ':'); - char *slash = strchr(backing, '/'); + char *colon; + char *slash; + + if (!backing) + return false; + + colon = strchr(backing, ':'); + slash = strchr(backing, '/'); /* Reject anything that looks like a protocol (such as nbd: or * rbd:); if someone really does want a relative file name that @@ -866,7 +872,7 @@ virStorageFileGetMetadataInternal(const char *path, VIR_FREE(backing); goto cleanup; } - if (virBackingStoreIsFile(backing)) { + if (virStorageIsFile(backing)) { meta->backingStoreIsFile = true; meta->backingStoreRaw = meta->backingStore; meta->backingStore = NULL; @@ -1146,7 +1152,7 @@ virStorageFileGetMetadataRecurse(const char *path, const char *canonPath, if (virHashAddEntry(cycle, canonPath, (void *)1) < 0) return -1; - if (virBackingStoreIsFile(path)) { + if (virStorageIsFile(path)) { if ((fd = virFileOpenAs(canonPath, O_RDONLY, 0, uid, gid, 0)) < 0) { virReportSystemError(-fd, _("Failed to open file '%s'"), path); return -1; @@ -1235,7 +1241,7 @@ virStorageFileGetMetadata(const char *path, int format, if (!cycle) return NULL; - if (virBackingStoreIsFile(path)) { + if (virStorageIsFile(path)) { if (!(canonPath = canonicalize_file_name(path))) { virReportSystemError(errno, _("unable to resolve '%s'"), path); goto cleanup; diff --git a/src/util/virstoragefile.h b/src/util/virstoragefile.h index 4192140..6c08c31 100644 --- a/src/util/virstoragefile.h +++ b/src/util/virstoragefile.h @@ -315,6 +315,7 @@ int virStorageFileResize(const char *path, bool pre_allocate); int virStorageFileIsClusterFS(const char *path); +bool virStorageIsFile(const char *path); int virStorageFileGetLVMKey(const char *path, char **key); -- 1.9.0 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list