svn commit: r312600 - head/sys/kern

Konstantin Belousov kostikbel at gmail.com
Sat Jan 21 19:51:19 UTC 2017


On Sat, Jan 21, 2017 at 06:38:17PM +0000, Mateusz Guzik wrote:
> Author: mjg
> Date: Sat Jan 21 18:38:16 2017
> New Revision: 312600
> URL: https://svnweb.freebsd.org/changeset/base/312600
> 
> Log:
>   vfs: refactor _vn_lock
>   
>   Stop testing for LK_RETRY and error multiple times. Also postpone the
>   VI_DOOMED until after LK_RETRY was seen as it reads from the vnode.
>   
>   No functional changes.
> 
> Modified:
>   head/sys/kern/vfs_vnops.c
> 
> Modified: head/sys/kern/vfs_vnops.c
> ==============================================================================
> --- head/sys/kern/vfs_vnops.c	Sat Jan 21 17:39:10 2017	(r312599)
> +++ head/sys/kern/vfs_vnops.c	Sat Jan 21 18:38:16 2017	(r312600)
> @@ -1539,27 +1539,24 @@ _vn_lock(struct vnode *vp, int flags, ch
>  
>  	VNASSERT((flags & LK_TYPE_MASK) != 0, vp,
>  	    ("vn_lock called with no locktype."));
> -	do {
>  #ifdef DEBUG_VFS_LOCKS
> -		KASSERT(vp->v_holdcnt != 0,
> -		    ("vn_lock %p: zero hold count", vp));
> +	KASSERT(vp->v_holdcnt != 0,
> +			("vn_lock %p: zero hold count", vp));
This line also has wrong inde seems to not be fixed by later commit.

>  #endif
> -		error = VOP_LOCK1(vp, flags, file, line);
> -		flags &= ~LK_INTERLOCK;	/* Interlock is always dropped. */
> -		KASSERT((flags & LK_RETRY) == 0 || error == 0,
> -		    ("LK_RETRY set with incompatible flags (0x%x) or an error occurred (%d)",
> -		    flags, error));
> -		/*
> -		 * Callers specify LK_RETRY if they wish to get dead vnodes.
> -		 * If RETRY is not set, we return ENOENT instead.
> -		 */
> -		if (error == 0 && vp->v_iflag & VI_DOOMED &&
> -		    (flags & LK_RETRY) == 0) {
> +retry:
> +	error = VOP_LOCK1(vp, flags, file, line);
> +	flags &= ~LK_INTERLOCK;	/* Interlock is always dropped. */
> +	KASSERT((flags & LK_RETRY) == 0 || error == 0,
> +			("LK_RETRY set with incompatible flags (0x%x) or an error occurred (%d)",
> +			 flags, error));
> +	if (flags & LK_RETRY) {
Stylish test is
	if ((flags & LK_RETRY) != 0) {
> +		if ((error != 0))
Too many ().

> +			goto retry;
> +		if ((vp->v_iflag & VI_DOOMED)) {
Too many braces again, or missed != 0.
>  			VOP_UNLOCK(vp, 0);
>  			error = ENOENT;
> -			break;
Also, this does the functional change, it seems to completely break LK_RERY
logic.  If LK_RETRY is specified, VI_DOOMED must not result in ENOENT.

>  		}
> -	} while (flags & LK_RETRY && error != 0);
> +	}
>  	return (error);
>  }
>  


More information about the svn-src-all mailing list