Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 18 Jun 2009 23:16:31 +0000 (UTC)
From:      Kip Macy <kmacy@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-user@freebsd.org
Subject:   svn commit: r194467 - in user/kmacy/releng_7_2_fcs/sys: kern sys
Message-ID:  <200906182316.n5INGVAi024859@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
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.
  *



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200906182316.n5INGVAi024859>