diff options
author | David S. Miller <davem@davemloft.net> | 2016-03-08 12:34:12 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2016-03-08 12:34:12 -0500 |
commit | 810813c47a564416f6306ae214e2661366c987a7 (patch) | |
tree | f0d1f856d4b0024324f642fe519963248828b83f /net/tipc/socket.c | |
parent | d66ab51442211158b677c2f12310c314d9587f74 (diff) | |
parent | e2857b8f11a289ed2b61d18d0665e05c1053c446 (diff) |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
Several cases of overlapping changes, as well as one instance
(vxlan) of a bug fix in 'net' overlapping with code movement
in 'net-next'.
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/tipc/socket.c')
-rw-r--r-- | net/tipc/socket.c | 33 |
1 files changed, 19 insertions, 14 deletions
diff --git a/net/tipc/socket.c b/net/tipc/socket.c index 56b8a96c2257..3eeb50a27b89 100644 --- a/net/tipc/socket.c +++ b/net/tipc/socket.c | |||
@@ -666,7 +666,7 @@ static int tipc_sendmcast(struct socket *sock, struct tipc_name_seq *seq, | |||
666 | struct tipc_sock *tsk = tipc_sk(sk); | 666 | struct tipc_sock *tsk = tipc_sk(sk); |
667 | struct net *net = sock_net(sk); | 667 | struct net *net = sock_net(sk); |
668 | struct tipc_msg *mhdr = &tsk->phdr; | 668 | struct tipc_msg *mhdr = &tsk->phdr; |
669 | struct sk_buff_head *pktchain = &sk->sk_write_queue; | 669 | struct sk_buff_head pktchain; |
670 | struct iov_iter save = msg->msg_iter; | 670 | struct iov_iter save = msg->msg_iter; |
671 | uint mtu; | 671 | uint mtu; |
672 | int rc; | 672 | int rc; |
@@ -680,14 +680,16 @@ static int tipc_sendmcast(struct socket *sock, struct tipc_name_seq *seq, | |||
680 | msg_set_nameupper(mhdr, seq->upper); | 680 | msg_set_nameupper(mhdr, seq->upper); |
681 | msg_set_hdr_sz(mhdr, MCAST_H_SIZE); | 681 | msg_set_hdr_sz(mhdr, MCAST_H_SIZE); |
682 | 682 | ||
683 | skb_queue_head_init(&pktchain); | ||
684 | |||
683 | new_mtu: | 685 | new_mtu: |
684 | mtu = tipc_bcast_get_mtu(net); | 686 | mtu = tipc_bcast_get_mtu(net); |
685 | rc = tipc_msg_build(mhdr, msg, 0, dsz, mtu, pktchain); | 687 | rc = tipc_msg_build(mhdr, msg, 0, dsz, mtu, &pktchain); |
686 | if (unlikely(rc < 0)) | 688 | if (unlikely(rc < 0)) |
687 | return rc; | 689 | return rc; |
688 | 690 | ||
689 | do { | 691 | do { |
690 | rc = tipc_bcast_xmit(net, pktchain); | 692 | rc = tipc_bcast_xmit(net, &pktchain); |
691 | if (likely(!rc)) | 693 | if (likely(!rc)) |
692 | return dsz; | 694 | return dsz; |
693 | 695 | ||
@@ -697,7 +699,7 @@ new_mtu: | |||
697 | if (!rc) | 699 | if (!rc) |
698 | continue; | 700 | continue; |
699 | } | 701 | } |
700 | __skb_queue_purge(pktchain); | 702 | __skb_queue_purge(&pktchain); |
701 | if (rc == -EMSGSIZE) { | 703 | if (rc == -EMSGSIZE) { |
702 | msg->msg_iter = save; | 704 | msg->msg_iter = save; |
703 | goto new_mtu; | 705 | goto new_mtu; |
@@ -856,7 +858,7 @@ static int __tipc_sendmsg(struct socket *sock, struct msghdr *m, size_t dsz) | |||
856 | struct net *net = sock_net(sk); | 858 | struct net *net = sock_net(sk); |
857 | struct tipc_msg *mhdr = &tsk->phdr; | 859 | struct tipc_msg *mhdr = &tsk->phdr; |
858 | u32 dnode, dport; | 860 | u32 dnode, dport; |
859 | struct sk_buff_head *pktchain = &sk->sk_write_queue; | 861 | struct sk_buff_head pktchain; |
860 | struct sk_buff *skb; | 862 | struct sk_buff *skb; |
861 | struct tipc_name_seq *seq; | 863 | struct tipc_name_seq *seq; |
862 | struct iov_iter save; | 864 | struct iov_iter save; |
@@ -917,17 +919,18 @@ static int __tipc_sendmsg(struct socket *sock, struct msghdr *m, size_t dsz) | |||
917 | msg_set_hdr_sz(mhdr, BASIC_H_SIZE); | 919 | msg_set_hdr_sz(mhdr, BASIC_H_SIZE); |
918 | } | 920 | } |
919 | 921 | ||
922 | skb_queue_head_init(&pktchain); | ||
920 | save = m->msg_iter; | 923 | save = m->msg_iter; |
921 | new_mtu: | 924 | new_mtu: |
922 | mtu = tipc_node_get_mtu(net, dnode, tsk->portid); | 925 | mtu = tipc_node_get_mtu(net, dnode, tsk->portid); |
923 | rc = tipc_msg_build(mhdr, m, 0, dsz, mtu, pktchain); | 926 | rc = tipc_msg_build(mhdr, m, 0, dsz, mtu, &pktchain); |
924 | if (rc < 0) | 927 | if (rc < 0) |
925 | return rc; | 928 | return rc; |
926 | 929 | ||
927 | do { | 930 | do { |
928 | skb = skb_peek(pktchain); | 931 | skb = skb_peek(&pktchain); |
929 | TIPC_SKB_CB(skb)->wakeup_pending = tsk->link_cong; | 932 | TIPC_SKB_CB(skb)->wakeup_pending = tsk->link_cong; |
930 | rc = tipc_node_xmit(net, pktchain, dnode, tsk->portid); | 933 | rc = tipc_node_xmit(net, &pktchain, dnode, tsk->portid); |
931 | if (likely(!rc)) { | 934 | if (likely(!rc)) { |
932 | if (sock->state != SS_READY) | 935 | if (sock->state != SS_READY) |
933 | sock->state = SS_CONNECTING; | 936 | sock->state = SS_CONNECTING; |
@@ -939,7 +942,7 @@ new_mtu: | |||
939 | if (!rc) | 942 | if (!rc) |
940 | continue; | 943 | continue; |
941 | } | 944 | } |
942 | __skb_queue_purge(pktchain); | 945 | __skb_queue_purge(&pktchain); |
943 | if (rc == -EMSGSIZE) { | 946 | if (rc == -EMSGSIZE) { |
944 | m->msg_iter = save; | 947 | m->msg_iter = save; |
945 | goto new_mtu; | 948 | goto new_mtu; |
@@ -1009,7 +1012,7 @@ static int __tipc_send_stream(struct socket *sock, struct msghdr *m, size_t dsz) | |||
1009 | struct net *net = sock_net(sk); | 1012 | struct net *net = sock_net(sk); |
1010 | struct tipc_sock *tsk = tipc_sk(sk); | 1013 | struct tipc_sock *tsk = tipc_sk(sk); |
1011 | struct tipc_msg *mhdr = &tsk->phdr; | 1014 | struct tipc_msg *mhdr = &tsk->phdr; |
1012 | struct sk_buff_head *pktchain = &sk->sk_write_queue; | 1015 | struct sk_buff_head pktchain; |
1013 | DECLARE_SOCKADDR(struct sockaddr_tipc *, dest, m->msg_name); | 1016 | DECLARE_SOCKADDR(struct sockaddr_tipc *, dest, m->msg_name); |
1014 | u32 portid = tsk->portid; | 1017 | u32 portid = tsk->portid; |
1015 | int rc = -EINVAL; | 1018 | int rc = -EINVAL; |
@@ -1037,17 +1040,19 @@ static int __tipc_send_stream(struct socket *sock, struct msghdr *m, size_t dsz) | |||
1037 | 1040 | ||
1038 | timeo = sock_sndtimeo(sk, m->msg_flags & MSG_DONTWAIT); | 1041 | timeo = sock_sndtimeo(sk, m->msg_flags & MSG_DONTWAIT); |
1039 | dnode = tsk_peer_node(tsk); | 1042 | dnode = tsk_peer_node(tsk); |
1043 | skb_queue_head_init(&pktchain); | ||
1040 | 1044 | ||
1041 | next: | 1045 | next: |
1042 | save = m->msg_iter; | 1046 | save = m->msg_iter; |
1043 | mtu = tsk->max_pkt; | 1047 | mtu = tsk->max_pkt; |
1044 | send = min_t(uint, dsz - sent, TIPC_MAX_USER_MSG_SIZE); | 1048 | send = min_t(uint, dsz - sent, TIPC_MAX_USER_MSG_SIZE); |
1045 | rc = tipc_msg_build(mhdr, m, sent, send, mtu, pktchain); | 1049 | rc = tipc_msg_build(mhdr, m, sent, send, mtu, &pktchain); |
1046 | if (unlikely(rc < 0)) | 1050 | if (unlikely(rc < 0)) |
1047 | return rc; | 1051 | return rc; |
1052 | |||
1048 | do { | 1053 | do { |
1049 | if (likely(!tsk_conn_cong(tsk))) { | 1054 | if (likely(!tsk_conn_cong(tsk))) { |
1050 | rc = tipc_node_xmit(net, pktchain, dnode, portid); | 1055 | rc = tipc_node_xmit(net, &pktchain, dnode, portid); |
1051 | if (likely(!rc)) { | 1056 | if (likely(!rc)) { |
1052 | tsk->sent_unacked++; | 1057 | tsk->sent_unacked++; |
1053 | sent += send; | 1058 | sent += send; |
@@ -1056,7 +1061,7 @@ next: | |||
1056 | goto next; | 1061 | goto next; |
1057 | } | 1062 | } |
1058 | if (rc == -EMSGSIZE) { | 1063 | if (rc == -EMSGSIZE) { |
1059 | __skb_queue_purge(pktchain); | 1064 | __skb_queue_purge(&pktchain); |
1060 | tsk->max_pkt = tipc_node_get_mtu(net, dnode, | 1065 | tsk->max_pkt = tipc_node_get_mtu(net, dnode, |
1061 | portid); | 1066 | portid); |
1062 | m->msg_iter = save; | 1067 | m->msg_iter = save; |
@@ -1070,7 +1075,7 @@ next: | |||
1070 | rc = tipc_wait_for_sndpkt(sock, &timeo); | 1075 | rc = tipc_wait_for_sndpkt(sock, &timeo); |
1071 | } while (!rc); | 1076 | } while (!rc); |
1072 | 1077 | ||
1073 | __skb_queue_purge(pktchain); | 1078 | __skb_queue_purge(&pktchain); |
1074 | return sent ? sent : rc; | 1079 | return sent ? sent : rc; |
1075 | } | 1080 | } |
1076 | 1081 | ||