svn commit: r325011 - in head: cddl/usr.sbin/zfsd lib/libdevdctl

O. Hartmann ohartmann at walstatt.org
Thu Oct 26 17:18:26 UTC 2017


Am Thu, 26 Oct 2017 15:28:18 +0000 (UTC)
Alan Somers <asomers at 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-head at freebsd.org mailing list
> https://lists.freebsd.org/mailman/listinfo/svn-src-head
> To unsubscribe, send any mail to "svn-src-head-unsubscribe at 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).
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 313 bytes
Desc: OpenPGP digital signature
URL: <http://lists.freebsd.org/pipermail/svn-src-head/attachments/20171026/08c7dde7/attachment.sig>


More information about the svn-src-head mailing list