changeset 234:b44b1bff9406 onnv_20

6292940 sosctp_assoc() should return the reason of error
author kcpoon
date Mon, 25 Jul 2005 22:36:49 -0700
parents c7d5dd0e7d50
children e87a1ba1f4a2
files usr/src/uts/common/fs/sockfs/socksctp.c usr/src/uts/common/fs/sockfs/socksctp.h usr/src/uts/common/fs/sockfs/socksctpsubr.c usr/src/uts/common/fs/sockfs/socksctpvnops.c
diffstat 4 files changed, 24 insertions(+), 27 deletions(-) [+]
line wrap: on
line diff
--- a/usr/src/uts/common/fs/sockfs/socksctp.c	Mon Jul 25 20:55:31 2005 -0700
+++ b/usr/src/uts/common/fs/sockfs/socksctp.c	Mon Jul 25 22:36:49 2005 -0700
@@ -1389,9 +1389,7 @@
 		}
 		so_unlock_single(so, SOLOCKED);
 	} else {
-		ssa = sosctp_assoc(ss, aid);
-		if (ssa == NULL) {
-			error = EINVAL;
+		if ((error = sosctp_assoc(ss, aid, &ssa)) != 0) {
 			eprintsoline(so, error);
 			goto done;
 		}
@@ -1909,9 +1907,7 @@
 		 * Otherwise set the default setting of a socket.
 		 */
 		if (id != 0) {
-			ssa = sosctp_assoc(ss, id);
-			if (ssa == NULL) {
-				error = EINVAL;
+			if ((error = sosctp_assoc(ss, id, &ssa)) != 0) {
 				eprintsoline(so, error);
 				goto done;
 			}
@@ -1943,8 +1939,8 @@
 		    optlen);
 		mutex_enter(&so->so_lock);
 		for (aid = 1; aid < ss->ss_maxassoc; aid++) {
-			ssa = sosctp_assoc(ss, aid);
-			if (ssa == NULL) {
+			if ((error = sosctp_assoc(ss, aid, &ssa)) != 0) {
+				error = 0;
 				continue;
 			}
 			mutex_exit(&so->so_lock);
--- a/usr/src/uts/common/fs/sockfs/socksctp.h	Mon Jul 25 20:55:31 2005 -0700
+++ b/usr/src/uts/common/fs/sockfs/socksctp.h	Mon Jul 25 22:36:49 2005 -0700
@@ -113,8 +113,8 @@
     int type);
 extern void sosctp_pack_cmsg(const uchar_t *, struct nmsghdr *, int);
 
-extern struct sctp_soassoc *sosctp_assoc(struct sctp_sonode *ss,
-    sctp_assoc_t id);
+extern int sosctp_assoc(struct sctp_sonode *ss, sctp_assoc_t id,
+    struct sctp_soassoc **ssa);
 extern struct sctp_soassoc *sosctp_assoc_create(struct sctp_sonode *ss,
     int kmflags);
 extern void sosctp_assoc_free(struct sctp_sonode *ss, struct sctp_soassoc *ssa);
@@ -146,7 +146,7 @@
 
 #define	SSA_REFHOLD(ssa)					\
 {								\
-	ASSERT(MUTEX_HELD(&ssa->ssa_sonode->ss_so.so_lock));	\
+	ASSERT(MUTEX_HELD(&(ssa)->ssa_sonode->ss_so.so_lock));	\
 	ASSERT((ssa)->ssa_refcnt > 0);				\
 	++(ssa)->ssa_refcnt;					\
 	dprint(3, ("ssa_refhold on %p %d (%s,%d)\n", (ssa),	\
--- a/usr/src/uts/common/fs/sockfs/socksctpsubr.c	Mon Jul 25 20:55:31 2005 -0700
+++ b/usr/src/uts/common/fs/sockfs/socksctpsubr.c	Mon Jul 25 22:36:49 2005 -0700
@@ -136,29 +136,30 @@
  * Convert a id into a pointer to sctp_sockassoc structure.
  * Increments refcnt.
  */
-struct sctp_soassoc *
-sosctp_assoc(struct sctp_sonode *ss, sctp_assoc_t id)
+int
+sosctp_assoc(struct sctp_sonode *ss, sctp_assoc_t id, struct sctp_soassoc **ssa)
 {
-	struct sctp_soassoc *ssa;
-
+	ASSERT(*ssa != NULL);
 	ASSERT(MUTEX_HELD(&ss->ss_so.so_lock));
 	if ((uint32_t)id >= ss->ss_maxassoc) {
-		return (NULL);
+		*ssa = NULL;
+		return (EINVAL);
 	}
 
-	if ((ssa = ss->ss_assocs[id].ssi_assoc) == NULL) {
-		return (NULL);
+	if ((*ssa = ss->ss_assocs[id].ssi_assoc) == NULL) {
+		return (EINVAL);
 	}
-	if ((ssa->ssa_state & (SS_CANTSENDMORE|SS_CANTRCVMORE)) ==
+	if (((*ssa)->ssa_state & (SS_CANTSENDMORE|SS_CANTRCVMORE)) ==
 	    (SS_CANTSENDMORE|SS_CANTRCVMORE)) {
 		/*
 		 * Disconnected connection, shouldn't be found anymore
 		 */
-		return (NULL);
+		*ssa = NULL;
+		return (ESHUTDOWN);
 	}
-	SSA_REFHOLD(ssa)
+	SSA_REFHOLD(*ssa)
 
-	return (ssa);
+	return (0);
 }
 
 /*
--- a/usr/src/uts/common/fs/sockfs/socksctpvnops.c	Mon Jul 25 20:55:31 2005 -0700
+++ b/usr/src/uts/common/fs/sockfs/socksctpvnops.c	Mon Jul 25 22:36:49 2005 -0700
@@ -20,7 +20,7 @@
  * CDDL HEADER END
  */
 /*
- * Copyright 2004 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
@@ -468,9 +468,9 @@
 		intval = STRUCT_FGET(opt, sopt_aid);
 		mutex_enter(&so->so_lock);
 		if ((so->so_type == SOCK_SEQPACKET) && intval) {
-			if ((ssa = sosctp_assoc(ss, intval)) == NULL) {
+			if ((error = sosctp_assoc(ss, intval, &ssa)) != 0) {
 				mutex_exit(&so->so_lock);
-				return (EINVAL);
+				return (error);
 			}
 			conn = ssa->ssa_conn;
 			ASSERT(conn != NULL);
@@ -533,9 +533,9 @@
 		intval = STRUCT_FGET(opt, sopt_aid);
 		mutex_enter(&so->so_lock);
 		if (intval != 0) {
-			if ((ssa = sosctp_assoc(ss, intval)) == NULL) {
+			if ((error = sosctp_assoc(ss, intval, &ssa)) != 0) {
 				mutex_exit(&so->so_lock);
-				return (EINVAL);
+				return (error);
 			}
 			conn = ssa->ssa_conn;
 			ASSERT(conn != NULL);