git: 5c71df985035 - main - nfsclient: convert to use vn_delayed_setsize()
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Thu, 05 Mar 2026 23:48:28 UTC
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. */