summaryrefslogtreecommitdiff
path: root/usr
diff options
context:
space:
mode:
Diffstat (limited to 'usr')
-rw-r--r--usr/src/uts/common/fs/nfs/nfs4_client.c15
1 files changed, 10 insertions, 5 deletions
diff --git a/usr/src/uts/common/fs/nfs/nfs4_client.c b/usr/src/uts/common/fs/nfs/nfs4_client.c
index e201737a8f..5790d269e5 100644
--- a/usr/src/uts/common/fs/nfs/nfs4_client.c
+++ b/usr/src/uts/common/fs/nfs/nfs4_client.c
@@ -4254,14 +4254,19 @@ fn_move(nfs4_fname_t *fnp, nfs4_fname_t *newparent, char *newname)
/*
* Remove fnp from its current parent, change its name, then add it
- * to newparent.
+ * to newparent. It might happen that fnp was replaced by another
+ * nfs4_fname_t with the same fn_name in parent->fn_children.
+ * In such case, fnp->fn_parent is NULL and we skip the removal
+ * of fnp from its current parent.
*/
mutex_enter(&fnp->fn_lock);
parent = fnp->fn_parent;
- mutex_enter(&parent->fn_lock);
- avl_remove(&parent->fn_children, fnp);
- mutex_exit(&parent->fn_lock);
- fn_rele(&fnp->fn_parent);
+ if (parent != NULL) {
+ mutex_enter(&parent->fn_lock);
+ avl_remove(&parent->fn_children, fnp);
+ mutex_exit(&parent->fn_lock);
+ fn_rele(&fnp->fn_parent);
+ }
newlen = strlen(newname);
if (newlen != fnp->fn_len) {