Simply shared vnode locking and extend it to also include fsync.
Also, in vop_write, no longer assert for exclusive locks on the vnode. Reviewed by: jhb, kmacy, jeffr
This commit is contained in:
parent
a91ac60c20
commit
27bfb741a0
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=193762
@ -3476,7 +3476,7 @@ fsync(td, uap)
|
|||||||
struct mount *mp;
|
struct mount *mp;
|
||||||
struct file *fp;
|
struct file *fp;
|
||||||
int vfslocked;
|
int vfslocked;
|
||||||
int error;
|
int error, lock_flags;
|
||||||
|
|
||||||
AUDIT_ARG(fd, uap->fd);
|
AUDIT_ARG(fd, uap->fd);
|
||||||
if ((error = getvnode(td->td_proc->p_fd, uap->fd, &fp)) != 0)
|
if ((error = getvnode(td->td_proc->p_fd, uap->fd, &fp)) != 0)
|
||||||
@ -3485,7 +3485,13 @@ fsync(td, uap)
|
|||||||
vfslocked = VFS_LOCK_GIANT(vp->v_mount);
|
vfslocked = VFS_LOCK_GIANT(vp->v_mount);
|
||||||
if ((error = vn_start_write(vp, &mp, V_WAIT | PCATCH)) != 0)
|
if ((error = vn_start_write(vp, &mp, V_WAIT | PCATCH)) != 0)
|
||||||
goto drop;
|
goto drop;
|
||||||
vn_lock(vp, LK_EXCLUSIVE | LK_RETRY);
|
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);
|
||||||
AUDIT_ARG(vnode, vp, ARG_VNODE1);
|
AUDIT_ARG(vnode, vp, ARG_VNODE1);
|
||||||
if (vp->v_object != NULL) {
|
if (vp->v_object != NULL) {
|
||||||
VM_OBJECT_LOCK(vp->v_object);
|
VM_OBJECT_LOCK(vp->v_object);
|
||||||
|
@ -376,8 +376,8 @@ vn_rdwr(rw, vp, base, len, offset, segflg, ioflg, active_cred, file_cred,
|
|||||||
(error = vn_start_write(vp, &mp, V_WAIT | PCATCH))
|
(error = vn_start_write(vp, &mp, V_WAIT | PCATCH))
|
||||||
!= 0)
|
!= 0)
|
||||||
return (error);
|
return (error);
|
||||||
if (mp != NULL &&
|
if (MNT_SHARED_WRITES(mp) ||
|
||||||
(mp->mnt_kern_flag & MNTK_SHARED_WRITES)) {
|
((mp == NULL) && MNT_SHARED_WRITES(vp->v_mount))) {
|
||||||
lock_flags = LK_SHARED;
|
lock_flags = LK_SHARED;
|
||||||
} else {
|
} else {
|
||||||
lock_flags = LK_EXCLUSIVE;
|
lock_flags = LK_EXCLUSIVE;
|
||||||
@ -592,7 +592,8 @@ vn_write(fp, uio, active_cred, flags, td)
|
|||||||
(error = vn_start_write(vp, &mp, V_WAIT | PCATCH)) != 0)
|
(error = vn_start_write(vp, &mp, V_WAIT | PCATCH)) != 0)
|
||||||
goto unlock;
|
goto unlock;
|
||||||
|
|
||||||
if (mp != NULL && (mp->mnt_kern_flag & MNTK_SHARED_WRITES) &&
|
if ((MNT_SHARED_WRITES(mp) ||
|
||||||
|
((mp == NULL) && MNT_SHARED_WRITES(vp->v_mount))) &&
|
||||||
(flags & FOF_OFFSET) != 0) {
|
(flags & FOF_OFFSET) != 0) {
|
||||||
lock_flags = LK_SHARED;
|
lock_flags = LK_SHARED;
|
||||||
} else {
|
} else {
|
||||||
|
@ -197,7 +197,7 @@ vop_read {
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
%% write vp E E E
|
%% write vp L L L
|
||||||
%! write pre VOP_WRITE_PRE
|
%! write pre VOP_WRITE_PRE
|
||||||
%! write post VOP_WRITE_POST
|
%! write post VOP_WRITE_POST
|
||||||
|
|
||||||
|
@ -336,6 +336,9 @@ void __mnt_vnode_markerfree(struct vnode **mvp, struct mount *mp);
|
|||||||
#define MNTK_LOOKUP_SHARED 0x40000000 /* FS supports shared lock lookups */
|
#define MNTK_LOOKUP_SHARED 0x40000000 /* FS supports shared lock lookups */
|
||||||
#define MNTK_NOKNOTE 0x80000000 /* Don't send KNOTEs from VOP hooks */
|
#define MNTK_NOKNOTE 0x80000000 /* Don't send KNOTEs from VOP hooks */
|
||||||
|
|
||||||
|
#define MNT_SHARED_WRITES(mp) (((mp) != NULL) && \
|
||||||
|
((mp)->mnt_kern_flag & MNTK_SHARED_WRITES))
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Sysctl CTL_VFS definitions.
|
* Sysctl CTL_VFS definitions.
|
||||||
*
|
*
|
||||||
|
Loading…
Reference in New Issue
Block a user