[libvirt] [PATCH 2/4] qemu: report error if disk backing files doesn't exist
Guannan Ren
gren at redhat.com
Fri Jul 26 12:43:45 UTC 2013
On 07/25/2013 10:17 PM, Martin Kletzander wrote:
> On 07/18/2013 01:32 PM, Guannan Ren wrote:
>
> s/doesn't/don't/ in $SUBJ
>
>> Adding virFileAccessibleAs() to check if the backing file described in
>> disk meta exist in real path. If not, report error. The uid and gid
>> arguments don't take effect on F_OK mode for access, so use gid and gid
>> of current process.
>>
> This patch doesn't break anything new, but thanks to the
> getuid()/getgid(), it leaves the previous problem in the code. Even
> though F_OK doesn't need uid/gid to check whether the file exists, root
> may not have permissions for upper directories on NFS storage for
> example, so ...
>
>> ---
>> src/util/virstoragefile.c | 23 +++++++++++++++--------
>> tests/virstoragetest.c | 16 ++++++++--------
>> 2 files changed, 23 insertions(+), 16 deletions(-)
>>
>> diff --git a/src/util/virstoragefile.c b/src/util/virstoragefile.c
>> index cb6df91..b678eb8 100644
>> --- a/src/util/virstoragefile.c
>> +++ b/src/util/virstoragefile.c
>> @@ -572,6 +572,13 @@ virFindBackingFile(const char *start, bool start_is_dir, const char *path,
>> goto cleanup;
>> }
>>
>> + if (virFileAccessibleAs(combined, F_OK, getuid(), getgid()) < 0) {
>> + virReportSystemError(errno,
>> + _("Backing file '%s' does not exist"),
>> + combined);
>> + goto cleanup;
>> + }
>> +
>> if (!(*canonical = canonicalize_file_name(combined))) {
>> virReportSystemError(errno,
>> _("Can't canonicalize path '%s'"), path);
> ... this hunk does make the code report better errors, but in the future
> it should canonicalize the filename using root/qemu/domain users.
>
> ACK to this hunk, with the error reworded (e.g. "Cannot access backing
> file %s") and, of course, commit message changed appropriately, but ...
>
>> @@ -857,14 +864,10 @@ virStorageFileGetMetadataInternal(const char *path,
>> !!directory, backing,
>> &meta->directory,
>> &meta->backingStore) < 0) {
>> - /* the backing file is (currently) unavailable, treat this
>> - * file as standalone:
>> - * backingStoreRaw is kept to mark broken image chains */
>> - meta->backingStoreIsFile = false;
>> - backingFormat = VIR_STORAGE_FILE_NONE;
>> - VIR_WARN("Backing file '%s' of image '%s' is missing.",
>> - meta->backingStoreRaw, path);
>> -
>> + VIR_FREE(backing);
>> + VIR_ERROR(_("Backing file '%s' of image '%s' is missing."),
>> + meta->backingStoreRaw, path);
>> + goto cleanup;
> To fix a pre-existing error, we should (instead of this change) just add
> virResetLastError() here as the error is used somewhere else in the code
> and should be kept in virFindBackingFile(). Having it in the logs seems
> OK to me.
>
It makes sense, but it seems that the tests/virstoragetest.c testcase is
using the
last error in checking warning flag, see:
if (data->flags & EXP_WARN) {
if (!virGetLastError()) {
fprintf(stderr, "call should have warned\n");
goto cleanup;
}
virResetLastError();
It is not serious issue without calling virResetLastError() here.
More information about the libvir-list
mailing list