Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 05 Mar 2026 23:48:28 +0000
From:      Konstantin Belousov <kib@FreeBSD.org>
To:        src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org
Subject:   git: 5c71df985035 - main - nfsclient: convert to use vn_delayed_setsize()
Message-ID:  <69aa164c.3f8f4.35428cd8@gitrepo.freebsd.org>

index | next in thread | raw e-mail

The branch main has been updated by kib:

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

commit 5c71df9850355e20cf8f89fb656b18ef79cdf178
Author:     Konstantin Belousov <kib@FreeBSD.org>
AuthorDate: 2026-02-28 16:26:12 +0000
Commit:     Konstantin Belousov <kib@FreeBSD.org>
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. */
 


home | help

Want to link to this message? Use this
URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?69aa164c.3f8f4.35428cd8>