diff options
author | Pavel Filipensky <Pavel.Filipensky@Sun.COM> | 2010-06-16 09:11:16 +0200 |
---|---|---|
committer | Pavel Filipensky <Pavel.Filipensky@Sun.COM> | 2010-06-16 09:11:16 +0200 |
commit | 4e240297c2857fcb86445d5efc563627559bdbfd (patch) | |
tree | 9b850d73f24a68ccf96b760f28dba074644e0032 | |
parent | 72916ffbfd3f92dfbca1a353626b266bf3f45db1 (diff) | |
download | illumos-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.c | 16 |
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; } } |