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:
parent
21d8546588
commit
0ef5eee9d9
@ -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
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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); \
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user