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@xxxxxxxxxx> > --- > 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@xxxxxxxxxx>