Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 22 Apr 2012 16:36:50 +0300
From:      Mikolaj Golub <trociny@freebsd.org>
To:        freebsd-arch@freebsd.org
Cc:        Konstantin Belousov <kostikbel@gmail.com>, "Bjoern A. Zeeb" <bz@freebsd.org>, "Robert N. M. Watson" <rwatson@freebsd.org>
Subject:   Re: unix domain sockets on nullfs(5)
Message-ID:  <86wr57lwgd.fsf@kopusha.home.net>
In-Reply-To: <8B0B7D86-1EE6-4901-9E36-EA1918315163@freebsd.org> (Robert N. M. Watson's message of "Sat, 25 Feb 2012 19:16:08 %2B0000")
References:  <CAOnPXZ_y5G6uEBWmfuH7qYBh%2B4Pw=O91ztCPEFCOTzWdCzx%2BRA@mail.gmail.com> <BBDE763A-F55E-453D-A503-2489C9040EF6@freebsd.org> <20120112215106.GC31224@deviant.kiev.zoral.com.ua> <86hazntwmu.fsf@kopusha.home.net> <20120123031238.GL31224@deviant.kiev.zoral.com.ua> <86zkcfu9ac.fsf@kopusha.home.net> <20120218215003.GM3283@deviant.kiev.zoral.com.ua> <86ehtrf8qf.fsf@kopusha.home.net> <20120219170151.GS3283@deviant.kiev.zoral.com.ua> <86d393dvqr.fsf@kopusha.home.net> <20120225174818.GC55074@deviant.kiev.zoral.com.ua> <8B0B7D86-1EE6-4901-9E36-EA1918315163@freebsd.org>

next in thread | previous in thread | raw e-mail | index | archive | help
--=-=-=

Hi,

On Sat, 25 Feb 2012 19:16:08 +0000 Robert N. M. Watson wrote:

 RNMW> On 25 Feb 2012, at 17:48, Konstantin Belousov wrote:

 >>> I am thinking now about 'MFC after'. Thanks to jhb's spare vops it looks like
 >>> it is possible to merge it in stable/9 without breaking the KBI, but then I
 >>> will consume 3 of 5 available spare vops. So is it worth doing?
 >> I do not think that we shall be so restrained on the use of spare VOPs.

 RNMW> I think the only real question here is whether John had specific things
 RNMW> in mind when he added the spares, or whether they are open for general
 RNMW> use. Assuming they are open for general use, this use seems a quite
 RNMW> beneficial one :-).

I am going to MFC VOP_UNP_* operations (r232317) and this is just to ask the
last time if someone sees problems with this or would like to reserve them for
other things.

Also could you please look at the merge diff I am going to commit if it looks
ok?

-- 
Mikolaj Golub


--=-=-=
Content-Type: text/x-patch
Content-Disposition: inline; filename=r232317.diff

Index: UPDATING
===================================================================
--- UPDATING	(revision 234553)
+++ UPDATING	(working copy)
@@ -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.

Property changes on: UPDATING
___________________________________________________________________
Modified: svn:mergeinfo
   Merged /head/UPDATING:r232317
Index: sys
===================================================================
--- sys	(revision 234553)
+++ sys	(working copy)

Property changes on: sys
___________________________________________________________________
Modified: svn:mergeinfo
   Merged /head/sys:r232317
Index: sys/sys/vnode.h
===================================================================
--- sys/sys/vnode.h	(revision 234553)
+++ sys/sys/vnode.h	(working copy)
@@ -707,6 +707,9 @@ int	vop_stdpathconf(struct vop_pathconf_args *);
 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);
Index: sys/kern/uipc_usrreq.c
===================================================================
--- sys/kern/uipc_usrreq.c	(revision 234553)
+++ sys/kern/uipc_usrreq.c	(working copy)
@@ -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 sockaddr *na
 	 * 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;
 	}
Index: sys/kern/vfs_default.c
===================================================================
--- sys/kern/vfs_default.c	(revision 234553)
+++ sys/kern/vfs_default.c	(working copy)
@@ -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.
Index: sys/kern/vnode_if.src
===================================================================
--- sys/kern/vnode_if.src	(revision 234553)
+++ sys/kern/vnode_if.src	(working copy)
@@ -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;
 };

--=-=-=--



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