[libvirt] [PATCH 2/5] conf: expose probe for non-local storage

Eric Blake eblake at redhat.com
Thu Apr 10 03:41:35 UTC 2014


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 at redhat.com>
---
 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




More information about the libvir-list mailing list