d759b5
From d108926463da19a2b025c845c60cfd78da850291 Mon Sep 17 00:00:00 2001
d759b5
Message-Id: <d108926463da19a2b025c845c60cfd78da850291@dist-git>
d759b5
From: Peter Krempa <pkrempa@redhat.com>
d759b5
Date: Fri, 16 Aug 2019 14:36:54 +0200
d759b5
Subject: [PATCH] qemu: Allow skipping some errors in qemuDomainStorageOpenStat
d759b5
MIME-Version: 1.0
d759b5
Content-Type: text/plain; charset=UTF-8
d759b5
Content-Transfer-Encoding: 8bit
d759b5
d759b5
Some callers of this function actually don't care about errors and reset
d759b5
it. The message is still logged which might irritate users in this case.
d759b5
d759b5
Add a boolean flag which will do few checks whether it actually makes
d759b5
sense to even try opening the storage file. For local files we check
d759b5
whether it exists and for remote files we at first see whether we even
d759b5
have a storage driver backend for it in the first place before trying to
d759b5
open it.
d759b5
d759b5
Other problems will still report errors but these are the most common
d759b5
scenarios which can happen here.
d759b5
d759b5
This patch changes the return value of the function so that the caller
d759b5
is able to differentiate the possibilities.
d759b5
d759b5
Signed-off-by: Peter Krempa <pkrempa@redhat.com>
d759b5
Reviewed-by: Ján Tomko <jtomko@redhat.com>
d759b5
(cherry picked from commit ba6c12df2ceb4df9bfb7ce95deef04f96bf29462)
d759b5
https: //bugzilla.redhat.com/show_bug.cgi?id=1724808
d759b5
Message-Id: <c69a26233c1520454496f823bd6cc39ff1e7b868.1565958905.git.pkrempa@redhat.com>
d759b5
Reviewed-by: Ján Tomko <jtomko@redhat.com>
d759b5
---
d759b5
 src/qemu/qemu_driver.c | 20 +++++++++++++++-----
d759b5
 1 file changed, 15 insertions(+), 5 deletions(-)
d759b5
d759b5
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
d759b5
index 8ecdcf3440..91eeb05319 100644
d759b5
--- a/src/qemu/qemu_driver.c
d759b5
+++ b/src/qemu/qemu_driver.c
d759b5
@@ -11778,6 +11778,7 @@ qemuDomainMemoryPeek(virDomainPtr dom,
d759b5
  * @src: storage source data
d759b5
  * @ret_fd: pointer to return open'd file descriptor
d759b5
  * @ret_sb: pointer to return stat buffer (local or remote)
d759b5
+ * @skipInaccessible: Don't report error if files are not accessible
d759b5
  *
d759b5
  * For local storage, open the file using qemuOpenFile and then use
d759b5
  * fstat() to grab the stat struct data for the caller.
d759b5
@@ -11785,7 +11786,9 @@ qemuDomainMemoryPeek(virDomainPtr dom,
d759b5
  * For remote storage, attempt to access the file and grab the stat
d759b5
  * struct data if the remote connection supports it.
d759b5
  *
d759b5
- * Returns 0 on success with @ret_fd and @ret_sb populated, -1 on failure
d759b5
+ * Returns 1 if @src was successfully opened (@ret_fd and @ret_sb is populated),
d759b5
+ * 0 if @src can't be opened and @skipInaccessible is true (no errors are
d759b5
+ * reported) or -1 otherwise (errors are reported).
d759b5
  */
d759b5
 static int
d759b5
 qemuDomainStorageOpenStat(virQEMUDriverPtr driver,
d759b5
@@ -11793,9 +11796,13 @@ qemuDomainStorageOpenStat(virQEMUDriverPtr driver,
d759b5
                           virDomainObjPtr vm,
d759b5
                           virStorageSourcePtr src,
d759b5
                           int *ret_fd,
d759b5
-                          struct stat *ret_sb)
d759b5
+                          struct stat *ret_sb,
d759b5
+                          bool skipInaccessible)
d759b5
 {
d759b5
     if (virStorageSourceIsLocalStorage(src)) {
d759b5
+        if (skipInaccessible && !virFileExists(src->path))
d759b5
+            return 0;
d759b5
+
d759b5
         if ((*ret_fd = qemuOpenFile(driver, vm, src->path, O_RDONLY,
d759b5
                                     NULL)) < 0)
d759b5
             return -1;
d759b5
@@ -11806,6 +11813,9 @@ qemuDomainStorageOpenStat(virQEMUDriverPtr driver,
d759b5
             return -1;
d759b5
         }
d759b5
     } else {
d759b5
+        if (skipInaccessible && virStorageFileSupportsBackingChainTraversal(src) <= 0)
d759b5
+            return 0;
d759b5
+
d759b5
         if (virStorageFileInitAs(src, cfg->user, cfg->group) < 0)
d759b5
             return -1;
d759b5
 
d759b5
@@ -11817,7 +11827,7 @@ qemuDomainStorageOpenStat(virQEMUDriverPtr driver,
d759b5
         }
d759b5
     }
d759b5
 
d759b5
-    return 0;
d759b5
+    return 1;
d759b5
 }
d759b5
 
d759b5
 
d759b5
@@ -11852,7 +11862,7 @@ qemuDomainStorageUpdatePhysical(virQEMUDriverPtr driver,
d759b5
     if (virStorageSourceIsEmpty(src))
d759b5
         return 0;
d759b5
 
d759b5
-    if (qemuDomainStorageOpenStat(driver, cfg, vm, src, &fd, &sb) < 0)
d759b5
+    if (qemuDomainStorageOpenStat(driver, cfg, vm, src, &fd, &sb, false) < 0)
d759b5
         return -1;
d759b5
 
d759b5
     ret = virStorageSourceUpdatePhysicalSize(src, fd, &sb);
d759b5
@@ -11903,7 +11913,7 @@ qemuStorageLimitsRefresh(virQEMUDriverPtr driver,
d759b5
     char *buf = NULL;
d759b5
     ssize_t len;
d759b5
 
d759b5
-    if (qemuDomainStorageOpenStat(driver, cfg, vm, src, &fd, &sb) < 0)
d759b5
+    if (qemuDomainStorageOpenStat(driver, cfg, vm, src, &fd, &sb, false) < 0)
d759b5
         goto cleanup;
d759b5
 
d759b5
     if (virStorageSourceIsLocalStorage(src)) {
d759b5
-- 
d759b5
2.22.1
d759b5