git: 37e6036b26cd - main - VOP_CLOSE(): MNTK_EXTENDED_SHARED filesystems do not need excl lock
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Wed, 26 Apr 2023 00:01:00 UTC
The branch main has been updated by kib: URL: https://cgit.FreeBSD.org/src/commit/?id=37e6036b26cdd2942344b6c69f9a10764c6209ba commit 37e6036b26cdd2942344b6c69f9a10764c6209ba Author: Konstantin Belousov <kib@FreeBSD.org> AuthorDate: 2023-04-24 22:43:32 +0000 Commit: Konstantin Belousov <kib@FreeBSD.org> CommitDate: 2023-04-25 22:39:25 +0000 VOP_CLOSE(): MNTK_EXTENDED_SHARED filesystems do not need excl lock All in-tree implementations of VOP_CLOSE() for filesystems proclaiming MNTK_EXTENDED_SHARED, are fine with the shared lock for the closed vnode. I checked the following implementations: ffs ext2 ufs null tmpfs devfs fdescfs cd9660 zfs It seems that initial addition of FWRITE check was due to necessity of handling the VV_TEXT vnode vflag. Since VOP_ADD_WRITECOUNT() only requires shared lock, we can relax the locking requirement there. Reviewed by: markj, Olivier Certner <olce.freebsd@certner.fr> Tested by: Olivier Certner Sponsored by: The FreeBSD Foundation Differential revision: https://reviews.freebsd.org/D39784 --- sys/kern/vfs_vnops.c | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/sys/kern/vfs_vnops.c b/sys/kern/vfs_vnops.c index e42d17ec2478..581d620e348e 100644 --- a/sys/kern/vfs_vnops.c +++ b/sys/kern/vfs_vnops.c @@ -483,7 +483,7 @@ vn_open_vnode(struct vnode *vp, int fmode, struct ucred *cred, * If there is no fp, due to kernel-mode open, * we can call VOP_CLOSE() now. */ - if ((vp->v_type == VFIFO || (fmode & FWRITE) != 0 || + if ((vp->v_type == VFIFO || !MNT_EXTENDED_SHARED(vp->v_mount)) && VOP_ISLOCKED(vp) != LK_EXCLUSIVE) vn_lock(vp, LK_UPGRADE | LK_RETRY); @@ -528,11 +528,8 @@ vn_close1(struct vnode *vp, int flags, struct ucred *file_cred, struct mount *mp; int error, lock_flags; - if (vp->v_type != VFIFO && (flags & FWRITE) == 0 && - MNT_EXTENDED_SHARED(vp->v_mount)) - lock_flags = LK_SHARED; - else - lock_flags = LK_EXCLUSIVE; + lock_flags = vp->v_type != VFIFO && MNT_EXTENDED_SHARED(vp->v_mount) ? + LK_SHARED : LK_EXCLUSIVE; vn_start_write(vp, &mp, V_WAIT); vn_lock(vp, lock_flags | LK_RETRY);