aboutsummaryrefslogtreecommitdiff
path: root/sys/kern
diff options
context:
space:
mode:
authorPaul Saab <ps@FreeBSD.org>2009-06-08 21:23:54 +0000
committerPaul Saab <ps@FreeBSD.org>2009-06-08 21:23:54 +0000
commit27bfb741a01a2eafe4cf87d015852552c77290fa (patch)
tree0aab3ab07073d31e07902129e05eb637c62a659d /sys/kern
parenta91ac60c20863b121cf2f1deda5d2a7997a73157 (diff)
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
Notes
Notes: svn path=/head/; revision=193762
Diffstat (limited to 'sys/kern')
-rw-r--r--sys/kern/vfs_syscalls.c10
-rw-r--r--sys/kern/vfs_vnops.c7
-rw-r--r--sys/kern/vnode_if.src2
3 files changed, 13 insertions, 6 deletions
diff --git a/sys/kern/vfs_syscalls.c b/sys/kern/vfs_syscalls.c
index 72a53f8f7058..1cc6d2d31264 100644
--- a/sys/kern/vfs_syscalls.c
+++ b/sys/kern/vfs_syscalls.c
@@ -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);
diff --git a/sys/kern/vfs_vnops.c b/sys/kern/vfs_vnops.c
index 702faaeaba85..9ffb6a60d8c2 100644
--- a/sys/kern/vfs_vnops.c
+++ b/sys/kern/vfs_vnops.c
@@ -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 {
diff --git a/sys/kern/vnode_if.src b/sys/kern/vnode_if.src
index 81c0dff4f6c8..f54d0461f6c7 100644
--- a/sys/kern/vnode_if.src
+++ b/sys/kern/vnode_if.src
@@ -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