[libvirt] [PATCHv3 07/36] storage: Switch metadata crawler to use storage driver to get unique path

Roman Bogorodskiy bogorodskiy at gmail.com
Mon Jun 9 14:07:33 UTC 2014


  Peter Krempa wrote:

> On 06/07/14 20:35, Roman Bogorodskiy wrote:
> >   Peter Krempa wrote:
> > 
> >> Use the virStorageFileGetUniqueIdentifier() function to get a unique
> >> identifier regardless of the target storage type instead of relying on
> >> canonicalize_path().
> >>
> >> A new function that checks whether we support a given image is
> >> introduced to avoid errors for unimplemented backends.
> >> ---
> >>
> >> Notes:
> >>     Version 3:
> >>     - fixed typo
> >>     - ACKed by Eric
> >>
> >>  src/storage/storage_driver.c | 77 +++++++++++++++++++++++++++++++-------------
> >>  1 file changed, 54 insertions(+), 23 deletions(-)
> >>
> >> diff --git a/src/storage/storage_driver.c b/src/storage/storage_driver.c
> >> index f92a553..5c4188f 100644
> >> --- a/src/storage/storage_driver.c
> >> +++ b/src/storage/storage_driver.c
> 
> >> @@ -3112,49 +3135,63 @@ virStorageFileGetMetadataRecurse(virStorageSourcePtr src,
> >>      int fd;
> >>      int ret = -1;
> >>      struct stat st;
> >> +    const char *uniqueName;
> >>      virStorageSourcePtr backingStore = NULL;
> >>      int backingFormat;
> >>
> >> -    VIR_DEBUG("path=%s canonPath=%s dir=%s format=%d uid=%d gid=%d probe=%d",
> >> -              src->path, canonPath, NULLSTR(src->relDir), src->format,
> >> +    VIR_DEBUG("path=%s dir=%s format=%d uid=%d gid=%d probe=%d",
> >> +              src->path, NULLSTR(src->relDir), src->format,
> >>                (int)uid, (int)gid, allow_probe);
> >>
> >> -    if (virHashLookup(cycle, canonPath)) {
> >> -        virReportError(VIR_ERR_INTERNAL_ERROR,
> >> -                       _("backing store for %s is self-referential"),
> >> -                       src->path);
> >> +    /* exit if we can't load information about the current image */
> >> +    if (!virStorageFileSupportsBackingChainTraversal(src))
> >> +        return 0;
> > 
> > After this change I get virstrogetest failing on FreeBSD, which doesn't
> > support any of the file storage backends currently:
> > 
> > 
> > Program received signal SIGSEGV, Segmentation fault.
> > [Switching to Thread 806c06400 (LWP 100061/virstoragetest)]
> > 0x0000000000410088 in mymain () at virstoragetest.c:937
> > 937         TEST_LOOKUP(3, "qcow2", chain->backingStore->path,
> > chain->backingStore,
> > Current language:  auto; currently minimal
> > (gdb) p chain
> > $1 = 0x806c7b100
> > (gdb) p chain->backingStore
> > $2 = 0x0
> > (gdb) 
> > 
> > 
> 
> Hmm, so FreeBSD doesn't currently compile the storage driver? We should
> probably look into enabling it. All the stuff that was done by the code
> was compiling just fine on FreeBSD previously so enabling just the local
> filesystem storage backend should work well. I'll have a look what that
> would include.

virstorage.c test calls testStorageFileGetMetadata() which calls
virStorageFileGetMetadata().

Inside of that, the call sequence is:

virStorageFileGetMetadata -> virStorageFileGetMetadataRecurse

virStorageFileGetMetadataRecurse then checks
!virStorageFileSupportsBackingChainTraversal() and returns 0.

virStorageFileSupportsBackingChainTraversal tries to initialise backend
using virStorageFileBackendForTypeInternal().

virStorageFileBackendForTypeInternal loops through fileBackends which
looks this way:

static virStorageFileBackendPtr fileBackends[] = {
#if WITH_STORAGE_FS
    &virStorageFileBackendFile,
    &virStorageFileBackendBlock,
#endif
#if WITH_STORAGE_GLUSTER
    &virStorageFileBackendGluster,
#endif
    NULL 
};

FreeBSD doesn't support neither WITH_STORAGE_GLUSTER nor WITH_STORAGE_FS. So
we end up having chain->backingStore == NULL.

PS I may be wrong here as it's my first experience with the storage code
and I haven't yet spend much time on it.

Roman Bogorodskiy
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 488 bytes
Desc: not available
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20140609/2091577d/attachment-0001.sig>


More information about the libvir-list mailing list