summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlan Somers <asomers@FreeBSD.org>2017-10-26 15:28:18 +0000
committerAlan Somers <asomers@FreeBSD.org>2017-10-26 15:28:18 +0000
commit12a88a3d637e7e7a3726e8dedbcf82cb96cea529 (patch)
tree60d86f54828d5cac293e9367b68fcd7eb77806cf
parent79b67c8d4a6c421a42edfd087b3ee84856e7e118 (diff)
Notes
-rw-r--r--cddl/usr.sbin/zfsd/case_file.cc6
-rw-r--r--cddl/usr.sbin/zfsd/case_file.h2
-rw-r--r--cddl/usr.sbin/zfsd/vdev_iterator.cc9
-rw-r--r--lib/libdevdctl/guid.h15
4 files changed, 23 insertions, 9 deletions
diff --git a/cddl/usr.sbin/zfsd/case_file.cc b/cddl/usr.sbin/zfsd/case_file.cc
index 0cd659622e945..c3105853b29ce 100644
--- a/cddl/usr.sbin/zfsd/case_file.cc
+++ b/cddl/usr.sbin/zfsd/case_file.cc
@@ -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 string &physPath, Vdev *vdev)
}
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(),
diff --git a/cddl/usr.sbin/zfsd/case_file.h b/cddl/usr.sbin/zfsd/case_file.h
index aa2a447e8a472..fcb1261f2a672 100644
--- a/cddl/usr.sbin/zfsd/case_file.h
+++ b/cddl/usr.sbin/zfsd/case_file.h
@@ -89,6 +89,8 @@ 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.
diff --git a/cddl/usr.sbin/zfsd/vdev_iterator.cc b/cddl/usr.sbin/zfsd/vdev_iterator.cc
index 07f19d2b074c9..31a4ce962970e 100644
--- a/cddl/usr.sbin/zfsd/vdev_iterator.cc
+++ b/cddl/usr.sbin/zfsd/vdev_iterator.cc
@@ -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 *
diff --git a/lib/libdevdctl/guid.h b/lib/libdevdctl/guid.h
index ede414bec6492..e40d3f983aab7 100644
--- a/lib/libdevdctl/guid.h
+++ b/lib/libdevdctl/guid.h
@@ -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 @@ public:
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&