The branch main has been updated by kib:

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

commit 5c71df9850355e20cf8f89fb656b18ef79cdf178
Author:     Konstantin Belousov <[email protected]>
AuthorDate: 2026-02-28 16:26:12 +0000
Commit:     Konstantin Belousov <[email protected]>
CommitDate: 2026-03-05 23:46:54 +0000

    nfsclient: convert to use vn_delayed_setsize()
    
    Reviewed by:    rmacklem
    Tested by:      pho
    Sponsored by:   The FreeBSD Foundation
    MFC after:      1 week
    Differential revision:  https://reviews.freebsd.org/D55595
---
 sys/fs/nfsclient/nfs_clbio.c   |  4 +--
 sys/fs/nfsclient/nfs_clport.c  |  2 +-
 sys/fs/nfsclient/nfs_clvnops.c | 68 +++++-------------------------------------
 sys/fs/nfsclient/nfsnode.h     |  1 -
 4 files changed, 10 insertions(+), 65 deletions(-)

diff --git a/sys/fs/nfsclient/nfs_clbio.c b/sys/fs/nfsclient/nfs_clbio.c
index e181bf593e23..b534a2eb5555 100644
--- a/sys/fs/nfsclient/nfs_clbio.c
+++ b/sys/fs/nfsclient/nfs_clbio.c
@@ -1041,7 +1041,7 @@ again:
                                NFSLOCKNODE(np);
                                np->n_size = uio->uio_offset + n;
                                np->n_flag |= NMODIFIED;
-                               np->n_flag &= ~NVNSETSZSKIP;
+                               vn_clear_delayed_setsize(vp);
                                vnode_pager_setsize(vp, np->n_size);
                                NFSUNLOCKNODE(np);
 
@@ -1071,7 +1071,7 @@ again:
                        if (uio->uio_offset + n > np->n_size) {
                                np->n_size = uio->uio_offset + n;
                                np->n_flag |= NMODIFIED;
-                               np->n_flag &= ~NVNSETSZSKIP;
+                               vn_clear_delayed_setsize(vp);
                                vnode_pager_setsize(vp, np->n_size);
                        }
                        NFSUNLOCKNODE(np);
diff --git a/sys/fs/nfsclient/nfs_clport.c b/sys/fs/nfsclient/nfs_clport.c
index c5f7ce0a12c7..1156e1738703 100644
--- a/sys/fs/nfsclient/nfs_clport.c
+++ b/sys/fs/nfsclient/nfs_clport.c
@@ -646,7 +646,7 @@ ncl_pager_setsize(struct vnode *vp, u_quad_t *nsizep)
                    (curthread->td_pflags2 & TDP2_SBPAGES) == 0)
                        setnsize = true;
                else
