[libvirt] [PATCHv3 07/36] storage: Switch metadata crawler to use storage driver to get unique path
Roman Bogorodskiy
bogorodskiy at gmail.com
Wed Jun 11 18:14:31 UTC 2014
Peter Krempa wrote:
> On 06/09/14 16:07, Roman Bogorodskiy wrote:
> > 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.
>
> Yes, the problem is that VIR_STORAGE_FS isn't enabled on freebsd.
>
> I don't know whether it's worth analyzing the code to find out if it can
> be enabled on freebsd or not. (the needed portions certainly can be
> enabled, but some of the other portions might be problematic.
Providing a fully functional virStorageBackendFileSystem backend will
certainly require some effort, at least getmntent_r() part and mouting
part needs to be re-implemnented for BSD.
I'll probably take a look later.
>
> At any rate, I'm working on a refactor of the test that will allow to
> skip the test (and remove a few ugly pieces of code)
Thanks!
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/20140611/714c5647/attachment-0001.sig>
More information about the libvir-list
mailing list