Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

tipc: Don't use iocb argument in socket layer

Currently the iocb argument is used to idenfiy whether or not socket
lock is hold before tipc_sendmsg()/tipc_send_stream() is called. But
this usage prevents iocb argument from being dropped through sendmsg()
at socket common layer. Therefore, in the commit we introduce two new
functions called __tipc_sendmsg() and __tipc_send_stream(). When they
are invoked, it assumes that their callers have taken socket lock,
thereby avoiding the weird usage of iocb argument.

Cc: Al Viro <viro@ZenIV.linux.org.uk>
Cc: Christoph Hellwig <hch@lst.de>
Reviewed-by: Erik Hugne <erik.hugne@ericsson.com>
Reviewed-by: Jon Maloy <jon.maloy@ericsson.com>
Signed-off-by: Ying Xue <ying.xue@windriver.com>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Ying Xue and committed by
David S. Miller
39a0295f 6556c385

+44 -38
+44 -38
net/tipc/socket.c
··· 114 114 static struct tipc_sock *tipc_sk_lookup(struct net *net, u32 portid); 115 115 static int tipc_sk_insert(struct tipc_sock *tsk); 116 116 static void tipc_sk_remove(struct tipc_sock *tsk); 117 + static int __tipc_send_stream(struct socket *sock, struct msghdr *m, 118 + size_t dsz); 119 + static int __tipc_sendmsg(struct socket *sock, struct msghdr *m, size_t dsz); 117 120 118 121 static const struct proto_ops packet_ops; 119 122 static const struct proto_ops stream_ops; ··· 910 907 static int tipc_sendmsg(struct kiocb *iocb, struct socket *sock, 911 908 struct msghdr *m, size_t dsz) 912 909 { 910 + struct sock *sk = sock->sk; 911 + int ret; 912 + 913 + lock_sock(sk); 914 + ret = __tipc_sendmsg(sock, m, dsz); 915 + release_sock(sk); 916 + 917 + return ret; 918 + } 919 + 920 + static int __tipc_sendmsg(struct socket *sock, struct msghdr *m, size_t dsz) 921 + { 913 922 DECLARE_SOCKADDR(struct sockaddr_tipc *, dest, m->msg_name); 914 923 struct sock *sk = sock->sk; 915 924 struct tipc_sock *tsk = tipc_sk(sk); ··· 946 931 if (dsz > TIPC_MAX_USER_MSG_SIZE) 947 932 return -EMSGSIZE; 948 933 949 - if (iocb) 950 - lock_sock(sk); 951 - 952 934 if (unlikely(sock->state != SS_READY)) { 953 - if (sock->state == SS_LISTENING) { 954 - rc = -EPIPE; 955 - goto exit; 956 - } 957 - if (sock->state != SS_UNCONNECTED) { 958 - rc = -EISCONN; 959 - goto exit; 960 - } 961 - if (tsk->published) { 962 - rc = -EOPNOTSUPP; 963 - goto exit; 964 - } 935 + if (sock->state == SS_LISTENING) 936 + return -EPIPE; 937 + if (sock->state != SS_UNCONNECTED) 938 + return -EISCONN; 939 + if (tsk->published) 940 + return -EOPNOTSUPP; 965 941 if (dest->addrtype == TIPC_ADDR_NAME) { 966 942 tsk->conn_type = dest->addr.name.name.type; 967 943 tsk->conn_instance = dest->addr.name.name.instance; ··· 962 956 timeo = sock_sndtimeo(sk, m->msg_flags & MSG_DONTWAIT); 963 957 964 958 if (dest->addrtype == TIPC_ADDR_MCAST) { 965 - rc = tipc_sendmcast(sock, seq, m, dsz, timeo); 966 - goto exit; 959 + return tipc_sendmcast(sock, seq, m, dsz, timeo); 967 960 } else if (dest->addrtype == TIPC_ADDR_NAME) { 968 961 u32 type = dest->addr.name.name.type; 969 962 u32 inst = dest->addr.name.name.instance; ··· 977 972 dport = tipc_nametbl_translate(net, type, inst, &dnode); 978 973 msg_set_destnode(mhdr, dnode); 979 974 msg_set_destport(mhdr, dport); 980 - if (unlikely(!dport && !dnode)) { 981 - rc = -EHOSTUNREACH; 982 - goto exit; 983 - } 975 + if (unlikely(!dport && !dnode)) 976 + return -EHOSTUNREACH; 984 977 } else if (dest->addrtype == TIPC_ADDR_ID) { 985 978 dnode = dest->addr.id.node; 986 979 msg_set_type(mhdr, TIPC_DIRECT_MSG); ··· 993 990 mtu = tipc_node_get_mtu(net, dnode, tsk->portid); 994 991 rc = tipc_msg_build(mhdr, m, 0, dsz, mtu, pktchain); 995 992 if (rc < 0) 996 - goto exit; 993 + return rc; 997 994 998 995 do { 999 996 skb = skb_peek(pktchain); ··· 1016 1013 if (rc) 1017 1014 __skb_queue_purge(pktchain); 1018 1015 } while (!rc); 1019 - exit: 1020 - if (iocb) 1021 - release_sock(sk); 1022 1016 1023 1017 return rc; 1024 1018 } ··· 1066 1066 struct msghdr *m, size_t dsz) 1067 1067 { 1068 1068 struct sock *sk = sock->sk; 1069 + int ret; 1070 + 1071 + lock_sock(sk); 1072 + ret = __tipc_send_stream(sock, m, dsz); 1073 + release_sock(sk); 1074 + 1075 + return ret; 1076 + } 1077 + 1078 + static int __tipc_send_stream(struct socket *sock, struct msghdr *m, size_t dsz) 1079 + { 1080 + struct sock *sk = sock->sk; 1069 1081 struct net *net = sock_net(sk); 1070 1082 struct tipc_sock *tsk = tipc_sk(sk); 1071 1083 struct tipc_msg *mhdr = &tsk->phdr; ··· 1092 1080 1093 1081 /* Handle implied connection establishment */ 1094 1082 if (unlikely(dest)) { 1095 - rc = tipc_sendmsg(iocb, sock, m, dsz); 1083 + rc = __tipc_sendmsg(sock, m, dsz); 1096 1084 if (dsz && (dsz == rc)) 1097 1085 tsk->sent_unacked = 1; 1098 1086 return rc; ··· 1100 1088 if (dsz > (uint)INT_MAX) 1101 1089 return -EMSGSIZE; 1102 1090 1103 - if (iocb) 1104 - lock_sock(sk); 1105 - 1106 1091 if (unlikely(sock->state != SS_CONNECTED)) { 1107 1092 if (sock->state == SS_DISCONNECTING) 1108 - rc = -EPIPE; 1093 + return -EPIPE; 1109 1094 else 1110 - rc = -ENOTCONN; 1111 - goto exit; 1095 + return -ENOTCONN; 1112 1096 } 1113 1097 1114 1098 timeo = sock_sndtimeo(sk, m->msg_flags & MSG_DONTWAIT); ··· 1116 1108 send = min_t(uint, dsz - sent, TIPC_MAX_USER_MSG_SIZE); 1117 1109 rc = tipc_msg_build(mhdr, m, sent, send, mtu, pktchain); 1118 1110 if (unlikely(rc < 0)) 1119 - goto exit; 1111 + return rc; 1120 1112 do { 1121 1113 if (likely(!tsk_conn_cong(tsk))) { 1122 1114 rc = tipc_link_xmit(net, pktchain, dnode, portid); ··· 1141 1133 if (rc) 1142 1134 __skb_queue_purge(pktchain); 1143 1135 } while (!rc); 1144 - exit: 1145 - if (iocb) 1146 - release_sock(sk); 1136 + 1147 1137 return sent ? sent : rc; 1148 1138 } 1149 1139 ··· 1953 1947 if (!timeout) 1954 1948 m.msg_flags = MSG_DONTWAIT; 1955 1949 1956 - res = tipc_sendmsg(NULL, sock, &m, 0); 1950 + res = __tipc_sendmsg(sock, &m, 0); 1957 1951 if ((res < 0) && (res != -EWOULDBLOCK)) 1958 1952 goto exit; 1959 1953 ··· 2109 2103 struct msghdr m = {NULL,}; 2110 2104 2111 2105 tsk_advance_rx_queue(sk); 2112 - tipc_send_packet(NULL, new_sock, &m, 0); 2106 + __tipc_send_stream(new_sock, &m, 0); 2113 2107 } else { 2114 2108 __skb_dequeue(&sk->sk_receive_queue); 2115 2109 __skb_queue_head(&new_sk->sk_receive_queue, buf);