diff --git a/sys/fs/nfs/nfs_commonsubs.c b/sys/fs/nfs/nfs_commonsubs.c --- a/sys/fs/nfs/nfs_commonsubs.c +++ b/sys/fs/nfs/nfs_commonsubs.c @@ -1427,9 +1427,15 @@ NFSCLRBIT_ATTRBIT(&checkattrbits, NFSATTRBIT_ACLSUPPORT); } /* Some filesystems do not support uf_hidden */ - if (vp == NULL || VOP_PATHCONF(vp, - _PC_HAS_HIDDENSYSTEM, &has_pathconf) != 0) - has_pathconf = 0; + if (vp == NULL) { + has_pathconf = 0; + } else { + vn_lock(vp, LK_SHARED | LK_RETRY); + if (VOP_PATHCONF(vp, _PC_HAS_HIDDENSYSTEM, + &has_pathconf) != 0) + has_pathconf = 0; + VOP_UNLOCK(vp); + } if (has_pathconf == 0) { NFSCLRBIT_ATTRBIT(&checkattrbits, NFSATTRBIT_HIDDEN); @@ -1536,10 +1542,17 @@ NFSM_DISSECT(tl, u_int32_t *, NFSX_UNSIGNED); if (compare) { if (!(*retcmpp)) { - if (vp == NULL || VOP_PATHCONF(vp, - _PC_HAS_NAMEDATTR, &has_pathconf) - != 0) + if (vp == NULL) { has_pathconf = 0; + } else { + vn_lock(vp, LK_SHARED | + LK_RETRY); + if (VOP_PATHCONF(vp, + _PC_HAS_NAMEDATTR, + &has_pathconf) != 0) + has_pathconf = 0; + VOP_UNLOCK(vp); + } if ((has_pathconf != 0 && *tl != newnfs_true) || (has_pathconf == 0 && @@ -2780,10 +2793,15 @@ NFSCLRBIT_ATTRBIT(&attrbits,NFSATTRBIT_ACLSUPPORT); NFSCLRBIT_ATTRBIT(&attrbits,NFSATTRBIT_ACL); } - if (cred == NULL || p == NULL || vp == NULL || - VOP_PATHCONF(vp, _PC_HAS_HIDDENSYSTEM, - &has_pathconf) != 0) - has_pathconf = 0; + if (cred == NULL || p == NULL || vp == NULL) { + has_pathconf = 0; + } else { + vn_lock(vp, LK_SHARED | LK_RETRY); + if (VOP_PATHCONF(vp, _PC_HAS_HIDDENSYSTEM, + &has_pathconf) != 0) + has_pathconf = 0; + VOP_UNLOCK(vp); + } if (has_pathconf == 0) { NFSCLRBIT_ATTRBIT(&attrbits, NFSATTRBIT_HIDDEN); NFSCLRBIT_ATTRBIT(&attrbits, NFSATTRBIT_SYSTEM); @@ -2828,9 +2846,11 @@ break; case NFSATTRBIT_NAMEDATTR: NFSM_BUILD(tl, u_int32_t *, NFSX_UNSIGNED); + vn_lock(vp, LK_SHARED | LK_RETRY); if (VOP_PATHCONF(vp, _PC_HAS_NAMEDATTR, &has_pathconf) != 0) has_pathconf = 0; + VOP_UNLOCK(vp); if (has_pathconf != 0) *tl = newnfs_true; else