[Ocfs2-commits] zab commits r1779 - trunk/cluster

svn-commits at oss.oracle.com svn-commits at oss.oracle.com
Mon Jan 17 15:27:01 CST 2005


Author: zab
Date: 2005-01-17 15:26:59 -0600 (Mon, 17 Jan 2005)
New Revision: 1779

Modified:
   trunk/cluster/tcp.c
   trunk/cluster/tcp.h
Log:
- msg_name{,len} isn't defined for connected sockets
- don't BUG on bad sendmsg, just bubble up an (inappropriate) error
- net_send_error calles net_send_tcp_msg instead of sock_sendmsg itself


Modified: trunk/cluster/tcp.c
===================================================================
--- trunk/cluster/tcp.c	2005-01-17 19:31:05 UTC (rev 1778)
+++ trunk/cluster/tcp.c	2005-01-17 21:26:59 UTC (rev 1779)
@@ -706,18 +706,13 @@
 	nm_node_info *node;
 	int ret;
 	mm_segment_t oldfs;
-	struct sockaddr_in sin;
 	struct iovec iov = { 
 		.iov_len = len,
 		.iov_base = data 
 	};
 	struct msghdr msg = { 
-		.msg_control = NULL, 
-		.msg_controllen = 0, 
 		.msg_iovlen = 1, 
 		.msg_iov = &iov, 
-		.msg_name = (struct sockaddr *) &sin, 
-		.msg_namelen = sizeof (sin),
        		.msg_flags = MSG_DONTWAIT,
 	};
 
@@ -734,38 +729,26 @@
 		}
 	}
 	
-	memset(&sin, 0, sizeof (sin));
 	oldfs = get_fs();
 	set_fs(get_ds());
 	ret = sock_recvmsg(sock, &msg, len, msg.msg_flags);
 	set_fs(oldfs);
 
-	//netprintk ("Received packet from: %d.%d.%d.%d\n",
-	//		NIPQUAD (sin.sin_addr.s_addr));
-
 out:
 	return ret;
 }
 
-static int net_sock_sendmsg(struct socket *sock, struct msghdr *msg,
-			    size_t size)
-{
-	int ret = sock_sendmsg(sock, msg, size);
-
-	/* XXX just so that we know things aren't going horribly wrong
-	 * until we get a better transport core in place */
-	BUG_ON(ret >= 0 && ret != size);
-	return ret;
-}
-
 static int net_send_tcp_msg(struct inode *inode, struct socket *sock, 
 			    struct iovec *iov, size_t iovlen, size_t total)
 {
-	int status = 0, error;
-	struct sockaddr_in sin;
-	mm_segment_t oldfs;
+	int ret;
 	nm_node_inode_private *priv;
 	nm_node_info *node;
+	mm_segment_t oldfs;
+	struct msghdr msg = {
+		.msg_iov = iov,
+		.msg_iovlen = iovlen,
+	};
 
 	priv = (nm_node_inode_private *)inode->u.generic_ip;
 	node = &priv->node;
@@ -776,42 +759,30 @@
 		spin_unlock(&priv->net.sock_lock);
 	}
 
-	oldfs = get_fs ();
-	netprintk("Sending msg to node=%u, name=%s\n", node->node_num, node->node_name);
-	memset (&sin, 0, sizeof (sin));
-	sin.sin_family = net_ip_version_to_family(node->ifaces[0].ip_version);
-	sin.sin_addr.s_addr = node->ifaces[0].addr_u.ip_addr4;
-	sin.sin_port = node->ifaces[0].ip_port;
-	
+	netprintk("Sending msg to node=%u, name=%s\n",
+		  node->node_num, node->node_name);
 
-	status = -EINVAL;
-	if (sock) {
+	if (sock == NULL) {
+		ret = -EINVAL;
+		goto out;
+	}
 
-		struct msghdr msg = {
-			.msg_iov = iov,
-			.msg_iovlen = iovlen,
-			.msg_control = NULL,
-			.msg_controllen = 0,
-			.msg_name = (struct sockaddr *) &sin,
-			.msg_namelen = sizeof (sin),
-			.msg_flags = 0
-		};
-		
-		status = 0;	
-		set_fs (get_ds ());
-		error = net_sock_sendmsg (sock, &msg, total);
-		set_fs (oldfs);
-	
-		if (error < 0) {
-			netprintk ("unable to sendmsg, error=%d\n", error);
-			status = -EINVAL;
-		} 
+	oldfs = get_fs();
+	set_fs(get_ds());
+	ret = sock_sendmsg(sock, &msg, total);
+	set_fs(oldfs);
+	if (ret != total) {
+		netprintk("sendmsg returned %d instead of %zu\n", ret, total);
+		if (ret >= 0)
+			ret = -EINTR; /* should be smarter, I bet */
+		goto out;
 	}
-	if (status < 0)
-		netprintk ("bad status: %d\n", status);
 
-	status = 0;
-	return status;
+	ret = 0;
+out:
+	if (ret < 0)
+		netprintk("returning error: %d\n", ret);
+	return ret;
 }
 
 static u64 net_next_msg_num(void)
@@ -992,7 +963,6 @@
 }
 EXPORT_SYMBOL(net_send_message);
 
