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