The branch main has been updated by kib:

URL: 
https://cgit.FreeBSD.org/src/commit/?id=37e6036b26cdd2942344b6c69f9a10764c6209ba

commit 37e6036b26cdd2942344b6c69f9a10764c6209ba
Author:     Konstantin Belousov <[email protected]>
AuthorDate: 2023-04-24 22:43:32 +0000
Commit:     Konstantin Belousov <[email protected]>
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 <[email protected]>
    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);

Reply via email to