Am Thu, 26 Oct 2017 15:28:18 +0000 (UTC)
Alan Somers <asom...@freebsd.org> schrieb:

> Author: asomers
> Date: Thu Oct 26 15:28:18 2017
> New Revision: 325011
> URL: https://svnweb.freebsd.org/changeset/base/325011
> 
> Log:
>   zfsd should be able to online an L2ARC that disappears and returns
>   
>   Previously, this didn't work because L2ARC devices' labels don't contain
>   pool GUIDs.  Modify zfsd so that the pool GUID won't be required:
>   
>   lib/libdevdctl/guid.h
>       Change INVALID_GUID from a uint64_t constant to a function that
>       returns an invalid Guid object.  Remove the void constructor.
>       Nothing uses it, and it violates RAII.
>   
>   cddl/usr.sbin/zfsd/case_file.h
>   cddl/usr.sbin/zfsd/case_file.cc
>       Allow CaseFile::Find to match a CaseFile based on Vdev GUID alone.
>       In CaseFile::ReEvaluate, attempt to online devices even if the newly
>       arrived device has no pool GUID.
>   
>   cddl/usr.sbin/zfsd/vdev_iterator.cc
>       Iterate through a pool's cache devices as well as its regular
>       devices.
>   
>   Reported by:        avg
>   Reviewed by:        avg
>   MFC after:  3 weeks
>   Sponsored by:       Spectra Logic Corp
>   Differential Revision:      https://reviews.freebsd.org/D12791
> 
> Modified:
>   head/cddl/usr.sbin/zfsd/case_file.cc
>   head/cddl/usr.sbin/zfsd/case_file.h
>   head/cddl/usr.sbin/zfsd/vdev_iterator.cc
>   head/lib/libdevdctl/guid.h
> 
> Modified: head/cddl/usr.sbin/zfsd/case_file.cc
> ==============================================================================
> --- head/cddl/usr.sbin/zfsd/case_file.cc      Thu Oct 26 13:23:13 2017
> (r325010) +++ head/cddl/usr.sbin/zfsd/case_file.cc    Thu Oct 26 15:28:18
> 2017  (r325011) @@ -102,7 +102,8 @@ CaseFile::Find(Guid poolGUID, Guid 
> vdevGUID)
>       for (CaseFileList::iterator curCase = s_activeCases.begin();
>            curCase != s_activeCases.end(); curCase++) {
>  
> -             if ((*curCase)->PoolGUID() != poolGUID
> +             if (((*curCase)->PoolGUID() != poolGUID
> +               && Guid::InvalidGuid() != poolGUID)
>                || (*curCase)->VdevGUID() != vdevGUID)
>                       continue;
>  
> @@ -268,7 +269,8 @@ CaseFile::ReEvaluate(const string &devPath, const stri
>       }
>  
>       if (vdev != NULL
> -      && vdev->PoolGUID() == m_poolGUID
> +      && ( vdev->PoolGUID() == m_poolGUID
> +        || vdev->PoolGUID() == Guid::InvalidGuid())
>        && vdev->GUID() == m_vdevGUID) {
>  
>               zpool_vdev_online(pool, vdev->GUIDString().c_str(),
> 
> Modified: head/cddl/usr.sbin/zfsd/case_file.h
> ==============================================================================
> --- head/cddl/usr.sbin/zfsd/case_file.h       Thu Oct 26 13:23:13 2017        
> (r325010)
> +++ head/cddl/usr.sbin/zfsd/case_file.h       Thu Oct 26 15:28:18 2017        
> (r325011)
> @@ -89,6 +89,8 @@ class CaseFile (public)
>        * \brief Find a CaseFile object by a vdev's pool/vdev GUID tuple.
>        *
>        * \param poolGUID  Pool GUID for the vdev of the CaseFile to find.
> +      *                  If InvalidGuid, then only match the vdev GUID
> +      *                  instead of both pool and vdev GUIDs.
>        * \param vdevGUID  Vdev GUID for the vdev of the CaseFile to find.
>        *
>        * \return  If found, a pointer to a valid CaseFile object.
> 
> Modified: head/cddl/usr.sbin/zfsd/vdev_iterator.cc
> ==============================================================================
> --- head/cddl/usr.sbin/zfsd/vdev_iterator.cc  Thu Oct 26 13:23:13 2017
> (r325010) +++ head/cddl/usr.sbin/zfsd/vdev_iterator.cc        Thu Oct 26 
> 15:28:18
> 2017  (r325011) @@ -76,7 +76,9 @@ void
>  VdevIterator::Reset()
>  {
>       nvlist_t  *rootVdev;
> +     nvlist    **cache_child;
>       int        result;
> +     uint_t   cache_children;
>  
>       result = nvlist_lookup_nvlist(m_poolConfig,
>                                     ZPOOL_CONFIG_VDEV_TREE,
> @@ -85,6 +87,13 @@ VdevIterator::Reset()
>               throw ZfsdException(m_poolConfig, "Unable to extract "
>                                   "ZPOOL_CONFIG_VDEV_TREE from pool.");
>       m_vdevQueue.assign(1, rootVdev);
> +     result = nvlist_lookup_nvlist_array(rootVdev,
> +                                         ZPOOL_CONFIG_L2CACHE,
> +                                         &cache_child,
> +                                         &cache_children);
> +     if (result == 0)
> +             for (uint_t c = 0; c < cache_children; c++)
> +                     m_vdevQueue.push_back(cache_child[c]);
>  }
>  
>  nvlist_t *
> 
> Modified: head/lib/libdevdctl/guid.h
> ==============================================================================
> --- head/lib/libdevdctl/guid.h        Thu Oct 26 13:23:13 2017        
> (r325010)
> +++ head/lib/libdevdctl/guid.h        Thu Oct 26 15:28:18 2017        
> (r325011)
> @@ -62,9 +62,9 @@ class Guid
>  {
>  public:
>       /* Constructors */
> -     Guid();
>       Guid(uint64_t guid);
>       Guid(const std::string &guid);
> +     static Guid InvalidGuid();
>  
>       /* Assignment */
>       Guid& operator=(const Guid& rhs);
> @@ -80,23 +80,24 @@ class Guid
>       operator uint64_t()              const;
>       operator bool()                  const;
>  
> -     static const uint64_t INVALID_GUID = 0;
>  protected:
> +     static const uint64_t INVALID_GUID = 0;
> +
>       /* The integer value of the GUID. */
>       uint64_t  m_GUID;
>  };
>  
>  //- Guid Inline Public Methods 
> ------------------------------------------------
>  inline
> -Guid::Guid()
> -  : m_GUID(INVALID_GUID)
> +Guid::Guid(uint64_t guid)
> +  : m_GUID(guid)
>  {
>  }
>  
> -inline
> -Guid::Guid(uint64_t guid)
> -  : m_GUID(guid)
> +inline Guid
> +Guid::InvalidGuid()
>  {
> +     return (Guid(INVALID_GUID));
>  }
>  
>  inline Guid&
> _______________________________________________
> svn-src-h...@freebsd.org mailing list
> https://lists.freebsd.org/mailman/listinfo/svn-src-head
> To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"


Building world and kernel on revision 325014 fails with 

[...]
===> gnu/usr.bin/binutils/ld (all)
--- all_subdir_lib ---
--- lrint_test ---
(cd /usr/src/lib/msun/tests &&  DEPENDFILE=.depend.lrint_test  NO_SUBDIR=1 make
-f /usr/src/lib/msun/tests/Makefile _RECURSING_PROGS=t  PROG=lrint_test ) ---
all_subdir_cddl --- --- all_subdir_cddl/usr.sbin/zfsd ---
--- vdev.o ---
/usr/src/cddl/usr.sbin/zfsd/vdev.cc:81:7: error: constructor for 'Vdev' must 
explicitly
initialize the member 'm_poolGUID' which does not have a default constructor 
Vdev::Vdev()

and this pacth seems to be the culprit.


Kind regards,

Oliver

-- 
O. Hartmann

Ich widerspreche der Nutzung oder Übermittlung meiner Daten für
Werbezwecke oder für die Markt- oder Meinungsforschung (§ 28 Abs. 4 BDSG).

Attachment: pgpnE4aCbEfel.pgp
Description: OpenPGP digital signature

Reply via email to