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. */
