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).
pgpnE4aCbEfel.pgp
Description: OpenPGP digital signature