
On Thu, Jan 05, 2023 at 12:46:48 +0100, Pavel Hrdina wrote:
Looks up disk storage source within storage source chain using storage source object instead of path to make it work with all disk types.
Signed-off-by: Pavel Hrdina <phrdina@redhat.com> --- src/libvirt_private.syms | 1 + src/storage_file/storage_source.c | 39 +++++++++++++++++++++++++++++++ src/storage_file/storage_source.h | 6 +++++ 3 files changed, 46 insertions(+)
[...]
diff --git a/src/storage_file/storage_source.c b/src/storage_file/storage_source.c index ab0cdf2b12..a15d766bec 100644 --- a/src/storage_file/storage_source.c +++ b/src/storage_file/storage_source.c @@ -322,6 +322,45 @@ virStorageSourceChainLookup(virStorageSource *chain, }
+/** + * virStorageSourceChainLookupBySource: + * @chain: chain top to look in + * @base: stourage source to look for in @chain
s/stourage/storage/
+ * @parent: Filled with parent virStorageSource of the returned value if non-NULL. + * + * Looks up a storage source definition corresponding to @base in @chain. + * + * Returns virStorageSource withing chain or NULL if not found. + */ +virStorageSource * +virStorageSourceChainLookupBySource(virStorageSource *chain, + virStorageSource *base, + virStorageSource **parent) +{ + virStorageSource *prev = NULL; + + if (parent) + *parent = NULL; + + while (virStorageSourceIsBacking(chain)) { + if (virStorageSourceIsSameLocation(chain, base)) + break; + + prev = chain; + chain = chain->backingStore; + } + + if (!virStorageSourceIsBacking(chain)) { + virReportError(VIR_ERR_INVALID_ARG, "%s", + _("could not find base disk source in disk source chain")); + return NULL; + } + + *parent = prev;
The comment specifies that passing a pointer for 'parent' is optional but here you hard-dereference it always. Add the same condition as at the beginning. Reviewed-by: Peter Krempa <pkrempa@redhat.com>