svn commit: r194467 - in user/kmacy/releng_7_2_fcs/sys: kern sys
Kip Macy
kmacy at FreeBSD.org
Thu Jun 18 23:16:32 UTC 2009
Author: kmacy
Date: Thu Jun 18 23:16:31 2009
New Revision: 194467
URL: http://svn.freebsd.org/changeset/base/194467
Log:
use shared lockmgr locks for range-locked file systems
Modified:
user/kmacy/releng_7_2_fcs/sys/kern/vfs_syscalls.c
user/kmacy/releng_7_2_fcs/sys/kern/vfs_vnops.c
user/kmacy/releng_7_2_fcs/sys/kern/vnode_if.src
user/kmacy/releng_7_2_fcs/sys/sys/mount.h
Modified: user/kmacy/releng_7_2_fcs/sys/kern/vfs_syscalls.c
==============================================================================
--- user/kmacy/releng_7_2_fcs/sys/kern/vfs_syscalls.c Thu Jun 18 22:41:43 2009 (r194466)
+++ user/kmacy/releng_7_2_fcs/sys/kern/vfs_syscalls.c Thu Jun 18 23:16:31 2009 (r194467)
@@ -3273,7 +3273,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)
@@ -3282,7 +3282,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, td);
+ 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, td);
AUDIT_ARG(vnode, vp, ARG_VNODE1);
if (vp->v_object != NULL) {
VM_OBJECT_LOCK(vp->v_object);
Modified: user/kmacy/releng_7_2_fcs/sys/kern/vfs_vnops.c
==============================================================================
--- user/kmacy/releng_7_2_fcs/sys/kern/vfs_vnops.c Thu Jun 18 22:41:43 2009 (r194466)
+++ user/kmacy/releng_7_2_fcs/sys/kern/vfs_vnops.c Thu Jun 18 23:16:31 2009 (r194467)
@@ -351,7 +351,7 @@ vn_rdwr(rw, vp, base, len, offset, segfl
struct iovec aiov;
struct mount *mp;
struct ucred *cred;
- int error;
+ int error, lock_flags;
VFS_ASSERT_GIANT(vp->v_mount);
@@ -362,10 +362,14 @@ vn_rdwr(rw, vp, base, len, offset, segfl
(error = vn_start_write(vp, &mp, V_WAIT | PCATCH))
!= 0)
return (error);
- vn_lock(vp, LK_EXCLUSIVE | LK_RETRY, td);
- } else
- vn_lock(vp, LK_SHARED | LK_RETRY, td);
-
+ 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, td);
+ }
}
ASSERT_VOP_LOCKED(vp, "IO_NODELOCKED with no vp lock held");
auio.uio_iov = &aiov;
@@ -469,6 +473,7 @@ vn_rdwr_inchunks(rw, vp, base, len, offs
return (error);
}
+
/*
* File table vnode read routine.
*/
@@ -549,7 +554,7 @@ vn_write(fp, uio, active_cred, flags, td
{
struct vnode *vp;
struct mount *mp;
- int error, ioflag;
+ int error, ioflag, lock_flags;
int vfslocked;
KASSERT(uio->uio_td == td, ("uio_td %p is not td %p",
@@ -573,7 +578,15 @@ vn_write(fp, uio, active_cred, flags, td
(error = vn_start_write(vp, &mp, V_WAIT | PCATCH)) != 0)
goto unlock;
VOP_LEASE(vp, td, fp->f_cred, LEASE_WRITE);
- vn_lock(vp, LK_EXCLUSIVE | LK_RETRY, td);
+ if ((MNT_SHARED_WRITES(mp) ||
+ ((mp == NULL) && MNT_SHARED_WRITES(vp->v_mount))) &&
+ (flags & FOF_OFFSET) != 0) {
+ lock_flags = LK_SHARED;
+ } else {
+ lock_flags = LK_EXCLUSIVE;
+ }
+
+ vn_lock(vp, lock_flags | LK_RETRY, td);
if ((flags & FOF_OFFSET) == 0)
uio->uio_offset = fp->f_offset;
ioflag |= sequential_heuristic(uio, fp);
Modified: user/kmacy/releng_7_2_fcs/sys/kern/vnode_if.src
==============================================================================
--- user/kmacy/releng_7_2_fcs/sys/kern/vnode_if.src Thu Jun 18 22:41:43 2009 (r194466)
+++ user/kmacy/releng_7_2_fcs/sys/kern/vnode_if.src Thu Jun 18 23:16:31 2009 (r194467)
@@ -185,7 +185,7 @@ vop_read {
};
-%% write vp E E E
+%% write vp L L L
%! write pre VOP_WRITE_PRE
%! write post VOP_WRITE_POST
@@ -245,7 +245,7 @@ vop_revoke {
};
-%% fsync vp E E E
+%% fsync vp L L L
vop_fsync {
IN struct vnode *vp;
Modified: user/kmacy/releng_7_2_fcs/sys/sys/mount.h
==============================================================================
--- user/kmacy/releng_7_2_fcs/sys/sys/mount.h Thu Jun 18 22:41:43 2009 (r194466)
+++ user/kmacy/releng_7_2_fcs/sys/sys/mount.h Thu Jun 18 23:16:31 2009 (r194467)
@@ -328,6 +328,7 @@ void __mnt_vnode_markerfree(str
#define MNTK_SOFTDEP 0x00000004 /* async disabled by softdep */
#define MNTK_NOINSMNTQ 0x00000008 /* insmntque is not allowed */
#define MNTK_REFEXPIRE 0x00000020 /* refcount expiring is happening */
+#define MNTK_SHARED_WRITES 0x00000080 /* Allow shared locking for writes */
#define MNTK_UNMOUNT 0x01000000 /* unmount in progress */
#define MNTK_MWAIT 0x02000000 /* waiting for unmount to finish */
#define MNTK_SUSPEND 0x08000000 /* request write suspension */
@@ -337,6 +338,9 @@ void __mnt_vnode_markerfree(str
#define MNTK_NOKNOTE 0x80000000 /* Don't send KNOTEs from VOP hooks */
#define MNTK_LOOKUP_SHARED 0x40000000 /* FS supports shared lock lookups */
+#define MNT_SHARED_WRITES(mp) (((mp) != NULL) && \
+ ((mp)->mnt_kern_flag & MNTK_SHARED_WRITES))
+
/*
* Sysctl CTL_VFS definitions.
*
More information about the svn-src-user
mailing list