Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 24 Apr 2012 19:10:14 GMT
From:      dfilter@FreeBSD.ORG (dfilter service)
To:        freebsd-fs@FreeBSD.org
Subject:   Re: kern/159663: commit references a PR
Message-ID:  <201204241910.q3OJAE2m070124@freefall.freebsd.org>

next in thread | raw e-mail | index | archive | help
The following reply was made to PR kern/159663; it has been noted by GNATS.

From: dfilter@FreeBSD.ORG (dfilter service)
To: bug-followup@FreeBSD.org
Cc:  
Subject: Re: kern/159663: commit references a PR
Date: Tue, 24 Apr 2012 19:08:51 +0000 (UTC)

 Author: trociny
 Date: Tue Apr 24 19:08:40 2012
 New Revision: 234660
 URL: http://svn.freebsd.org/changeset/base/234660
 
 Log:
   MFC r232317:
   
   Introduce VOP_UNP_BIND(), VOP_UNP_CONNECT(), and VOP_UNP_DETACH()
   operations for setting and accessing vnode's v_socket field.
   
   The operations are necessary to implement proper unix socket handling
   on layered file systems like nullfs(5).
   
   This change fixes the long standing issue with nullfs(5) being in that
   unix sockets did not work between lower and upper layers: if we bound
   to a socket on the lower layer we could connect only to the lower
   path; if we bound to the upper layer we could connect only to the
   upper path. The new behavior is one can connect to both the lower and
   the upper paths regardless what layer path one binds to.
   
   PR:		kern/51583, kern/159663
   Suggested by:	kib
   Reviewed by:	arch
 
 Modified:
   stable/9/UPDATING   (contents, props changed)
   stable/9/sys/kern/uipc_usrreq.c
   stable/9/sys/kern/vfs_default.c
   stable/9/sys/kern/vnode_if.src
   stable/9/sys/sys/vnode.h
 Directory Properties:
   stable/9/sys/   (props changed)
 
 Modified: stable/9/UPDATING
 ==============================================================================
 --- stable/9/UPDATING	Tue Apr 24 19:00:42 2012	(r234659)
 +++ stable/9/UPDATING	Tue Apr 24 19:08:40 2012	(r234660)
 @@ -9,6 +9,14 @@ handbook.
  Items affecting the ports and packages system can be found in
  /usr/ports/UPDATING.  Please read that file before running portupgrade.
  
 +20120422:
 +	Now unix domain sockets behave "as expected" on	nullfs(5). Previously
 +	nullfs(5) did not pass through all behaviours to the underlying layer,
 +	as a result if we bound to a socket on the lower layer we could connect
 +	only to the lower path; if we bound to the upper layer we could connect
 +	only to	the upper path. The new behavior is one can connect to both the
 +	lower and the upper paths regardless what layer path one binds to.
 +
  20120109:
  	The acpi_wmi(4) status device /dev/wmistat has been renamed to
  	/dev/wmistat0.
 
 Modified: stable/9/sys/kern/uipc_usrreq.c
 ==============================================================================
 --- stable/9/sys/kern/uipc_usrreq.c	Tue Apr 24 19:00:42 2012	(r234659)
 +++ stable/9/sys/kern/uipc_usrreq.c	Tue Apr 24 19:08:40 2012	(r234660)
 @@ -541,7 +541,7 @@ restart:
  
  	UNP_LINK_WLOCK();
  	UNP_PCB_LOCK(unp);
 -	vp->v_socket = unp->unp_socket;
 +	VOP_UNP_BIND(vp, unp->unp_socket);
  	unp->unp_vnode = vp;
  	unp->unp_addr = soun;
  	unp->unp_flags &= ~UNP_BINDING;
 @@ -637,7 +637,7 @@ uipc_detach(struct socket *so)
  	 * XXXRW: Should assert vp->v_socket == so.
  	 */
  	if ((vp = unp->unp_vnode) != NULL) {
 -		unp->unp_vnode->v_socket = NULL;
 +		VOP_UNP_DETACH(vp);
  		unp->unp_vnode = NULL;
  	}
  	unp2 = unp->unp_conn;
 @@ -1307,7 +1307,7 @@ unp_connect(struct socket *so, struct so
  	 * and to protect simultaneous locking of multiple pcbs.
  	 */
  	UNP_LINK_WLOCK();
 -	so2 = vp->v_socket;
 +	VOP_UNP_CONNECT(vp, &so2);
  	if (so2 == NULL) {
  		error = ECONNREFUSED;
  		goto bad2;
 @@ -2317,17 +2317,15 @@ vfs_unp_reclaim(struct vnode *vp)
  
  	active = 0;
  	UNP_LINK_WLOCK();
 -	so = vp->v_socket;
 +	VOP_UNP_CONNECT(vp, &so);
  	if (so == NULL)
  		goto done;
  	unp = sotounpcb(so);
  	if (unp == NULL)
  		goto done;
  	UNP_PCB_LOCK(unp);
 -	if (unp->unp_vnode != NULL) {
 -		KASSERT(unp->unp_vnode == vp,
 -		    ("vfs_unp_reclaim: vp != unp->unp_vnode"));
 -		vp->v_socket = NULL;
 +	if (unp->unp_vnode == vp) {
 +		VOP_UNP_DETACH(vp);
  		unp->unp_vnode = NULL;
  		active = 1;
  	}
 
 Modified: stable/9/sys/kern/vfs_default.c
 ==============================================================================
 --- stable/9/sys/kern/vfs_default.c	Tue Apr 24 19:00:42 2012	(r234659)
 +++ stable/9/sys/kern/vfs_default.c	Tue Apr 24 19:08:40 2012	(r234660)
 @@ -123,6 +123,9 @@ struct vop_vector default_vnodeops = {
  	.vop_unlock =		vop_stdunlock,
  	.vop_vptocnp =		vop_stdvptocnp,
  	.vop_vptofh =		vop_stdvptofh,
 +	.vop_unp_bind =		vop_stdunp_bind,
 +	.vop_unp_connect =	vop_stdunp_connect,
 +	.vop_unp_detach =	vop_stdunp_detach,
  };
  
  /*
 @@ -1037,6 +1040,30 @@ vop_stdadvise(struct vop_advise_args *ap
  	return (error);
  }
  
 +int
 +vop_stdunp_bind(struct vop_unp_bind_args *ap)
 +{
 +
 +	ap->a_vp->v_socket = ap->a_socket;
 +	return (0);
 +}
 +
 +int
 +vop_stdunp_connect(struct vop_unp_connect_args *ap)
 +{
 +
 +	*ap->a_socket = ap->a_vp->v_socket;
 +	return (0);
 +}
 +
 +int
 +vop_stdunp_detach(struct vop_unp_detach_args *ap)
 +{
 +
 +	ap->a_vp->v_socket = NULL;
 +	return (0);
 +}
 +
  /*
   * vfs default ops
   * used to fill the vfs function table to get reasonable default return values.
 
 Modified: stable/9/sys/kern/vnode_if.src
 ==============================================================================
 --- stable/9/sys/kern/vnode_if.src	Tue Apr 24 19:00:42 2012	(r234659)
 +++ stable/9/sys/kern/vnode_if.src	Tue Apr 24 19:08:40 2012	(r234660)
 @@ -640,23 +640,31 @@ vop_advise {
  	IN int advice;
  };
  
 -# The VOPs below are spares at the end of the table to allow new VOPs to be
 -# added in stable branches without breaking the KBI.  New VOPs in HEAD should
 -# be added above these spares.  When merging a new VOP to a stable branch,
 -# the new VOP should replace one of the spares.
 +%% unp_bind	vp	E E E
  
 -vop_spare1 {
 +vop_unp_bind {
  	IN struct vnode *vp;
 +	IN struct socket *socket;
  };
  
 -vop_spare2 {
 +%% unp_connect	vp	L L L
 +
 +vop_unp_connect {
  	IN struct vnode *vp;
 +	OUT struct socket **socket;
  };
  
 -vop_spare3 {
 +%% unp_detach	vp	= = =
 +
 +vop_unp_detach {
  	IN struct vnode *vp;
  };
  
 +# The VOPs below are spares at the end of the table to allow new VOPs to be
 +# added in stable branches without breaking the KBI.  New VOPs in HEAD should
 +# be added above these spares.  When merging a new VOP to a stable branch,
 +# the new VOP should replace one of the spares.
 +
  vop_spare4 {
  	IN struct vnode *vp;
  };
 
 Modified: stable/9/sys/sys/vnode.h
 ==============================================================================
 --- stable/9/sys/sys/vnode.h	Tue Apr 24 19:00:42 2012	(r234659)
 +++ stable/9/sys/sys/vnode.h	Tue Apr 24 19:08:40 2012	(r234660)
 @@ -707,6 +707,9 @@ int	vop_stdpathconf(struct vop_pathconf_
  int	vop_stdpoll(struct vop_poll_args *);
  int	vop_stdvptocnp(struct vop_vptocnp_args *ap);
  int	vop_stdvptofh(struct vop_vptofh_args *ap);
 +int	vop_stdunp_bind(struct vop_unp_bind_args *ap);
 +int	vop_stdunp_connect(struct vop_unp_connect_args *ap);
 +int	vop_stdunp_detach(struct vop_unp_detach_args *ap);
  int	vop_eopnotsupp(struct vop_generic_args *ap);
  int	vop_ebadf(struct vop_generic_args *ap);
  int	vop_einval(struct vop_generic_args *ap);
 _______________________________________________
 svn-src-all@freebsd.org mailing list
 http://lists.freebsd.org/mailman/listinfo/svn-src-all
 To unsubscribe, send any mail to "svn-src-all-unsubscribe@freebsd.org"
 



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