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:
Paul Saab 2009-06-08 21:23:54 +00:00
parent a91ac60c20
commit 27bfb741a0
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=193762
4 changed files with 16 additions and 6 deletions

View File

@ -3476,7 +3476,7 @@ fsync(td, uap)
struct mount *mp;
struct file *fp;
int vfslocked;
int error;
int error, lock_flags;
AUDIT_ARG(fd, uap->fd);
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);
if ((error = vn_start_write(vp, &mp, V_WAIT | PCATCH)) != 0)
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);
if (vp->v_object != NULL) {
VM_OBJECT_LOCK(vp->v_object);

View File

@ -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))
!= 0)
return (error);
if (mp != NULL &&
(mp->mnt_kern_flag & MNTK_SHARED_WRITES)) {
if (MNT_SHARED_WRITES(mp) ||
((mp == NULL) && MNT_SHARED_WRITES(vp->v_mount))) {
lock_flags = LK_SHARED;
} else {
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)
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) {
lock_flags = LK_SHARED;
} else {

View File

@ -197,7 +197,7 @@ vop_read {
};
%% write vp E E E
%% write vp L L L
%! write pre VOP_WRITE_PRE
%! write post VOP_WRITE_POST

View File

@ -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_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.
*