svn commit: r193762 - in head/sys: kern sys

Chagin Dmitry dchagin at freebsd.org
Wed Jun 10 17:48:04 UTC 2009


On Mon, Jun 08, 2009 at 09:23:54PM +0000, Paul Saab wrote:
> Author: ps
> Date: Mon Jun  8 21:23:54 2009
> New Revision: 193762
> URL: http://svn.freebsd.org/changeset/base/193762
> 
> Log:
>   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
> 
> Modified:
>   head/sys/kern/vfs_syscalls.c
>   head/sys/kern/vfs_vnops.c
>   head/sys/kern/vnode_if.src
>   head/sys/sys/mount.h
> 
> Modified: head/sys/kern/vfs_syscalls.c
> ==============================================================================
> --- head/sys/kern/vfs_syscalls.c	Mon Jun  8 21:16:06 2009	(r193761)
> +++ head/sys/kern/vfs_syscalls.c	Mon Jun  8 21:23:54 2009	(r193762)
> @@ -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);
> 


vnode_if.src needs to be changed:

diff --git a/sys/kern/vnode_if.src b/sys/kern/vnode_if.src
index f54d046..49cc782 100644
--- a/sys/kern/vnode_if.src
+++ b/sys/kern/vnode_if.src
@@ -247,7 +247,7 @@ vop_revoke {
 };


-%% fsync       vp      E E E
+%% fsync       vp      L L L

 vop_fsync {
        IN struct vnode *vp;






> Modified: head/sys/kern/vfs_vnops.c
> ==============================================================================
> --- head/sys/kern/vfs_vnops.c	Mon Jun  8 21:16:06 2009	(r193761)
> +++ head/sys/kern/vfs_vnops.c	Mon Jun  8 21:23:54 2009	(r193762)
> @@ -376,8 +376,8 @@ vn_rdwr(rw, vp, base, len, offset, segfl
>  			    (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 {
> 
> Modified: head/sys/kern/vnode_if.src
> ==============================================================================
> --- head/sys/kern/vnode_if.src	Mon Jun  8 21:16:06 2009	(r193761)
> +++ head/sys/kern/vnode_if.src	Mon Jun  8 21:23:54 2009	(r193762)
> @@ -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
>  
> 
> Modified: head/sys/sys/mount.h
> ==============================================================================
> --- head/sys/sys/mount.h	Mon Jun  8 21:16:06 2009	(r193761)
> +++ head/sys/sys/mount.h	Mon Jun  8 21:23:54 2009	(r193762)
> @@ -336,6 +336,9 @@ void          __mnt_vnode_markerfree(str
>  #define MNTK_LOOKUP_SHARED	0x40000000 /* FS supports shared lock lookups */
>  #define	MNTK_NOKNOTE	0x80000000	/* Don't send KNOTEs from VOP hooks */
>  
> +#define	MNT_SHARED_WRITES(mp) (((mp) != NULL) && 	\
> +				((mp)->mnt_kern_flag & MNTK_SHARED_WRITES))
> +
>  /*
>   * Sysctl CTL_VFS definitions.
>   *

-- 
Have fun!
chd
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 196 bytes
Desc: not available
Url : http://lists.freebsd.org/pipermail/svn-src-head/attachments/20090610/370a5e72/attachment.pgp


More information about the svn-src-head mailing list