svn commit: r325011 - in head: cddl/usr.sbin/zfsd lib/libdevdctl
Alan Somers
asomers at FreeBSD.org
Thu Oct 26 15:28:19 UTC 2017
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&
More information about the svn-src-all
mailing list