summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPavel Filipensky <Pavel.Filipensky@Sun.COM>2010-06-16 09:11:16 +0200
committerPavel Filipensky <Pavel.Filipensky@Sun.COM>2010-06-16 09:11:16 +0200
commit4e240297c2857fcb86445d5efc563627559bdbfd (patch)
tree9b850d73f24a68ccf96b760f28dba074644e0032
parent72916ffbfd3f92dfbca1a353626b266bf3f45db1 (diff)
downloadillumos-joyent-4e240297c2857fcb86445d5efc563627559bdbfd.tar.gz
6954736 stop -f /SYS on one Otoro head causes the other head to panic
-rw-r--r--usr/src/uts/common/fs/nfs/nfs4_srv_ns.c16
1 files changed, 9 insertions, 7 deletions
diff --git a/usr/src/uts/common/fs/nfs/nfs4_srv_ns.c b/usr/src/uts/common/fs/nfs/nfs4_srv_ns.c
index bc15ca0552..bdfc29d60c 100644
--- a/usr/src/uts/common/fs/nfs/nfs4_srv_ns.c
+++ b/usr/src/uts/common/fs/nfs/nfs4_srv_ns.c
@@ -501,21 +501,23 @@ more_visible(struct exportinfo *exi, treenode_t *tree_head)
* connect_point for the curr->tree_vis. No need for EQFID.
*/
child = tree_find_child_by_vis(connect_point, curr->tree_vis);
- if (child) { /* Merging */
+
+ /*
+ * Merging cannot be done if a valid child->tree_exi would
+ * be overwritten by a new curr->tree_exi.
+ */
+ if (child &&
+ (child->tree_exi == NULL || curr->tree_exi == NULL)) {
if (curr->tree_exi) { /* Transfer the exportinfo */
- /*
- * more_visible() is not called for a reshare,
- * so the existing tree_exi must be NULL.
- */
- ASSERT(child->tree_exi == NULL);
child->tree_exi = curr->tree_exi;
child->tree_exi->exi_tree = child;
}
kmem_free(curr, sizeof (treenode_t));
+ connect_point = child;
} else { /* Branching */
tree_add_child(connect_point, curr);
+ connect_point = NULL;
}
- connect_point = child;
}
}