svn commit: r193440 - in head/sys:
cddl/contrib/opensolaris/uts/common/fs/zfs kern sys
Kostik Belousov
kostikbel at gmail.com
Thu Jun 4 16:31:03 UTC 2009
On Thu, Jun 04, 2009 at 04:18:08PM +0000, Paul Saab wrote:
> Author: ps
> Date: Thu Jun 4 16:18:07 2009
> New Revision: 193440
> URL: http://svn.freebsd.org/changeset/base/193440
>
> Log:
> Support shared vnode locks for write operations when the offset is
> provided on filesystems that support it. This really improves mysql
> + innodb performance on ZFS.
>
> Reviewed by: jhb, kmacy, jeffr
>
> Modified:
> head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vfsops.c
> head/sys/kern/vfs_vnops.c
> head/sys/sys/mount.h
>
> Modified: head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vfsops.c
> ==============================================================================
> --- head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vfsops.c Thu Jun 4 15:57:38 2009 (r193439)
> +++ head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vfsops.c Thu Jun 4 16:18:07 2009 (r193440)
> @@ -573,6 +573,7 @@ zfs_domount(vfs_t *vfsp, char *osname)
> vfsp->mnt_flag |= MNT_LOCAL;
> vfsp->mnt_kern_flag |= MNTK_MPSAFE;
> vfsp->mnt_kern_flag |= MNTK_LOOKUP_SHARED;
> + vfsp->mnt_kern_flag |= MNTK_SHARED_WRITES;
>
> if (error = dsl_prop_get_integer(osname, "readonly", &readonly, NULL))
> goto out;
>
> Modified: head/sys/kern/vfs_vnops.c
> ==============================================================================
> --- head/sys/kern/vfs_vnops.c Thu Jun 4 15:57:38 2009 (r193439)
> +++ head/sys/kern/vfs_vnops.c Thu Jun 4 16:18:07 2009 (r193440)
> @@ -367,7 +367,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);
>
> @@ -378,7 +378,13 @@ 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);
> + if (mp != NULL &&
> + (mp->mnt_kern_flag & MNTK_SHARED_WRITES)) {
> + lock_flags = LK_SHARED;
> + } else {
> + lock_flags = LK_EXCLUSIVE;
> + }
> + vn_lock(vp, lock_flags | LK_RETRY);
> } else
> vn_lock(vp, LK_SHARED | LK_RETRY);
>
> @@ -564,7 +570,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",
> @@ -587,7 +593,16 @@ vn_write(fp, uio, active_cred, flags, td
> if (vp->v_type != VCHR &&
> (error = vn_start_write(vp, &mp, V_WAIT | PCATCH)) != 0)
> goto unlock;
> - vn_lock(vp, LK_EXCLUSIVE | LK_RETRY);
> +
> + if (vp->v_mount != NULL &&
> + (vp->v_mount->mnt_kern_flag & MNTK_SHARED_WRITES) &&
> + (flags & FOF_OFFSET) != 0) {
> + lock_flags = LK_SHARED;
> + } else {
> + lock_flags = LK_EXCLUSIVE;
> + }
> +
> + vn_lock(vp, lock_flags | LK_RETRY);
> if ((flags & FOF_OFFSET) == 0)
> uio->uio_offset = fp->f_offset;
> ioflag |= sequential_heuristic(uio, fp);
Why do you check for vnode v_mount flags in vn_write, while performing
the check on the vop_getwritemount(vp) result for vn_rdwr ?
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 195 bytes
Desc: not available
Url : http://lists.freebsd.org/pipermail/svn-src-head/attachments/20090604/390b494a/attachment.pgp
More information about the svn-src-head
mailing list