[libvirt] [PATCH 3/6] conf: report error on chain lookup failure
Eric Blake
eblake at redhat.com
Sat Apr 12 04:04:33 UTC 2014
On 04/11/2014 01:12 PM, John Ferlan wrote:
>
>
> On 04/11/2014 12:21 AM, Eric Blake wrote:
>> The chain lookup function was inconsistent on whether it left
>> a message in the log when looking up a name that is not found
>> on the chain (leaving a message for OOM or if name was
>> relative but not part of the chain), and could litter the log
>> even when successful (when name was relative but deep in the
>> chain, use of virFindBackingFile early in the chain would complain
>> about a file not found). It's easier to make the function
>> consistently emit a message exactly once on failure, and to let
>> all callers rely on the clean semantics.
>>
>> base_canon = top_meta->backingStore;
>> } else if (!(base_canon = virStorageFileChainLookup(top_meta, top_canon,
>> - base, NULL, NULL))) {
>> - virReportError(VIR_ERR_INVALID_ARG,
>> - _("could not find base '%s' below '%s' in chain "
>> - "for '%s'"),
>> - base ? base : "(default)", top_canon, path);
>> + base, NULL, NULL)))
>> goto endjob;
>> - }
>
> Does removal of {} violate the one line "rule of thumb"...
Eww, I did indeed break the double {} rule.
>> error:
>> + virReportError(VIR_ERR_INVALID_ARG,
>> + _("could not find image '%s' in chain for '%s'"),
>> + name, start);
>
> Looking at the context of the code expanded out a bit... there's a few
> checks for !name = can we get here with name == NULL? Looking ahead to
> patch 4 this will be more important...
Indeed, callers can pass NULL; I'll improve it.
>
> ACK - seems reasonable, just address the possible NULL name...
Pushing with this added:
diff --git i/src/qemu/qemu_driver.c w/src/qemu/qemu_driver.c
index b8cfe27..fed7d1c 100644
--- i/src/qemu/qemu_driver.c
+++ w/src/qemu/qemu_driver.c
@@ -15354,11 +15354,12 @@ qemuDomainBlockCommit(virDomainPtr dom, const
char *path, const char *base,
top_canon, path);
goto endjob;
}
- if (!base && (flags & VIR_DOMAIN_BLOCK_COMMIT_SHALLOW)) {
+ if (!base && (flags & VIR_DOMAIN_BLOCK_COMMIT_SHALLOW))
base_canon = top_meta->backingStore;
- } else if (!(base_canon = virStorageFileChainLookup(top_meta,
top_canon,
- base, NULL, NULL)))
+ else if (!(base_canon = virStorageFileChainLookup(top_meta, top_canon,
+ base, NULL, NULL)))
goto endjob;
+
/* Note that this code exploits the fact that
* virStorageFileChainLookup guarantees a simple pointer
* comparison will work, rather than needing full-blown STREQ. */
diff --git i/src/util/virstoragefile.c w/src/util/virstoragefile.c
index 66a6ab1..77cc878 100644
--- i/src/util/virstoragefile.c
+++ w/src/util/virstoragefile.c
@@ -1588,9 +1588,14 @@
virStorageFileChainLookup(virStorageFileMetadataPtr chain, const char
*start,
return owner->backingStore;
error:
- virReportError(VIR_ERR_INVALID_ARG,
- _("could not find image '%s' in chain for '%s'"),
- name, start);
+ if (name)
+ virReportError(VIR_ERR_INVALID_ARG,
+ _("could not find image '%s' in chain for '%s'"),
+ name, start);
+ else
+ virReportError(VIR_ERR_INVALID_ARG,
+ _("could not find base image in chain for '%s'"),
+ start);
*parent = NULL;
if (meta)
*meta = NULL;
--
Eric Blake eblake redhat com +1-919-301-3266
Libvirt virtualization library http://libvirt.org
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 604 bytes
Desc: OpenPGP digital signature
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20140411/765428dd/attachment-0001.sig>
More information about the libvir-list
mailing list