From owner-svn-src-user@FreeBSD.ORG Thu Jun 18 23:16:32 2009 Return-Path: Delivered-To: svn-src-user@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 140BE106564A; Thu, 18 Jun 2009 23:16:32 +0000 (UTC) (envelope-from kmacy@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 0261F8FC12; Thu, 18 Jun 2009 23:16:32 +0000 (UTC) (envelope-from kmacy@FreeBSD.org) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id n5INGVoZ024864; Thu, 18 Jun 2009 23:16:31 GMT (envelope-from kmacy@svn.freebsd.org) Received: (from kmacy@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id n5INGVAi024859; Thu, 18 Jun 2009 23:16:31 GMT (envelope-from kmacy@svn.freebsd.org) Message-Id: <200906182316.n5INGVAi024859@svn.freebsd.org> From: Kip Macy Date: Thu, 18 Jun 2009 23:16:31 +0000 (UTC) To: src-committers@freebsd.org, svn-src-user@freebsd.org X-SVN-Group: user MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r194467 - in user/kmacy/releng_7_2_fcs/sys: kern sys X-BeenThere: svn-src-user@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the experimental " user" src tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 18 Jun 2009 23:16:32 -0000 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. *