The branch stable/13 has been updated by kib:

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

commit c7b5abde53899c381ed6773b61e1ad940a44792f
Author:     Konstantin Belousov <k...@freebsd.org>
AuthorDate: 2021-08-04 02:34:48 +0000
Commit:     Konstantin Belousov <k...@freebsd.org>
CommitDate: 2021-08-12 12:37:54 +0000

    Add vn_lktype_write()
    
    (cherry picked from commit 0ef5eee9d94162ac3cefa0bd8aedf1bfa6f87192)
---
 sys/cam/ctl/ctl_backend_block.c | 20 +++++---------------
 sys/kern/vfs_syscalls.c         | 10 ++--------
 sys/kern/vfs_vnops.c            | 34 ++++++++++++++--------------------
 sys/sys/vnode.h                 |  1 +
 sys/vm/vm_pageout.c             |  6 ++----
 5 files changed, 24 insertions(+), 47 deletions(-)

diff --git a/sys/cam/ctl/ctl_backend_block.c b/sys/cam/ctl/ctl_backend_block.c
index 4ffaf0912915..83ea6b43dac3 100644
--- a/sys/cam/ctl/ctl_backend_block.c
+++ b/sys/cam/ctl/ctl_backend_block.c
@@ -588,7 +588,7 @@ ctl_be_block_flush_file(struct ctl_be_block_lun *be_lun,
 {
        union ctl_io *io = beio->io;
        struct mount *mountpoint;
-       int error, lock_flags;
+       int error;
 
        DPRINTF("entered\n");
 
@@ -597,12 +597,8 @@ ctl_be_block_flush_file(struct ctl_be_block_lun *be_lun,
 
        (void) vn_start_write(be_lun->vn, &mountpoint, V_WAIT);
 
-       if (MNT_SHARED_WRITES(mountpoint) ||
-           ((mountpoint == NULL) && MNT_SHARED_WRITES(be_lun->vn->v_mount)))
-               lock_flags = LK_SHARED;
-       else
-               lock_flags = LK_EXCLUSIVE;
-       vn_lock(be_lun->vn, lock_flags | LK_RETRY);
+       vn_lock(be_lun->vn, vn_lktype_write(mountpoint, be_lun->vn) |
+           LK_RETRY);
        error = VOP_FSYNC(be_lun->vn, beio->io_arg ? MNT_NOWAIT : MNT_WAIT,
            curthread);
        VOP_UNLOCK(be_lun->vn);
@@ -722,16 +718,10 @@ ctl_be_block_dispatch_file(struct ctl_be_block_lun 
*be_lun,
                }
        } else {
                struct mount *mountpoint;
-               int lock_flags;
 
                (void)vn_start_write(be_lun->vn, &mountpoint, V_WAIT);
-
-               if (MNT_SHARED_WRITES(mountpoint) || ((mountpoint == NULL)
-                 && MNT_SHARED_WRITES(be_lun->vn->v_mount)))
-                       lock_flags = LK_SHARED;
-               else
-                       lock_flags = LK_EXCLUSIVE;
-               vn_lock(be_lun->vn, lock_flags | LK_RETRY);
+               vn_lock(be_lun->vn, vn_lktype_write(mountpoint,
+                   be_lun->vn) | LK_RETRY);
 
                /*
                 * UFS pays attention to IO_DIRECT for writes.  The write
diff --git a/sys/kern/vfs_syscalls.c b/sys/kern/vfs_syscalls.c
index 7f2f3480a5af..80bcc0cb4d41 100644
--- a/sys/kern/vfs_syscalls.c
+++ b/sys/kern/vfs_syscalls.c
@@ -3505,7 +3505,7 @@ kern_fsync(struct thread *td, int fd, bool fullsync)
        struct vnode *vp;
        struct mount *mp;
        struct file *fp;
-       int error, lock_flags;
+       int error;
 
        AUDIT_ARG_FD(fd);
        error = getvnode(td, fd, &cap_fsync_rights, &fp);
@@ -3520,13 +3520,7 @@ retry:
        error = vn_start_write(vp, &mp, V_WAIT | PCATCH);
        if (error != 0)
                goto drop;
-       if (MNT_SHARED_WRITES(mp) ||
-           ((mp == NULL) && MNT_SHARED_WRITES(vp->v_mount))) {
-               lock_flags = LK_SHARED;
-       } else {
-               lock_flags = LK_EXCLUSIVE;
-       }
-       vn_lock(vp, lock_flags | LK_RETRY);
+       vn_lock(vp, vn_lktype_write(mp, vp) | LK_RETRY);
        AUDIT_ARG_VNODE1(vp);
        if (vp->v_object != NULL) {
                VM_OBJECT_WLOCK(vp->v_object);
diff --git a/sys/kern/vfs_vnops.c b/sys/kern/vfs_vnops.c
index fc5118e8aa24..b7e53add5a35 100644
--- a/sys/kern/vfs_vnops.c
+++ b/sys/kern/vfs_vnops.c
@@ -653,11 +653,7 @@ vn_rdwr(enum uio_rw rw, struct vnode *vp, void *base, int 
len, off_t offset,
                            (error = vn_start_write(vp, &mp, V_WAIT | PCATCH))
                            != 0)
                                goto out;
-                       if (MNT_SHARED_WRITES(mp) ||
-                           ((mp == NULL) && MNT_SHARED_WRITES(vp->v_mount)))
-                               lock_flags = LK_SHARED;
-                       else
-                               lock_flags = LK_EXCLUSIVE;
+                       lock_flags = vn_lktype_write(mp, vp);
                } else
                        lock_flags = LK_SHARED;
                vn_lock(vp, lock_flags | LK_RETRY);
@@ -1106,7 +1102,7 @@ vn_write(struct file *fp, struct uio *uio, struct ucred 
*active_cred, int flags,
        struct vnode *vp;
        struct mount *mp;
        off_t orig_offset;
-       int error, ioflag, lock_flags;
+       int error, ioflag;
        int advice;
        bool need_finished_write;
 
@@ -1147,14 +1143,7 @@ vn_write(struct file *fp, struct uio *uio, struct ucred 
*active_cred, int flags,
 
        advice = get_advice(fp, uio);
 
-       if (MNT_SHARED_WRITES(mp) ||
-           (mp == NULL && MNT_SHARED_WRITES(vp->v_mount))) {
-               lock_flags = LK_SHARED;
-       } else {
-               lock_flags = LK_EXCLUSIVE;
-       }
-
-       vn_lock(vp, lock_flags | LK_RETRY);
+       vn_lock(vp, vn_lktype_write(mp, vp) | LK_RETRY);
        switch (advice) {
        case POSIX_FADV_NORMAL:
        case POSIX_FADV_SEQUENTIAL:
@@ -3060,7 +3049,7 @@ vn_write_outvp(struct vnode *outvp, char *dat, off_t 
outoff, off_t xfer,
 {
        struct mount *mp;
        off_t dataoff, holeoff, xfer2;
-       int error, lckf;
+       int error;
 
        /*
         * Loop around doing writes of blksize until write has been completed.
@@ -3099,11 +3088,7 @@ vn_write_outvp(struct vnode *outvp, char *dat, off_t 
outoff, off_t xfer,
                                VOP_UNLOCK(outvp);
                        }
                } else {
-                       if (MNT_SHARED_WRITES(mp))
-                               lckf = LK_SHARED;
-                       else
-                               lckf = LK_EXCLUSIVE;
-                       error = vn_lock(outvp, lckf);
+                       error = vn_lock(outvp, vn_lktype_write(mp, outvp));
                        if (error == 0) {
                                error = vn_rdwr(UIO_WRITE, outvp, dat, xfer2,
                                    outoff, UIO_SYSSPACE, IO_NODELOCKED,
@@ -3532,3 +3517,12 @@ vn_lock_pair(struct vnode *vp1, bool vp1_locked, struct 
vnode *vp2,
        if (vp2 != NULL)
                ASSERT_VOP_ELOCKED(vp2, "vp2 ret");
 }
+
+int
+vn_lktype_write(struct mount *mp, struct vnode *vp)
+{
+       if (MNT_SHARED_WRITES(mp) ||
+           (mp == NULL && MNT_SHARED_WRITES(vp->v_mount)))
+               return (LK_SHARED);
+       return (LK_EXCLUSIVE);
+}
diff --git a/sys/sys/vnode.h b/sys/sys/vnode.h
index 8b14aac36df0..8336fd859781 100644
--- a/sys/sys/vnode.h
+++ b/sys/sys/vnode.h
@@ -1087,6 +1087,7 @@ int vn_chown(struct file *fp, uid_t uid, gid_t gid, 
struct ucred *active_cred,
 void vn_fsid(struct vnode *vp, struct vattr *va);
 
 int vn_dir_check_exec(struct vnode *vp, struct componentname *cnp);
+int vn_lktype_write(struct mount *mp, struct vnode *vp);
 
 #define VOP_UNLOCK_FLAGS(vp, flags)    ({                              \
        struct vnode *_vp = (vp);                                       \
diff --git a/sys/vm/vm_pageout.c b/sys/vm/vm_pageout.c
index 216e76359631..9a0b295569e2 100644
--- a/sys/vm/vm_pageout.c
+++ b/sys/vm/vm_pageout.c
@@ -606,7 +606,7 @@ vm_pageout_clean(vm_page_t m, int *numpagedout)
        struct mount *mp;
        vm_object_t object;
        vm_pindex_t pindex;
-       int error, lockmode;
+       int error;
 
        object = m->object;
        VM_OBJECT_ASSERT_WLOCKED(object);
@@ -640,9 +640,7 @@ vm_pageout_clean(vm_page_t m, int *numpagedout)
                vm_object_reference_locked(object);
                pindex = m->pindex;
                VM_OBJECT_WUNLOCK(object);
-               lockmode = MNT_SHARED_WRITES(vp->v_mount) ?
-                   LK_SHARED : LK_EXCLUSIVE;
-               if (vget(vp, lockmode | LK_TIMELOCK)) {
+               if (vget(vp, vn_lktype_write(NULL, vp) | LK_TIMELOCK) != 0) {
                        vp = NULL;
                        error = EDEADLK;
                        goto unlock_mp;
_______________________________________________
dev-commits-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/dev-commits-src-all
To unsubscribe, send any mail to "dev-commits-src-all-unsubscr...@freebsd.org"

Reply via email to