summaryrefslogtreecommitdiffstats
path: root/sys/kern/uipc_usrreq.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/kern/uipc_usrreq.c')
-rw-r--r--sys/kern/uipc_usrreq.c31
1 files changed, 6 insertions, 25 deletions
diff --git a/sys/kern/uipc_usrreq.c b/sys/kern/uipc_usrreq.c
index 0c1819b5c35..01fee7121f8 100644
--- a/sys/kern/uipc_usrreq.c
+++ b/sys/kern/uipc_usrreq.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: uipc_usrreq.c,v 1.115 2017/02/09 11:18:55 mpi Exp $ */
+/* $OpenBSD: uipc_usrreq.c,v 1.116 2017/02/14 09:46:21 mpi Exp $ */
/* $NetBSD: uipc_usrreq.c,v 1.18 1996/02/09 19:00:50 christos Exp $ */
/*
@@ -121,6 +121,9 @@ uipc_usrreq(struct socket *so, int req, struct mbuf *m, struct mbuf *nam,
error = EINVAL;
goto release;
}
+
+ NET_ASSERT_UNLOCKED();
+
switch (req) {
case PRU_ATTACH:
@@ -132,17 +135,11 @@ uipc_usrreq(struct socket *so, int req, struct mbuf *m, struct mbuf *nam,
break;
case PRU_DETACH:
- /* XXXSMP breaks atomicity */
- rw_exit_write(&netlock);
unp_detach(unp);
- rw_enter_write(&netlock);
break;
case PRU_BIND:
- /* XXXSMP breaks atomicity */
- rw_exit_write(&netlock);
error = unp_bind(unp, nam, p);
- rw_enter_write(&netlock);
break;
case PRU_LISTEN:
@@ -151,10 +148,7 @@ uipc_usrreq(struct socket *so, int req, struct mbuf *m, struct mbuf *nam,
break;
case PRU_CONNECT:
- /* XXXSMP breaks atomicity */
- rw_exit_write(&netlock);
error = unp_connect(so, nam, p);
- rw_enter_write(&netlock);
break;
case PRU_CONNECT2:
@@ -222,10 +216,7 @@ uipc_usrreq(struct socket *so, int req, struct mbuf *m, struct mbuf *nam,
error = EISCONN;
break;
}
- /* XXXSMP breaks atomicity */
- rw_exit_write(&netlock);
error = unp_connect(so, nam, p);
- rw_enter_write(&netlock);
if (error)
break;
} else {
@@ -398,8 +389,6 @@ unp_detach(struct unpcb *unp)
{
struct vnode *vp;
- NET_ASSERT_UNLOCKED();
-
LIST_REMOVE(unp, unp_link);
if (unp->unp_vnode) {
unp->unp_vnode->v_socket = NULL;
@@ -411,10 +400,7 @@ unp_detach(struct unpcb *unp)
unp_disconnect(unp);
while (!SLIST_EMPTY(&unp->unp_refs))
unp_drop(SLIST_FIRST(&unp->unp_refs), ECONNRESET);
- /* XXXSMP The assert is wrong */
- rw_enter_write(&netlock);
soisdisconnected(unp->unp_socket);
- rw_exit_write(&netlock);
unp->unp_socket->so_pcb = NULL;
m_freem(unp->unp_addr);
free(unp, M_PCB, sizeof *unp);
@@ -505,9 +491,7 @@ unp_connect(struct socket *so, struct mbuf *nam, struct proc *p)
struct socket *so2, *so3;
struct unpcb *unp, *unp2, *unp3;
struct nameidata nd;
- int error, s;
-
- NET_ASSERT_UNLOCKED();
+ int error;
if (soun->sun_family != AF_UNIX)
return (EAFNOSUPPORT);
@@ -539,12 +523,11 @@ unp_connect(struct socket *so, struct mbuf *nam, struct proc *p)
error = EPROTOTYPE;
goto bad;
}
- NET_LOCK(s);
if (so->so_proto->pr_flags & PR_CONNREQUIRED) {
if ((so2->so_options & SO_ACCEPTCONN) == 0 ||
(so3 = sonewconn(so2, 0)) == 0) {
error = ECONNREFUSED;
- goto unlock;
+ goto bad;
}
unp = sotounpcb(so);
unp2 = sotounpcb(so2);
@@ -563,8 +546,6 @@ unp_connect(struct socket *so, struct mbuf *nam, struct proc *p)
}
}
error = unp_connect2(so, so2);
-unlock:
- NET_UNLOCK(s);
bad:
vput(vp);
return (error);