Date: Tue, 10 Mar 2026 12:46:13 +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: 92d7808d88f0 - main - vn_delayed_setsize(): post-commit review' changes Message-ID: <69b01295.23911.21b35adf@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=92d7808d88f0de979d76446c76c7324731c41302 commit 92d7808d88f0de979d76446c76c7324731c41302 Author: Konstantin Belousov <kib@FreeBSD.org> AuthorDate: 2026-03-06 00:18:11 +0000 Commit: Konstantin Belousov <kib@FreeBSD.org> CommitDate: 2026-03-10 12:44:27 +0000 vn_delayed_setsize(): post-commit review' changes Handle doomed vnodes after LK_RETRY. Rename the flag from VI_DELAYEDSSZ to VI_DELAYED_SETSIZE. Change signature of vn_lock_delayed_setsize() to take flatten values list instead of vop args structure. __predict_true() for VI_DELAYED_SETSIZE not set. Minor editings like removing tautological assert, and sorting items. Noted by: markj Fixes: 45117ffcd533ddf995f654db60b10899ae8370ec Reviewed by: markj, rmacklem Tested by: pho Sponsored by: The FreeBSD Foundation MFC after: 1 week Differential revision: https://reviews.freebsd.org/D55681 --- sys/fs/deadfs/dead_vnops.c | 6 ++--- sys/fs/nfsclient/nfs_clport.c | 2 +- sys/kern/vfs_vnops.c | 52 +++++++++++++++++++++---------------------- sys/sys/vnode.h | 12 +++++----- 4 files changed, 35 insertions(+), 37 deletions(-) diff --git a/sys/fs/deadfs/dead_vnops.c b/sys/fs/deadfs/dead_vnops.c index b6d6fa55d221..c793ef2ebf4d 100644 --- a/sys/fs/deadfs/dead_vnops.c +++ b/sys/fs/deadfs/dead_vnops.c @@ -55,6 +55,9 @@ struct vop_vector dead_vnodeops = { .vop_bmap = VOP_EBADF, .vop_close = dead_close, .vop_create = VOP_PANIC, + .vop_delayed_setsize = VOP_NULL, + .vop_fplookup_symlink = VOP_EOPNOTSUPP, + .vop_fplookup_vexec = VOP_EOPNOTSUPP, .vop_getattr = VOP_EBADF, .vop_getwritemount = dead_getwritemount, .vop_inactive = VOP_NULL, @@ -78,9 +81,6 @@ struct vop_vector dead_vnodeops = { .vop_vptocnp = VOP_EBADF, .vop_unset_text = dead_unset_text, .vop_write = dead_write, - .vop_fplookup_vexec = VOP_EOPNOTSUPP, - .vop_fplookup_symlink = VOP_EOPNOTSUPP, - .vop_delayed_setsize = VOP_NULL, }; VFS_VOP_VECTOR_REGISTER(dead_vnodeops); diff --git a/sys/fs/nfsclient/nfs_clport.c b/sys/fs/nfsclient/nfs_clport.c index 1156e1738703..cf163adc02de 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 - vn_delay_setsize(vp); + vn_delayed_setsize(vp); } if (nsizep == NULL) { NFSUNLOCKNODE(np); diff --git a/sys/kern/vfs_vnops.c b/sys/kern/vfs_vnops.c index 24efdf4ac0d5..ea8f8437b743 100644 --- a/sys/kern/vfs_vnops.c +++ b/sys/kern/vfs_vnops.c @@ -1960,25 +1960,25 @@ _vn_lock_fallback(struct vnode *vp, int flags, const char *file, int line, } static int -vn_lock_delayed_setsize(struct vop_lock1_args *ap) +vn_lock_delayed_setsize(struct vnode *vp, int flags, const char *file, int line) { - struct vnode *vp; + struct vop_lock1_args ap; int error, lktype; bool onfault; - vp = ap->a_vp; - lktype = ap->a_flags & LK_TYPE_MASK; + ASSERT_VOP_LOCKED(vp, "vn_lock_delayed_setsize"); + lktype = flags & LK_TYPE_MASK; if (vp->v_op == &dead_vnodeops) return (0); VI_LOCK(vp); - if ((vp->v_iflag & VI_DELAYEDSSZ) == 0 || (lktype != LK_SHARED && + if ((vp->v_iflag & VI_DELAYED_SETSIZE) == 0 || (lktype != LK_SHARED && lktype != LK_EXCLUSIVE && lktype != LK_UPGRADE && lktype != LK_TRYUPGRADE)) { VI_UNLOCK(vp); return (0); } - onfault = (ap->a_flags & LK_EATTR_MASK) == LK_NOWAIT && - (ap->a_flags & LK_INIT_MASK) == LK_CANRECURSE && + onfault = (flags & LK_EATTR_MASK) == LK_NOWAIT && + (flags & LK_INIT_MASK) == LK_CANRECURSE && (lktype == LK_SHARED || lktype == LK_EXCLUSIVE); if (onfault && vp->v_vnlock->lk_recurse == 0) { /* @@ -1990,35 +1990,38 @@ vn_lock_delayed_setsize(struct vop_lock1_args *ap) VOP_UNLOCK(vp); return (EBUSY); } - if ((ap->a_flags & LK_NOWAIT) != 0 || + if ((flags & LK_NOWAIT) != 0 || (lktype == LK_SHARED && vp->v_vnlock->lk_recurse > 0)) { VI_UNLOCK(vp); return (0); } if (lktype == LK_SHARED) { VOP_UNLOCK(vp); - ap->a_flags &= ~LK_TYPE_MASK; - ap->a_flags |= LK_EXCLUSIVE | LK_INTERLOCK; - error = VOP_LOCK1_APV(&default_vnodeops, ap); + ap.a_gen.a_desc = &vop_lock1_desc; + ap.a_vp = vp; + ap.a_flags = (flags & ~LK_TYPE_MASK) | LK_EXCLUSIVE | + LK_INTERLOCK; + ap.a_file = file; + ap.a_line = line; + error = VOP_LOCK1_APV(&default_vnodeops, &ap); if (error != 0 || vp->v_op == &dead_vnodeops) return (error); if (vp->v_data == NULL) goto downgrade; - MPASS(vp->v_data != NULL); VI_LOCK(vp); - if ((vp->v_iflag & VI_DELAYEDSSZ) == 0) { + if ((vp->v_iflag & VI_DELAYED_SETSIZE) == 0) { VI_UNLOCK(vp); goto downgrade; } } - vp->v_iflag &= ~VI_DELAYEDSSZ; + vn_clear_delayed_setsize_locked(vp); VI_UNLOCK(vp); VOP_DELAYED_SETSIZE(vp); 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); + ap.a_flags &= ~(LK_TYPE_MASK | LK_INTERLOCK); + ap.a_flags |= LK_DOWNGRADE; + (void)VOP_LOCK1_APV(&default_vnodeops, &ap); } return (0); } @@ -2026,7 +2029,6 @@ downgrade: int _vn_lock(struct vnode *vp, int flags, const char *file, int line) { - struct vop_lock1_args ap; int error; VNASSERT((flags & LK_TYPE_MASK) != 0, vp, @@ -2034,15 +2036,11 @@ _vn_lock(struct vnode *vp, int flags, const char *file, int line) VNPASS(vp->v_holdcnt > 0, vp); error = VOP_LOCK1(vp, flags, file, line); if (__predict_false(error != 0 || VN_IS_DOOMED(vp))) - return (_vn_lock_fallback(vp, flags, file, line, error)); - if (__predict_false((vp->v_iflag & VI_DELAYEDSSZ) == 0)) - return (0); - ap.a_gen.a_desc = &vop_lock1_desc; - ap.a_vp = vp; - ap.a_flags = flags; - ap.a_file = file; - ap.a_line = line; - return (vn_lock_delayed_setsize(&ap)); + error = _vn_lock_fallback(vp, flags, file, line, error); + if (error != 0 || __predict_true((atomic_load_short(&vp->v_iflag) & + VI_DELAYED_SETSIZE) == 0)) + return (error); + return (vn_lock_delayed_setsize(vp, flags, file, line)); } /* diff --git a/sys/sys/vnode.h b/sys/sys/vnode.h index 36e10fd8d8b7..3fd2c770cda1 100644 --- a/sys/sys/vnode.h +++ b/sys/sys/vnode.h @@ -268,7 +268,7 @@ _Static_assert(sizeof(struct vnode) <= 448, "vnode size crosses 448 bytes"); #define VI_DEFINACT 0x0010 /* deferred inactive */ #define VI_FOPENING 0x0020 /* In open, with opening process having the first right to advlock file */ -#define VI_DELAYEDSSZ 0x0040 /* Delayed setsize */ +#define VI_DELAYED_SETSIZE 0x0040 /* Delayed setsize */ #define VV_ROOT 0x0001 /* root of its filesystem */ #define VV_ISTTY 0x0002 /* vnode represents a tty */ @@ -1253,17 +1253,17 @@ vn_get_state(struct vnode *vp) }) static inline void -vn_delay_setsize_locked(struct vnode *vp) +vn_delayed_setsize_locked(struct vnode *vp) { ASSERT_VI_LOCKED(vp, "delayed_setsize"); - vp->v_iflag |= VI_DELAYEDSSZ; + vp->v_iflag |= VI_DELAYED_SETSIZE; } static inline void -vn_delay_setsize(struct vnode *vp) +vn_delayed_setsize(struct vnode *vp) { VI_LOCK(vp); - vn_delay_setsize_locked(vp); + vn_delayed_setsize_locked(vp); VI_UNLOCK(vp); } @@ -1271,7 +1271,7 @@ static inline void vn_clear_delayed_setsize_locked(struct vnode *vp) { ASSERT_VI_LOCKED(vp, "delayed_setsize"); - vp->v_iflag &= ~VI_DELAYEDSSZ; + vp->v_iflag &= ~VI_DELAYED_SETSIZE; } static inline voidhome | help
Want to link to this message? Use this
URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?69b01295.23911.21b35adf>