-                       np->n_flag |= NVNSETSZSKIP;
+                       vn_delay_setsize(vp);
        }
        if (nsizep == NULL) {
                NFSUNLOCKNODE(np);
diff --git a/sys/fs/nfsclient/nfs_clvnops.c b/sys/fs/nfsclient/nfs_clvnops.c
index edd6974a50d0..26aa6491ac4a 100644
--- a/sys/fs/nfsclient/nfs_clvnops.c
+++ b/sys/fs/nfsclient/nfs_clvnops.c
@@ -155,7 +155,7 @@ static vop_getextattr_t nfs_getextattr;
 static vop_setextattr_t nfs_setextattr;
 static vop_listextattr_t nfs_listextattr;
 static vop_deleteextattr_t nfs_deleteextattr;
-static vop_lock1_t     nfs_lock;
+static vop_delayed_setsize_t   nfs_delayed_setsize;
 
 /*
  * Global vfs data structures for nfs
@@ -168,13 +168,13 @@ static struct vop_vector newnfs_vnodeops_nosig = {
        .vop_advlockasync =     nfs_advlockasync,
        .vop_close =            nfs_close,
        .vop_create =           nfs_create,
+       .vop_delayed_setsize =  nfs_delayed_setsize,
        .vop_fsync =            nfs_fsync,
        .vop_getattr =          nfs_getattr,
        .vop_getpages =         ncl_getpages,
        .vop_putpages =         ncl_putpages,
        .vop_inactive =         ncl_inactive,
        .vop_link =             nfs_link,
-       .vop_lock1 =            nfs_lock,
        .vop_lookup =           nfs_lookup,
        .vop_mkdir =            nfs_mkdir,
        .vop_mknod =            nfs_mknod,
@@ -331,73 +331,19 @@ SYSCTL_U64(_vfs_nfs, OID_AUTO, maxalloclen, CTLFLAG_RW,
  */
 
 static int
-nfs_lock(struct vop_lock1_args *ap)
+nfs_delayed_setsize(struct vop_delayed_setsize_args *ap)
 {
        struct vnode *vp;
        struct nfsnode *np;
        u_quad_t nsize;
-       int error, lktype;
-       bool onfault;
 
        vp = ap->a_vp;
-       lktype = ap->a_flags & LK_TYPE_MASK;
-       error = VOP_LOCK1_APV(&default_vnodeops, ap);
-       if (error != 0 || vp->v_op != &newnfs_vnodeops)
-               return (error);
        np = VTONFS(vp);
-       if (np == NULL)
-               return (0);
-       NFSLOCKNODE(np);
-       if ((np->n_flag & NVNSETSZSKIP) == 0 || (lktype != LK_SHARED &&
-           lktype != LK_EXCLUSIVE && lktype != LK_UPGRADE &&
-           lktype != LK_TRYUPGRADE)) {
-               NFSUNLOCKNODE(np);
-               return (0);
-       }
-       onfault = (ap->a_flags & LK_EATTR_MASK) == LK_NOWAIT &&
-           (ap->a_flags & LK_INIT_MASK) == LK_CANRECURSE &&
-           (lktype == LK_SHARED || lktype == LK_EXCLUSIVE);
-       if (onfault && vp->v_vnlock->lk_recurse == 0) {
-               /*
-                * Force retry in vm_fault(), to make the lock request
-                * sleepable, which allows us to piggy-back the
-                * sleepable call to vnode_pager_setsize().
-                */
-               NFSUNLOCKNODE(np);
-               VOP_UNLOCK(vp);
-               return (EBUSY);
-       }
-       if ((ap->a_flags & LK_NOWAIT) != 0 ||
-           (lktype == LK_SHARED && vp->v_vnlock->lk_recurse > 0)) {
-               NFSUNLOCKNODE(np);
-               return (0);
-       }
-       if (lktype == LK_SHARED) {
-               NFSUNLOCKNODE(np);
-               VOP_UNLOCK(vp);
-               ap->a_flags &= ~(LK_TYPE_MASK | LK_INTERLOCK);
-               ap->a_flags |= LK_EXCLUSIVE;
-               error = VOP_LOCK1_APV(&default_vnodeops, ap);
-               if (error != 0 || vp->v_op != &newnfs_vnodeops)
-                       return (error);
-               if (vp->v_data == NULL)
-                       goto downgrade;
-               MPASS(vp->v_data == np);
+       if (np != NULL) {
                NFSLOCKNODE(np);
-               if ((np->n_flag & NVNSETSZSKIP) == 0) {
-                       NFSUNLOCKNODE(np);
-                       goto downgrade;
-               }
-       }
-       np->n_flag &= ~NVNSETSZSKIP;
-       nsize = np->n_size;
-       NFSUNLOCKNODE(np);
-       vnode_pager_setsize(vp, nsize);
-downgrade:
-       if (lktype == LK_SHARED) {
-               ap->a_flags &= ~(LK_TYPE_MASK | LK_INTERLOCK);
-               ap->a_flags |= LK_DOWNGRADE;
-               (void)VOP_LOCK1_APV(&default_vnodeops, ap);
+               nsize = np->n_size;
+               NFSUNLOCKNODE(np);
+               vnode_pager_setsize(vp, nsize);
        }
        return (0);
 }
diff --git a/sys/fs/nfsclient/nfsnode.h b/sys/fs/nfsclient/nfsnode.h
index 9b2627015612..07c7ccb0ff10 100644
--- a/sys/fs/nfsclient/nfsnode.h
+++ b/sys/fs/nfsclient/nfsnode.h
@@ -160,7 +160,6 @@ struct nfsnode {
 #define        NWRITEOPENED    0x00040000  /* Has been opened for writing */
 #define        NHASBEENLOCKED  0x00080000  /* Has been file locked. */
 #define        NDSCOMMIT       0x00100000  /* Commit is done via the DS. */
-#define        NVNSETSZSKIP    0x00200000  /* Skipped vnode_pager_setsize() */
 #define        NMIGHTBELOCKED  0x00400000  /* Might be file locked. */
 #define        NNAMEDNOTSUPP   0x00800000  /* Openattr is not supported. */
 

Reply via email to