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-all/attachments/20171026/08c7dde7/attachment.sig>
More information about the svn-src-all
mailing list