svn commit: r359593 - stable/12/sys/kern

Mark Johnston markj at FreeBSD.org
Fri Apr 3 13:26:48 UTC 2020


Author: markj
Date: Fri Apr  3 13:26:38 2020
New Revision: 359593
URL: https://svnweb.freebsd.org/changeset/base/359593

Log:
  MFC r359171:
  Simplify uipc_detach() slightly.

Modified:
  stable/12/sys/kern/uipc_usrreq.c
Directory Properties:
  stable/12/   (props changed)

Modified: stable/12/sys/kern/uipc_usrreq.c
==============================================================================
--- stable/12/sys/kern/uipc_usrreq.c	Fri Apr  3 13:25:53 2020	(r359592)
+++ stable/12/sys/kern/uipc_usrreq.c	Fri Apr  3 13:26:38 2020	(r359593)
@@ -763,7 +763,6 @@ uipc_detach(struct socket *so)
 {
 	struct unpcb *unp, *unp2;
 	struct mtx *vplock;
-	struct sockaddr_un *saved_unp_addr;
 	struct vnode *vp;
 	int freeunp, local_unp_rights;
 
@@ -787,8 +786,7 @@ uipc_detach(struct socket *so)
 		mtx_lock(vplock);
 	}
 	UNP_PCB_LOCK(unp);
-	if (unp->unp_vnode != vp &&
-		unp->unp_vnode != NULL) {
+	if (unp->unp_vnode != vp && unp->unp_vnode != NULL) {
 		if (vplock)
 			mtx_unlock(vplock);
 		UNP_PCB_UNLOCK(unp);
@@ -801,21 +799,20 @@ uipc_detach(struct socket *so)
 	if (__predict_false(unp == unp->unp_conn)) {
 		unp_disconnect(unp, unp);
 		unp2 = NULL;
-		goto connect_self;
+	} else {
+		if ((unp2 = unp->unp_conn) != NULL) {
+			unp_pcb_owned_lock2(unp, unp2, freeunp);
+			if (freeunp)
+				unp2 = NULL;
+		}
+		unp_pcb_hold(unp);
+		if (unp2 != NULL) {
+			unp_pcb_hold(unp2);
+			unp_disconnect(unp, unp2);
+			if (unp_pcb_rele(unp2) == 0)
+				UNP_PCB_UNLOCK(unp2);
+		}
 	}
-	if ((unp2 = unp->unp_conn) != NULL) {
-		unp_pcb_owned_lock2(unp, unp2, freeunp);
-		if (freeunp)
-			unp2 = NULL;
-	}
-	unp_pcb_hold(unp);
-	if (unp2 != NULL) {
-		unp_pcb_hold(unp2);
-		unp_disconnect(unp, unp2);
-		if (unp_pcb_rele(unp2) == 0)
-			UNP_PCB_UNLOCK(unp2);
-	}
- connect_self:
 	UNP_PCB_UNLOCK(unp);
 	UNP_REF_LIST_LOCK();
 	while (!LIST_EMPTY(&unp->unp_refs)) {
@@ -836,13 +833,10 @@ uipc_detach(struct socket *so)
 	MPASS(freeunp == 0);
 	local_unp_rights = unp_rights;
 	unp->unp_socket->so_pcb = NULL;
-	saved_unp_addr = unp->unp_addr;
-	unp->unp_addr = NULL;
 	unp->unp_socket = NULL;
-	freeunp = unp_pcb_rele(unp);
-	if (saved_unp_addr != NULL)
-		free(saved_unp_addr, M_SONAME);
-	if (!freeunp)
+	free(unp->unp_addr, M_SONAME);
+	unp->unp_addr = NULL;
+	if (!unp_pcb_rele(unp))
 		UNP_PCB_UNLOCK(unp);
 	if (vp) {
 		mtx_unlock(vplock);


More information about the svn-src-all mailing list