[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