Only unix(4) sockets have pru_connect2() support. This movement makes soconnect2() just pru_connect2() wrapper and removes "persocket" logic from this path. Since the pru_*() request handlers are the separate functions, this doesn't introduce locking inconsistency to the pcb layer.
Also, we already have dummy soabort(), so it looks reasonable to turn it inline with the soconnect2(). Index: sys/kern/uipc_socket.c =================================================================== RCS file: /cvs/src/sys/kern/uipc_socket.c,v retrieving revision 1.291 diff -u -p -r1.291 uipc_socket.c --- sys/kern/uipc_socket.c 28 Nov 2022 21:39:28 -0000 1.291 +++ sys/kern/uipc_socket.c 9 Dec 2022 21:42:09 -0000 @@ -484,19 +484,7 @@ soconnect(struct socket *so, struct mbuf int soconnect2(struct socket *so1, struct socket *so2) { - int persocket, error; - - if ((persocket = solock_persocket(so1))) - solock_pair(so1, so2); - else - solock(so1); - - error = pru_connect2(so1, so2); - - if (persocket) - sounlock(so2); - sounlock(so1); - return (error); + return pru_connect2(so1, so2); } int Index: sys/kern/uipc_usrreq.c =================================================================== RCS file: /cvs/src/sys/kern/uipc_usrreq.c,v retrieving revision 1.195 diff -u -p -r1.195 uipc_usrreq.c --- sys/kern/uipc_usrreq.c 5 Dec 2022 23:18:37 -0000 1.195 +++ sys/kern/uipc_usrreq.c 9 Dec 2022 21:42:09 -0000 @@ -678,8 +678,10 @@ uipc_connect2(struct socket *so, struct struct unpcb *unp = sotounpcb(so), *unp2; int error; + solock_pair(so, so2); + if ((error = unp_connect2(so, so2))) - return (error); + goto error; unp->unp_connid.uid = curproc->p_ucred->cr_uid; unp->unp_connid.gid = curproc->p_ucred->cr_gid; @@ -690,8 +692,11 @@ uipc_connect2(struct socket *so, struct unp2->unp_connid.gid = curproc->p_ucred->cr_gid; unp2->unp_connid.pid = curproc->p_p->ps_pid; unp2->unp_flags |= UNP_FEIDS; +error: + sounlock(so); + sounlock(so2); - return (0); + return (error); } int