-
 static int net_send_status_magic(struct inode *inode, struct socket *sock,
 			         net_msg *hdr, int err)
 {
@@ -1001,6 +971,8 @@
 		.iov_len = sizeof(net_msg),
 	};
 	       
+	/* leave other fields intact from the incoming message, msg_num
+	 * in particular */
 	hdr->status = err;
 	hdr->magic = NET_MSG_STATUS_MAGIC;  // twiddle the magic
 	hdr->data_len = 0;
@@ -1011,6 +983,39 @@
 	return net_send_tcp_msg(inode, sock, &iov, 1, sizeof(net_msg));
 }
 
+static inline int net_is_valid_error_type(u32 err_type)
+{
+	if (err_type == NET_ALREADY_CONNECTED ||
+	    err_type == NET_UNKNOWN_HOST)
+		return 1;
+	return 0;
+}
+
+static void net_send_error(struct inode *inode, struct socket *sock,
+			   u16 err_type)
+{
+	net_msg hdr = {
+		.magic        = NET_MSG_MAGIC,
+		.msg_type     = err_type,
+		.data_len     = 0,
+	};
+	struct iovec iov = {
+		.iov_base = &hdr,
+		.iov_len = sizeof(hdr),
+	};
+
+	if (!net_is_valid_error_type(err_type)) {
+		netprintk("bug! bad error type! %u\n", err_type);
+		goto out;
+	}
+
+	msgprintk(&hdr, "about to send error %u\n", err_type);
+	net_msg_to_net(&hdr);
+	net_send_tcp_msg(inode, sock, &iov, 1, sizeof(net_msg));
+out:
+        return;
+}
+
 static void net_got_sock_callback(net_inode_private *net, struct sock *sk)
 {
 	BUG_ON(net == NULL);
@@ -1370,7 +1375,7 @@
 
 				if (exists) {
 					netprintk0("already a socket for this connection!\n");
-					net_send_error(sock, NET_ALREADY_CONNECTED);
+					net_send_error(inode, sock, NET_ALREADY_CONNECTED);
 					net_dump_and_close_sock(sock, inode);
 				} else {
 					net_record_new_sock(net);
@@ -1380,49 +1385,13 @@
 			iput(inode);
 		} else {
 			netprintk0("connect from unknown host...\n");
-			net_send_error(sock, NET_UNKNOWN_HOST);
+			net_send_error(inode, sock, NET_UNKNOWN_HOST);
 			net_dump_and_close_sock(sock, inode);
 		}
 	}
 	return error;
 }
 
-
-int net_send_error(struct socket *sock, u32 err_type)
-{
-        struct msghdr   msg;
-        mm_segment_t    oldfs;
-        struct iovec    iov;
-        int             len;
-	static net_msg err;
-
-	if (!net_is_valid_error_type(err_type)) {
-		netprintk("bug! bad error type! %u\n", err_type);
-		return -EINVAL;
-	}
-	memset(&err, 0, sizeof(net_msg));	
-	err.magic        = NET_MSG_MAGIC;
-	err.msg_type     = err_type;
-	err.data_len     = 0;
-	net_msg_to_net(&err);
-
-        msg.msg_name     = 0;
-        msg.msg_namelen  = 0;
-        msg.msg_iov      = &iov;
-        msg.msg_iovlen   = 1;
-        msg.msg_control  = NULL;
-        msg.msg_controllen = 0;
-        msg.msg_flags    = MSG_NOSIGNAL;
-        msg.msg_iov->iov_len = (__kernel_size_t)sizeof(net_msg);
-        msg.msg_iov->iov_base = (char*) &err;
-
-        oldfs = get_fs(); set_fs(KERNEL_DS);
-        len = net_sock_sendmsg(sock, &msg, (size_t)(sizeof(net_msg)));
-        set_fs(oldfs);
-
-        return len;
-}
-
 static void net_dump_and_close_sock(struct socket *sock, struct inode *inode)
 {
 	nm_node_inode_private *priv = NULL;

Modified: trunk/cluster/tcp.h
===================================================================
--- trunk/cluster/tcp.h	2005-01-17 19:31:05 UTC (rev 1778)
+++ trunk/cluster/tcp.h	2005-01-17 21:26:59 UTC (rev 1779)
@@ -107,15 +107,6 @@
 #define NET_ALREADY_CONNECTED   (0xfff0)
 #define NET_UNKNOWN_HOST        (0xfff1)
 
-static inline int net_is_valid_error_type(u32 err_type)
-{
-	if (err_type == NET_ALREADY_CONNECTED ||
-	    err_type == NET_UNKNOWN_HOST)
-		return 1;
-	return 0;
-}
-		       
-
 #define NET_HND_VAR_LEN   0x00000001
 
 static inline int net_handler_msg_len_ok(net_msg_handler *handler, u32 len)
@@ -183,7 +174,6 @@
 
 int net_register_handler(u32 msg_type, u32 key, int flags, 
 			 u32 max_len, net_msg_handler_func *func, void *data);
-int net_send_error(struct socket *sock, u32 err_type);
 int net_init_tcp_sock(struct inode *inode);
 int net_send_message(u32 msg_type, u32 key, void *data, u32 len, struct inode *inode, int *status);
 int net_send_message_iov(u32 msg_type, u32 key, struct iovec *iov,



More information about the Ocfs2-commits mailing list