Add vn_lktype_write()

and remove repetetive code that calculates vnode locking type for write.

Reviewed by:	khng, markj
Sponsored by:	The FreeBSD Foundation
MFC after:	1 week
Differential revision:	https://reviews.freebsd.org/D31405
This commit is contained in:
Konstantin Belousov 2021-08-04 05:34:48 +03:00
parent 21d8546588
commit 0ef5eee9d9
5 changed files with 24 additions and 47 deletions

View File

@ -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

View File

@ -3517,7 +3517,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);
@ -3532,13 +3532,7 @@ kern_fsync(struct thread *td, int fd, bool fullsync)
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);

View File

@ -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);
}

View File

@ -1089,6 +1089,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); \

View File

@ -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;