The branch main has been updated by rmacklem:

URL: 
https://cgit.FreeBSD.org/src/commit/?id=cf2ff49e6e5e3b9ac28e4f853a6ec9d9599d69b1

commit cf2ff49e6e5e3b9ac28e4f853a6ec9d9599d69b1
Author:     Rick Macklem <rmack...@freebsd.org>
AuthorDate: 2025-07-18 18:47:59 +0000
Commit:     Rick Macklem <rmack...@freebsd.org>
CommitDate: 2025-07-18 18:47:59 +0000

    nfs_nfsdserv.c: Fix nfsrvd_openattr() for vnode locking
    
    Without this patch, nfsrvd_openattr() requests an unlocked
    vnode via VOP_LOOKUP().  This is not allowed for
    "options DEBUG_VFS_LOCKS" kernels, so this patch requests a
    locked vnode and then unlocks it.
    
    Fixes:  e4c7b2b6053f ("nfsv4: Add support to NFSv4 for named attributes")
---
 sys/fs/nfsserver/nfs_nfsdserv.c | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/sys/fs/nfsserver/nfs_nfsdserv.c b/sys/fs/nfsserver/nfs_nfsdserv.c
index f7564ade401b..3acf07d5253b 100644
--- a/sys/fs/nfsserver/nfs_nfsdserv.c
+++ b/sys/fs/nfsserver/nfs_nfsdserv.c
@@ -4353,9 +4353,10 @@ nfsrvd_openattr(struct nfsrv_descript *nd, __unused int 
isdgram,
        int error = 0;
 
        NFSNAMEICNDSET(&cn, nd->nd_cred, LOOKUP, OPENNAMED | ISLASTCN |
-           NOFOLLOW);
+           NOFOLLOW | LOCKLEAF);
        cn.cn_nameptr = ".";
        cn.cn_namelen = 1;
+       cn.cn_lkflags = LK_SHARED;
        NFSM_DISSECT(tl, uint32_t *, NFSX_UNSIGNED);
        if (*tl == newnfs_true)
                cn.cn_flags |= CREATENAMED;
@@ -4374,6 +4375,8 @@ nfsrvd_openattr(struct nfsrv_descript *nd, __unused int 
isdgram,
                if (nd->nd_repstat == ENOATTR)
                        nd->nd_repstat = NFSERR_NOENT;
        }
+       if (nd->nd_repstat == 0)
+               NFSVOPUNLOCK(*vpp);
 
        vput(dp);
        NFSEXITCODE2(0, nd);

Reply via email to