diff options
Diffstat (limited to 'usr')
| -rw-r--r-- | usr/src/uts/common/fs/nfs/nfs4_client.c | 15 |
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) { |
