aboutsummaryrefslogtreecommitdiffstats
path: root/net/tipc
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2017-05-02 19:40:27 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2017-05-02 19:40:27 -0400
commit8d65b08debc7e62b2c6032d7fe7389d895b92cbc (patch)
tree0c3141b60c3a03cc32742b5750c5e763b9dae489 /net/tipc
parent5a0387a8a8efb90ae7fea1e2e5c62de3efa74691 (diff)
parent5d15af6778b8e4ed1fd41b040283af278e7a9a72 (diff)
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next
Pull networking updates from David Millar: "Here are some highlights from the 2065 networking commits that happened this development cycle: 1) XDP support for IXGBE (John Fastabend) and thunderx (Sunil Kowuri) 2) Add a generic XDP driver, so that anyone can test XDP even if they lack a networking device whose driver has explicit XDP support (me). 3) Sparc64 now has an eBPF JIT too (me) 4) Add a BPF program testing framework via BPF_PROG_TEST_RUN (Alexei Starovoitov) 5) Make netfitler network namespace teardown less expensive (Florian Westphal) 6) Add symmetric hashing support to nft_hash (Laura Garcia Liebana) 7) Implement NAPI and GRO in netvsc driver (Stephen Hemminger) 8) Support TC flower offload statistics in mlxsw (Arkadi Sharshevsky) 9) Multiqueue support in stmmac driver (Joao Pinto) 10) Remove TCP timewait recycling, it never really could possibly work well in the real world and timestamp randomization really zaps any hint of usability this feature had (Soheil Hassas Yeganeh) 11) Support level3 vs level4 ECMP route hashing in ipv4 (Nikolay Aleksandrov) 12) Add socket busy poll support to epoll (Sridhar Samudrala) 13) Netlink extended ACK support (Johannes Berg, Pablo Neira Ayuso, and several others) 14) IPSEC hw offload infrastructure (Steffen Klassert)" * git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next: (2065 commits) tipc: refactor function tipc_sk_recv_stream() tipc: refactor function tipc_sk_recvmsg() net: thunderx: Optimize page recycling for XDP net: thunderx: Support for XDP header adjustment net: thunderx: Add support for XDP_TX net: thunderx: Add support for XDP_DROP net: thunderx: Add basic XDP support net: thunderx: Cleanup receive buffer allocation net: thunderx: Optimize CQE_TX handling net: thunderx: Optimize RBDR descriptor handling net: thunderx: Support for page recycling ipx: call ipxitf_put() in ioctl error path net: sched: add helpers to handle extended actions qed*: Fix issues in the ptp filter config implementation. qede: Fix concurrency issue in PTP Tx path processing. stmmac: Add support for SIMATIC IOT2000 platform net: hns: fix ethtool_get_strings overflow in hns driver tcp: fix wraparound issue in tcp_lp bpf, arm64: fix jit branch offset related to ldimm64 bpf, arm64: implement jiting of BPF_XADD ...
Diffstat (limited to 'net/tipc')
-rw-r--r--net/tipc/bearer.c14
-rw-r--r--net/tipc/link.c2
-rw-r--r--net/tipc/name_table.c2
-rw-r--r--net/tipc/net.c4
-rw-r--r--net/tipc/netlink.c3
-rw-r--r--net/tipc/netlink_compat.c32
-rw-r--r--net/tipc/node.c14
-rw-r--r--net/tipc/socket.c296
-rw-r--r--net/tipc/subscr.c17
-rw-r--r--net/tipc/subscr.h3
-rw-r--r--net/tipc/udp_media.c7
11 files changed, 197 insertions, 197 deletions
diff --git a/net/tipc/bearer.c b/net/tipc/bearer.c
index 33a5bdfbef76..d174ee3254ee 100644
--- a/net/tipc/bearer.c
+++ b/net/tipc/bearer.c
@@ -802,7 +802,7 @@ int tipc_nl_bearer_get(struct sk_buff *skb, struct genl_info *info)
802 802
803 err = nla_parse_nested(attrs, TIPC_NLA_BEARER_MAX, 803 err = nla_parse_nested(attrs, TIPC_NLA_BEARER_MAX,
804 info->attrs[TIPC_NLA_BEARER], 804 info->attrs[TIPC_NLA_BEARER],
805 tipc_nl_bearer_policy); 805 tipc_nl_bearer_policy, info->extack);
806 if (err) 806 if (err)
807 return err; 807 return err;
808 808
@@ -851,7 +851,7 @@ int tipc_nl_bearer_disable(struct sk_buff *skb, struct genl_info *info)
851 851
852 err = nla_parse_nested(attrs, TIPC_NLA_BEARER_MAX, 852 err = nla_parse_nested(attrs, TIPC_NLA_BEARER_MAX,
853 info->attrs[TIPC_NLA_BEARER], 853 info->attrs[TIPC_NLA_BEARER],
854 tipc_nl_bearer_policy); 854 tipc_nl_bearer_policy, info->extack);
855 if (err) 855 if (err)
856 return err; 856 return err;
857 857
@@ -891,7 +891,7 @@ int tipc_nl_bearer_enable(struct sk_buff *skb, struct genl_info *info)
891 891
892 err = nla_parse_nested(attrs, TIPC_NLA_BEARER_MAX, 892 err = nla_parse_nested(attrs, TIPC_NLA_BEARER_MAX,
893 info->attrs[TIPC_NLA_BEARER], 893 info->attrs[TIPC_NLA_BEARER],
894 tipc_nl_bearer_policy); 894 tipc_nl_bearer_policy, info->extack);
895 if (err) 895 if (err)
896 return err; 896 return err;
897 897
@@ -939,7 +939,7 @@ int tipc_nl_bearer_add(struct sk_buff *skb, struct genl_info *info)
939 939
940 err = nla_parse_nested(attrs, TIPC_NLA_BEARER_MAX, 940 err = nla_parse_nested(attrs, TIPC_NLA_BEARER_MAX,
941 info->attrs[TIPC_NLA_BEARER], 941 info->attrs[TIPC_NLA_BEARER],
942 tipc_nl_bearer_policy); 942 tipc_nl_bearer_policy, info->extack);
943 if (err) 943 if (err)
944 return err; 944 return err;
945 945
@@ -982,7 +982,7 @@ int tipc_nl_bearer_set(struct sk_buff *skb, struct genl_info *info)
982 982
983 err = nla_parse_nested(attrs, TIPC_NLA_BEARER_MAX, 983 err = nla_parse_nested(attrs, TIPC_NLA_BEARER_MAX,
984 info->attrs[TIPC_NLA_BEARER], 984 info->attrs[TIPC_NLA_BEARER],
985 tipc_nl_bearer_policy); 985 tipc_nl_bearer_policy, info->extack);
986 if (err) 986 if (err)
987 return err; 987 return err;
988 988
@@ -1104,7 +1104,7 @@ int tipc_nl_media_get(struct sk_buff *skb, struct genl_info *info)
1104 1104
1105 err = nla_parse_nested(attrs, TIPC_NLA_MEDIA_MAX, 1105 err = nla_parse_nested(attrs, TIPC_NLA_MEDIA_MAX,
1106 info->attrs[TIPC_NLA_MEDIA], 1106 info->attrs[TIPC_NLA_MEDIA],
1107 tipc_nl_media_policy); 1107 tipc_nl_media_policy, info->extack);
1108 if (err) 1108 if (err)
1109 return err; 1109 return err;
1110 1110
@@ -1152,7 +1152,7 @@ int tipc_nl_media_set(struct sk_buff *skb, struct genl_info *info)
1152 1152
1153 err = nla_parse_nested(attrs, TIPC_NLA_MEDIA_MAX, 1153 err = nla_parse_nested(attrs, TIPC_NLA_MEDIA_MAX,
1154 info->attrs[TIPC_NLA_MEDIA], 1154 info->attrs[TIPC_NLA_MEDIA],
1155 tipc_nl_media_policy); 1155 tipc_nl_media_policy, info->extack);
1156 1156
1157 if (!attrs[TIPC_NLA_MEDIA_NAME]) 1157 if (!attrs[TIPC_NLA_MEDIA_NAME])
1158 return -EINVAL; 1158 return -EINVAL;
diff --git a/net/tipc/link.c b/net/tipc/link.c
index ddd2dd6f77aa..60820dc35a08 100644
--- a/net/tipc/link.c
+++ b/net/tipc/link.c
@@ -1827,7 +1827,7 @@ int tipc_nl_parse_link_prop(struct nlattr *prop, struct nlattr *props[])
1827 int err; 1827 int err;
1828 1828
1829 err = nla_parse_nested(props, TIPC_NLA_PROP_MAX, prop, 1829 err = nla_parse_nested(props, TIPC_NLA_PROP_MAX, prop,
1830 tipc_nl_prop_policy); 1830 tipc_nl_prop_policy, NULL);
1831 if (err) 1831 if (err)
1832 return err; 1832 return err;
1833 1833
diff --git a/net/tipc/name_table.c b/net/tipc/name_table.c
index 9be6592e4a6f..bd0aac87b41a 100644
--- a/net/tipc/name_table.c
+++ b/net/tipc/name_table.c
@@ -416,6 +416,7 @@ static void tipc_nameseq_subscribe(struct name_seq *nseq,
416 416
417 tipc_subscrp_convert_seq(&s->evt.s.seq, s->swap, &ns); 417 tipc_subscrp_convert_seq(&s->evt.s.seq, s->swap, &ns);
418 418
419 tipc_subscrp_get(s);
419 list_add(&s->nameseq_list, &nseq->subscriptions); 420 list_add(&s->nameseq_list, &nseq->subscriptions);
420 421
421 if (!sseq) 422 if (!sseq)
@@ -787,6 +788,7 @@ void tipc_nametbl_unsubscribe(struct tipc_subscription *s)
787 if (seq != NULL) { 788 if (seq != NULL) {
788 spin_lock_bh(&seq->lock); 789 spin_lock_bh(&seq->lock);
789 list_del_init(&s->nameseq_list); 790 list_del_init(&s->nameseq_list);
791 tipc_subscrp_put(s);
790 if (!seq->first_free && list_empty(&seq->subscriptions)) { 792 if (!seq->first_free && list_empty(&seq->subscriptions)) {
791 hlist_del_init_rcu(&seq->ns_list); 793 hlist_del_init_rcu(&seq->ns_list);
792 kfree(seq->sseqs); 794 kfree(seq->sseqs);
diff --git a/net/tipc/net.c b/net/tipc/net.c
index ab8a2d5d1e32..719c5924b638 100644
--- a/net/tipc/net.c
+++ b/net/tipc/net.c
@@ -211,8 +211,8 @@ int tipc_nl_net_set(struct sk_buff *skb, struct genl_info *info)
211 return -EINVAL; 211 return -EINVAL;
212 212
213 err = nla_parse_nested(attrs, TIPC_NLA_NET_MAX, 213 err = nla_parse_nested(attrs, TIPC_NLA_NET_MAX,
214 info->attrs[TIPC_NLA_NET], 214 info->attrs[TIPC_NLA_NET], tipc_nl_net_policy,
215 tipc_nl_net_policy); 215 info->extack);
216 if (err) 216 if (err)
217 return err; 217 return err;
218 218
diff --git a/net/tipc/netlink.c b/net/tipc/netlink.c
index 26ca8dd64ded..b76f13f6fea1 100644
--- a/net/tipc/netlink.c
+++ b/net/tipc/netlink.c
@@ -268,7 +268,8 @@ int tipc_nlmsg_parse(const struct nlmsghdr *nlh, struct nlattr ***attr)
268 if (!*attr) 268 if (!*attr)
269 return -EOPNOTSUPP; 269 return -EOPNOTSUPP;
270 270
271 return nlmsg_parse(nlh, GENL_HDRLEN, *attr, maxattr, tipc_nl_policy); 271 return nlmsg_parse(nlh, GENL_HDRLEN, *attr, maxattr, tipc_nl_policy,
272 NULL);
272} 273}
273 274
274int __init tipc_netlink_start(void) 275int __init tipc_netlink_start(void)
diff --git a/net/tipc/netlink_compat.c b/net/tipc/netlink_compat.c
index e1ae8a8a2b8e..9bfe886ab330 100644
--- a/net/tipc/netlink_compat.c
+++ b/net/tipc/netlink_compat.c
@@ -296,7 +296,7 @@ static int __tipc_nl_compat_doit(struct tipc_nl_compat_cmd_doit *cmd,
296 296
297 err = nla_parse(attrbuf, tipc_genl_family.maxattr, 297 err = nla_parse(attrbuf, tipc_genl_family.maxattr,
298 (const struct nlattr *)trans_buf->data, 298 (const struct nlattr *)trans_buf->data,
299 trans_buf->len, NULL); 299 trans_buf->len, NULL, NULL);
300 if (err) 300 if (err)
301 goto parse_out; 301 goto parse_out;
302 302
@@ -352,7 +352,7 @@ static int tipc_nl_compat_bearer_dump(struct tipc_nl_compat_msg *msg,
352 return -EINVAL; 352 return -EINVAL;
353 353
354 err = nla_parse_nested(bearer, TIPC_NLA_BEARER_MAX, 354 err = nla_parse_nested(bearer, TIPC_NLA_BEARER_MAX,
355 attrs[TIPC_NLA_BEARER], NULL); 355 attrs[TIPC_NLA_BEARER], NULL, NULL);
356 if (err) 356 if (err)
357 return err; 357 return err;
358 358
@@ -472,7 +472,7 @@ static int tipc_nl_compat_link_stat_dump(struct tipc_nl_compat_msg *msg,
472 return -EINVAL; 472 return -EINVAL;
473 473
474 err = nla_parse_nested(link, TIPC_NLA_LINK_MAX, attrs[TIPC_NLA_LINK], 474 err = nla_parse_nested(link, TIPC_NLA_LINK_MAX, attrs[TIPC_NLA_LINK],
475 NULL); 475 NULL, NULL);
476 if (err) 476 if (err)
477 return err; 477 return err;
478 478
@@ -480,7 +480,7 @@ static int tipc_nl_compat_link_stat_dump(struct tipc_nl_compat_msg *msg,
480 return -EINVAL; 480 return -EINVAL;
481 481
482 err = nla_parse_nested(prop, TIPC_NLA_PROP_MAX, 482 err = nla_parse_nested(prop, TIPC_NLA_PROP_MAX,
483 link[TIPC_NLA_LINK_PROP], NULL); 483 link[TIPC_NLA_LINK_PROP], NULL, NULL);
484 if (err) 484 if (err)
485 return err; 485 return err;
486 486
@@ -488,7 +488,7 @@ static int tipc_nl_compat_link_stat_dump(struct tipc_nl_compat_msg *msg,
488 return -EINVAL; 488 return -EINVAL;
489 489
490 err = nla_parse_nested(stats, TIPC_NLA_STATS_MAX, 490 err = nla_parse_nested(stats, TIPC_NLA_STATS_MAX,
491 link[TIPC_NLA_LINK_STATS], NULL); 491 link[TIPC_NLA_LINK_STATS], NULL, NULL);
492 if (err) 492 if (err)
493 return err; 493 return err;
494 494
@@ -598,7 +598,7 @@ static int tipc_nl_compat_link_dump(struct tipc_nl_compat_msg *msg,
598 return -EINVAL; 598 return -EINVAL;
599 599
600 err = nla_parse_nested(link, TIPC_NLA_LINK_MAX, attrs[TIPC_NLA_LINK], 600 err = nla_parse_nested(link, TIPC_NLA_LINK_MAX, attrs[TIPC_NLA_LINK],
601 NULL); 601 NULL, NULL);
602 if (err) 602 if (err)
603 return err; 603 return err;
604 604
@@ -795,7 +795,7 @@ static int tipc_nl_compat_name_table_dump(struct tipc_nl_compat_msg *msg,
795 return -EINVAL; 795 return -EINVAL;
796 796
797 err = nla_parse_nested(nt, TIPC_NLA_NAME_TABLE_MAX, 797 err = nla_parse_nested(nt, TIPC_NLA_NAME_TABLE_MAX,
798 attrs[TIPC_NLA_NAME_TABLE], NULL); 798 attrs[TIPC_NLA_NAME_TABLE], NULL, NULL);
799 if (err) 799 if (err)
800 return err; 800 return err;
801 801
@@ -803,7 +803,7 @@ static int tipc_nl_compat_name_table_dump(struct tipc_nl_compat_msg *msg,
803 return -EINVAL; 803 return -EINVAL;
804 804
805 err = nla_parse_nested(publ, TIPC_NLA_PUBL_MAX, 805 err = nla_parse_nested(publ, TIPC_NLA_PUBL_MAX,
806 nt[TIPC_NLA_NAME_TABLE_PUBL], NULL); 806 nt[TIPC_NLA_NAME_TABLE_PUBL], NULL, NULL);
807 if (err) 807 if (err)
808 return err; 808 return err;
809 809
@@ -863,7 +863,7 @@ static int __tipc_nl_compat_publ_dump(struct tipc_nl_compat_msg *msg,
863 return -EINVAL; 863 return -EINVAL;
864 864
865 err = nla_parse_nested(publ, TIPC_NLA_PUBL_MAX, attrs[TIPC_NLA_PUBL], 865 err = nla_parse_nested(publ, TIPC_NLA_PUBL_MAX, attrs[TIPC_NLA_PUBL],
866 NULL); 866 NULL, NULL);
867 if (err) 867 if (err)
868 return err; 868 return err;
869 869
@@ -929,7 +929,7 @@ static int tipc_nl_compat_sk_dump(struct tipc_nl_compat_msg *msg,
929 return -EINVAL; 929 return -EINVAL;
930 930
931 err = nla_parse_nested(sock, TIPC_NLA_SOCK_MAX, attrs[TIPC_NLA_SOCK], 931 err = nla_parse_nested(sock, TIPC_NLA_SOCK_MAX, attrs[TIPC_NLA_SOCK],
932 NULL); 932 NULL, NULL);
933 if (err) 933 if (err)
934 return err; 934 return err;
935 935
@@ -940,8 +940,8 @@ static int tipc_nl_compat_sk_dump(struct tipc_nl_compat_msg *msg,
940 u32 node; 940 u32 node;
941 struct nlattr *con[TIPC_NLA_CON_MAX + 1]; 941 struct nlattr *con[TIPC_NLA_CON_MAX + 1];
942 942
943 nla_parse_nested(con, TIPC_NLA_CON_MAX, sock[TIPC_NLA_SOCK_CON], 943 nla_parse_nested(con, TIPC_NLA_CON_MAX,
944 NULL); 944 sock[TIPC_NLA_SOCK_CON], NULL, NULL);
945 945
946 node = nla_get_u32(con[TIPC_NLA_CON_NODE]); 946 node = nla_get_u32(con[TIPC_NLA_CON_NODE]);
947 tipc_tlv_sprintf(msg->rep, " connected to <%u.%u.%u:%u>", 947 tipc_tlv_sprintf(msg->rep, " connected to <%u.%u.%u:%u>",
@@ -977,8 +977,8 @@ static int tipc_nl_compat_media_dump(struct tipc_nl_compat_msg *msg,
977 if (!attrs[TIPC_NLA_MEDIA]) 977 if (!attrs[TIPC_NLA_MEDIA])
978 return -EINVAL; 978 return -EINVAL;
979 979
980 err = nla_parse_nested(media, TIPC_NLA_MEDIA_MAX, attrs[TIPC_NLA_MEDIA], 980 err = nla_parse_nested(media, TIPC_NLA_MEDIA_MAX,
981 NULL); 981 attrs[TIPC_NLA_MEDIA], NULL, NULL);
982 if (err) 982 if (err)
983 return err; 983 return err;
984 984
@@ -998,7 +998,7 @@ static int tipc_nl_compat_node_dump(struct tipc_nl_compat_msg *msg,
998 return -EINVAL; 998 return -EINVAL;
999 999
1000 err = nla_parse_nested(node, TIPC_NLA_NODE_MAX, attrs[TIPC_NLA_NODE], 1000 err = nla_parse_nested(node, TIPC_NLA_NODE_MAX, attrs[TIPC_NLA_NODE],
1001 NULL); 1001 NULL, NULL);
1002 if (err) 1002 if (err)
1003 return err; 1003 return err;
1004 1004
@@ -1045,7 +1045,7 @@ static int tipc_nl_compat_net_dump(struct tipc_nl_compat_msg *msg,
1045 return -EINVAL; 1045 return -EINVAL;
1046 1046
1047 err = nla_parse_nested(net, TIPC_NLA_NET_MAX, attrs[TIPC_NLA_NET], 1047 err = nla_parse_nested(net, TIPC_NLA_NET_MAX, attrs[TIPC_NLA_NET],
1048 NULL); 1048 NULL, NULL);
1049 if (err) 1049 if (err)
1050 return err; 1050 return err;
1051 1051
diff --git a/net/tipc/node.c b/net/tipc/node.c
index 4512e83652b1..aeef8011ac7d 100644
--- a/net/tipc/node.c
+++ b/net/tipc/node.c
@@ -1607,8 +1607,8 @@ int tipc_nl_peer_rm(struct sk_buff *skb, struct genl_info *info)
1607 return -EINVAL; 1607 return -EINVAL;
1608 1608
1609 err = nla_parse_nested(attrs, TIPC_NLA_NET_MAX, 1609 err = nla_parse_nested(attrs, TIPC_NLA_NET_MAX,
1610 info->attrs[TIPC_NLA_NET], 1610 info->attrs[TIPC_NLA_NET], tipc_nl_net_policy,
1611 tipc_nl_net_policy); 1611 info->extack);
1612 if (err) 1612 if (err)
1613 return err; 1613 return err;
1614 1614
@@ -1774,7 +1774,7 @@ int tipc_nl_node_set_link(struct sk_buff *skb, struct genl_info *info)
1774 1774
1775 err = nla_parse_nested(attrs, TIPC_NLA_LINK_MAX, 1775 err = nla_parse_nested(attrs, TIPC_NLA_LINK_MAX,
1776 info->attrs[TIPC_NLA_LINK], 1776 info->attrs[TIPC_NLA_LINK],
1777 tipc_nl_link_policy); 1777 tipc_nl_link_policy, info->extack);
1778 if (err) 1778 if (err)
1779 return err; 1779 return err;
1780 1780
@@ -1902,7 +1902,7 @@ int tipc_nl_node_reset_link_stats(struct sk_buff *skb, struct genl_info *info)
1902 1902
1903 err = nla_parse_nested(attrs, TIPC_NLA_LINK_MAX, 1903 err = nla_parse_nested(attrs, TIPC_NLA_LINK_MAX,
1904 info->attrs[TIPC_NLA_LINK], 1904 info->attrs[TIPC_NLA_LINK],
1905 tipc_nl_link_policy); 1905 tipc_nl_link_policy, info->extack);
1906 if (err) 1906 if (err)
1907 return err; 1907 return err;
1908 1908
@@ -2042,7 +2042,7 @@ int tipc_nl_node_set_monitor(struct sk_buff *skb, struct genl_info *info)
2042 2042
2043 err = nla_parse_nested(attrs, TIPC_NLA_MON_MAX, 2043 err = nla_parse_nested(attrs, TIPC_NLA_MON_MAX,
2044 info->attrs[TIPC_NLA_MON], 2044 info->attrs[TIPC_NLA_MON],
2045 tipc_nl_monitor_policy); 2045 tipc_nl_monitor_policy, info->extack);
2046 if (err) 2046 if (err)
2047 return err; 2047 return err;
2048 2048
@@ -2098,6 +2098,8 @@ int tipc_nl_node_get_monitor(struct sk_buff *skb, struct genl_info *info)
2098 int err; 2098 int err;
2099 2099
2100 msg.skb = nlmsg_new(NLMSG_GOODSIZE, GFP_KERNEL); 2100 msg.skb = nlmsg_new(NLMSG_GOODSIZE, GFP_KERNEL);
2101 if (!msg.skb)
2102 return -ENOMEM;
2101 msg.portid = info->snd_portid; 2103 msg.portid = info->snd_portid;
2102 msg.seq = info->snd_seq; 2104 msg.seq = info->snd_seq;
2103 2105
@@ -2163,7 +2165,7 @@ int tipc_nl_node_dump_monitor_peer(struct sk_buff *skb,
2163 2165
2164 err = nla_parse_nested(mon, TIPC_NLA_MON_MAX, 2166 err = nla_parse_nested(mon, TIPC_NLA_MON_MAX,
2165 attrs[TIPC_NLA_MON], 2167 attrs[TIPC_NLA_MON],
2166 tipc_nl_monitor_policy); 2168 tipc_nl_monitor_policy, NULL);
2167 if (err) 2169 if (err)
2168 return err; 2170 return err;
2169 2171
diff --git a/net/tipc/socket.c b/net/tipc/socket.c
index bdce99f9407a..0d4f2f455a7c 100644
--- a/net/tipc/socket.c
+++ b/net/tipc/socket.c
@@ -51,6 +51,7 @@
51#define TIPC_FWD_MSG 1 51#define TIPC_FWD_MSG 1
52#define TIPC_MAX_PORT 0xffffffff 52#define TIPC_MAX_PORT 0xffffffff
53#define TIPC_MIN_PORT 1 53#define TIPC_MIN_PORT 1
54#define TIPC_ACK_RATE 4 /* ACK at 1/4 of of rcv window size */
54 55
55enum { 56enum {
56 TIPC_LISTEN = TCP_LISTEN, 57 TIPC_LISTEN = TCP_LISTEN,
@@ -1305,7 +1306,7 @@ static int tipc_wait_for_rcvmsg(struct socket *sock, long *timeop)
1305/** 1306/**
1306 * tipc_recvmsg - receive packet-oriented message 1307 * tipc_recvmsg - receive packet-oriented message
1307 * @m: descriptor for message info 1308 * @m: descriptor for message info
1308 * @buf_len: total size of user buffer area 1309 * @buflen: length of user buffer area
1309 * @flags: receive flags 1310 * @flags: receive flags
1310 * 1311 *
1311 * Used for SOCK_DGRAM, SOCK_RDM, and SOCK_SEQPACKET messages. 1312 * Used for SOCK_DGRAM, SOCK_RDM, and SOCK_SEQPACKET messages.
@@ -1313,95 +1314,85 @@ static int tipc_wait_for_rcvmsg(struct socket *sock, long *timeop)
1313 * 1314 *
1314 * Returns size of returned message data, errno otherwise 1315 * Returns size of returned message data, errno otherwise
1315 */ 1316 */
1316static int tipc_recvmsg(struct socket *sock, struct msghdr *m, size_t buf_len, 1317static int tipc_recvmsg(struct socket *sock, struct msghdr *m,
1317 int flags) 1318 size_t buflen, int flags)
1318{ 1319{
1319 struct sock *sk = sock->sk; 1320 struct sock *sk = sock->sk;
1320 struct tipc_sock *tsk = tipc_sk(sk); 1321 struct tipc_sock *tsk = tipc_sk(sk);
1321 struct sk_buff *buf; 1322 struct sk_buff *skb;
1322 struct tipc_msg *msg; 1323 struct tipc_msg *hdr;
1323 bool is_connectionless = tipc_sk_type_connectionless(sk); 1324 bool connected = !tipc_sk_type_connectionless(sk);
1324 long timeo; 1325 int rc, err, hlen, dlen, copy;
1325 unsigned int sz; 1326 long timeout;
1326 u32 err;
1327 int res, hlen;
1328 1327
1329 /* Catch invalid receive requests */ 1328 /* Catch invalid receive requests */
1330 if (unlikely(!buf_len)) 1329 if (unlikely(!buflen))
1331 return -EINVAL; 1330 return -EINVAL;
1332 1331
1333 lock_sock(sk); 1332 lock_sock(sk);
1334 1333 if (unlikely(connected && sk->sk_state == TIPC_OPEN)) {
1335 if (!is_connectionless && unlikely(sk->sk_state == TIPC_OPEN)) { 1334 rc = -ENOTCONN;
1336 res = -ENOTCONN;
1337 goto exit; 1335 goto exit;
1338 } 1336 }
1337 timeout = sock_rcvtimeo(sk, flags & MSG_DONTWAIT);
1339 1338
1340 timeo = sock_rcvtimeo(sk, flags & MSG_DONTWAIT); 1339 do {
1341restart: 1340 /* Look at first msg in receive queue; wait if necessary */
1342 1341 rc = tipc_wait_for_rcvmsg(sock, &timeout);
1343 /* Look for a message in receive queue; wait if necessary */ 1342 if (unlikely(rc))
1344 res = tipc_wait_for_rcvmsg(sock, &timeo); 1343 goto exit;
1345 if (res) 1344 skb = skb_peek(&sk->sk_receive_queue);
1346 goto exit; 1345 hdr = buf_msg(skb);
1347 1346 dlen = msg_data_sz(hdr);
1348 /* Look at first message in receive queue */ 1347 hlen = msg_hdr_sz(hdr);
1349 buf = skb_peek(&sk->sk_receive_queue); 1348 err = msg_errcode(hdr);
1350 msg = buf_msg(buf); 1349 if (likely(dlen || err))
1351 sz = msg_data_sz(msg); 1350 break;
1352 hlen = msg_hdr_sz(msg);
1353 err = msg_errcode(msg);
1354
1355 /* Discard an empty non-errored message & try again */
1356 if ((!sz) && (!err)) {
1357 tsk_advance_rx_queue(sk); 1351 tsk_advance_rx_queue(sk);
1358 goto restart; 1352 } while (1);
1359 }
1360
1361 /* Capture sender's address (optional) */
1362 set_orig_addr(m, msg);
1363 1353
1364 /* Capture ancillary data (optional) */ 1354 /* Collect msg meta data, including error code and rejected data */
1365 res = tipc_sk_anc_data_recv(m, msg, tsk); 1355 set_orig_addr(m, hdr);
1366 if (res) 1356 rc = tipc_sk_anc_data_recv(m, hdr, tsk);
1357 if (unlikely(rc))
1367 goto exit; 1358 goto exit;
1368 1359
1369 /* Capture message data (if valid) & compute return value (always) */ 1360 /* Capture data if non-error msg, otherwise just set return value */
1370 if (!err) { 1361 if (likely(!err)) {
1371 if (unlikely(buf_len < sz)) { 1362 copy = min_t(int, dlen, buflen);
1372 sz = buf_len; 1363 if (unlikely(copy != dlen))
1373 m->msg_flags |= MSG_TRUNC; 1364 m->msg_flags |= MSG_TRUNC;
1374 } 1365 rc = skb_copy_datagram_msg(skb, hlen, m, copy);
1375 res = skb_copy_datagram_msg(buf, hlen, m, sz);
1376 if (res)
1377 goto exit;
1378 res = sz;
1379 } else { 1366 } else {
1380 if (is_connectionless || err == TIPC_CONN_SHUTDOWN || 1367 copy = 0;
1381 m->msg_control) 1368 rc = 0;
1382 res = 0; 1369 if (err != TIPC_CONN_SHUTDOWN && connected && !m->msg_control)
1383 else 1370 rc = -ECONNRESET;
1384 res = -ECONNRESET;
1385 } 1371 }
1372 if (unlikely(rc))
1373 goto exit;
1386 1374
1375 /* Caption of data or error code/rejected data was successful */
1387 if (unlikely(flags & MSG_PEEK)) 1376 if (unlikely(flags & MSG_PEEK))
1388 goto exit; 1377 goto exit;
1389 1378
1390 if (likely(!is_connectionless)) {
1391 tsk->rcv_unacked += tsk_inc(tsk, hlen + sz);
1392 if (unlikely(tsk->rcv_unacked >= (tsk->rcv_win / 4)))
1393 tipc_sk_send_ack(tsk);
1394 }
1395 tsk_advance_rx_queue(sk); 1379 tsk_advance_rx_queue(sk);
1380 if (likely(!connected))
1381 goto exit;
1382
1383 /* Send connection flow control ack when applicable */
1384 tsk->rcv_unacked += tsk_inc(tsk, hlen + dlen);
1385 if (tsk->rcv_unacked >= tsk->rcv_win / TIPC_ACK_RATE)
1386 tipc_sk_send_ack(tsk);
1396exit: 1387exit:
1397 release_sock(sk); 1388 release_sock(sk);
1398 return res; 1389 return rc ? rc : copy;
1399} 1390}
1400 1391
1401/** 1392/**
1402 * tipc_recv_stream - receive stream-oriented data 1393 * tipc_recvstream - receive stream-oriented data
1403 * @m: descriptor for message info 1394 * @m: descriptor for message info
1404 * @buf_len: total size of user buffer area 1395 * @buflen: total size of user buffer area
1405 * @flags: receive flags 1396 * @flags: receive flags
1406 * 1397 *
1407 * Used for SOCK_STREAM messages only. If not enough data is available 1398 * Used for SOCK_STREAM messages only. If not enough data is available
@@ -1409,111 +1400,98 @@ exit:
1409 * 1400 *
1410 * Returns size of returned message data, errno otherwise 1401 * Returns size of returned message data, errno otherwise
1411 */ 1402 */
1412static int tipc_recv_stream(struct socket *sock, struct msghdr *m, 1403static int tipc_recvstream(struct socket *sock, struct msghdr *m,
1413 size_t buf_len, int flags) 1404 size_t buflen, int flags)
1414{ 1405{
1415 struct sock *sk = sock->sk; 1406 struct sock *sk = sock->sk;
1416 struct tipc_sock *tsk = tipc_sk(sk); 1407 struct tipc_sock *tsk = tipc_sk(sk);
1417 struct sk_buff *buf; 1408 struct sk_buff *skb;
1418 struct tipc_msg *msg; 1409 struct tipc_msg *hdr;
1419 long timeo; 1410 struct tipc_skb_cb *skb_cb;
1420 unsigned int sz; 1411 bool peek = flags & MSG_PEEK;
1421 int target; 1412 int offset, required, copy, copied = 0;
1422 int sz_copied = 0; 1413 int hlen, dlen, err, rc;
1423 u32 err; 1414 long timeout;
1424 int res = 0, hlen;
1425 1415
1426 /* Catch invalid receive attempts */ 1416 /* Catch invalid receive attempts */
1427 if (unlikely(!buf_len)) 1417 if (unlikely(!buflen))
1428 return -EINVAL; 1418 return -EINVAL;
1429 1419
1430 lock_sock(sk); 1420 lock_sock(sk);
1431 1421
1432 if (unlikely(sk->sk_state == TIPC_OPEN)) { 1422 if (unlikely(sk->sk_state == TIPC_OPEN)) {
1433 res = -ENOTCONN; 1423 rc = -ENOTCONN;
1434 goto exit;
1435 }
1436
1437 target = sock_rcvlowat(sk, flags & MSG_WAITALL, buf_len);
1438 timeo = sock_rcvtimeo(sk, flags & MSG_DONTWAIT);
1439
1440restart:
1441 /* Look for a message in receive queue; wait if necessary */
1442 res = tipc_wait_for_rcvmsg(sock, &timeo);
1443 if (res)
1444 goto exit; 1424 goto exit;
1445
1446 /* Look at first message in receive queue */
1447 buf = skb_peek(&sk->sk_receive_queue);
1448 msg = buf_msg(buf);
1449 sz = msg_data_sz(msg);
1450 hlen = msg_hdr_sz(msg);
1451 err = msg_errcode(msg);
1452
1453 /* Discard an empty non-errored message & try again */
1454 if ((!sz) && (!err)) {
1455 tsk_advance_rx_queue(sk);
1456 goto restart;
1457 } 1425 }
1426 required = sock_rcvlowat(sk, flags & MSG_WAITALL, buflen);
1427 timeout = sock_rcvtimeo(sk, flags & MSG_DONTWAIT);
1458 1428
1459 /* Optionally capture sender's address & ancillary data of first msg */ 1429 do {
1460 if (sz_copied == 0) { 1430 /* Look at first msg in receive queue; wait if necessary */
1461 set_orig_addr(m, msg); 1431 rc = tipc_wait_for_rcvmsg(sock, &timeout);
1462 res = tipc_sk_anc_data_recv(m, msg, tsk); 1432 if (unlikely(rc))
1463 if (res) 1433 break;
1464 goto exit; 1434 skb = skb_peek(&sk->sk_receive_queue);
1465 } 1435 skb_cb = TIPC_SKB_CB(skb);
1466 1436 hdr = buf_msg(skb);
1467 /* Capture message data (if valid) & compute return value (always) */ 1437 dlen = msg_data_sz(hdr);
1468 if (!err) { 1438 hlen = msg_hdr_sz(hdr);
1469 u32 offset = TIPC_SKB_CB(buf)->bytes_read; 1439 err = msg_errcode(hdr);
1470 u32 needed; 1440
1471 int sz_to_copy; 1441 /* Discard any empty non-errored (SYN-) message */
1472 1442 if (unlikely(!dlen && !err)) {
1473 sz -= offset; 1443 tsk_advance_rx_queue(sk);
1474 needed = (buf_len - sz_copied); 1444 continue;
1475 sz_to_copy = min(sz, needed); 1445 }
1476
1477 res = skb_copy_datagram_msg(buf, hlen + offset, m, sz_to_copy);
1478 if (res)
1479 goto exit;
1480 1446
1481 sz_copied += sz_to_copy; 1447 /* Collect msg meta data, incl. error code and rejected data */
1448 if (!copied) {
1449 set_orig_addr(m, hdr);
1450 rc = tipc_sk_anc_data_recv(m, hdr, tsk);
1451 if (rc)
1452 break;
1453 }
1482 1454
1483 if (sz_to_copy < sz) { 1455 /* Copy data if msg ok, otherwise return error/partial data */
1484 if (!(flags & MSG_PEEK)) 1456 if (likely(!err)) {
1485 TIPC_SKB_CB(buf)->bytes_read = 1457 offset = skb_cb->bytes_read;
1486 offset + sz_to_copy; 1458 copy = min_t(int, dlen - offset, buflen - copied);
1487 goto exit; 1459 rc = skb_copy_datagram_msg(skb, hlen + offset, m, copy);
1460 if (unlikely(rc))
1461 break;
1462 copied += copy;
1463 offset += copy;
1464 if (unlikely(offset < dlen)) {
1465 if (!peek)
1466 skb_cb->bytes_read = offset;
1467 break;
1468 }
1469 } else {
1470 rc = 0;
1471 if ((err != TIPC_CONN_SHUTDOWN) && !m->msg_control)
1472 rc = -ECONNRESET;
1473 if (copied || rc)
1474 break;
1488 } 1475 }
1489 } else {
1490 if (sz_copied != 0)
1491 goto exit; /* can't add error msg to valid data */
1492 1476
1493 if ((err == TIPC_CONN_SHUTDOWN) || m->msg_control) 1477 if (unlikely(peek))
1494 res = 0; 1478 break;
1495 else
1496 res = -ECONNRESET;
1497 }
1498 1479
1499 if (unlikely(flags & MSG_PEEK)) 1480 tsk_advance_rx_queue(sk);
1500 goto exit;
1501 1481
1502 tsk->rcv_unacked += tsk_inc(tsk, hlen + msg_data_sz(msg)); 1482 /* Send connection flow control advertisement when applicable */
1503 if (unlikely(tsk->rcv_unacked >= (tsk->rcv_win / 4))) 1483 tsk->rcv_unacked += tsk_inc(tsk, hlen + dlen);
1504 tipc_sk_send_ack(tsk); 1484 if (unlikely(tsk->rcv_unacked >= tsk->rcv_win / TIPC_ACK_RATE))
1505 tsk_advance_rx_queue(sk); 1485 tipc_sk_send_ack(tsk);
1506 1486
1507 /* Loop around if more data is required */ 1487 /* Exit if all requested data or FIN/error received */
1508 if ((sz_copied < buf_len) && /* didn't get all requested data */ 1488 if (copied == buflen || err)
1509 (!skb_queue_empty(&sk->sk_receive_queue) || 1489 break;
1510 (sz_copied < target)) && /* and more is ready or required */
1511 (!err)) /* and haven't reached a FIN */
1512 goto restart;
1513 1490
1491 } while (!skb_queue_empty(&sk->sk_receive_queue) || copied < required);
1514exit: 1492exit:
1515 release_sock(sk); 1493 release_sock(sk);
1516 return sz_copied ? sz_copied : res; 1494 return copied ? copied : rc;
1517} 1495}
1518 1496
1519/** 1497/**
@@ -2537,6 +2515,28 @@ static int tipc_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
2537 } 2515 }
2538} 2516}
2539 2517
2518static int tipc_socketpair(struct socket *sock1, struct socket *sock2)
2519{
2520 struct tipc_sock *tsk2 = tipc_sk(sock2->sk);
2521 struct tipc_sock *tsk1 = tipc_sk(sock1->sk);
2522 u32 onode = tipc_own_addr(sock_net(sock1->sk));
2523
2524 tsk1->peer.family = AF_TIPC;
2525 tsk1->peer.addrtype = TIPC_ADDR_ID;
2526 tsk1->peer.scope = TIPC_NODE_SCOPE;
2527 tsk1->peer.addr.id.ref = tsk2->portid;
2528 tsk1->peer.addr.id.node = onode;
2529 tsk2->peer.family = AF_TIPC;
2530 tsk2->peer.addrtype = TIPC_ADDR_ID;
2531 tsk2->peer.scope = TIPC_NODE_SCOPE;
2532 tsk2->peer.addr.id.ref = tsk1->portid;
2533 tsk2->peer.addr.id.node = onode;
2534
2535 tipc_sk_finish_conn(tsk1, tsk2->portid, onode);
2536 tipc_sk_finish_conn(tsk2, tsk1->portid, onode);
2537 return 0;
2538}
2539
2540/* Protocol switches for the various types of TIPC sockets */ 2540/* Protocol switches for the various types of TIPC sockets */
2541 2541
2542static const struct proto_ops msg_ops = { 2542static const struct proto_ops msg_ops = {
@@ -2545,7 +2545,7 @@ static const struct proto_ops msg_ops = {
2545 .release = tipc_release, 2545 .release = tipc_release,
2546 .bind = tipc_bind, 2546 .bind = tipc_bind,
2547 .connect = tipc_connect, 2547 .connect = tipc_connect,
2548 .socketpair = sock_no_socketpair, 2548 .socketpair = tipc_socketpair,
2549 .accept = sock_no_accept, 2549 .accept = sock_no_accept,
2550 .getname = tipc_getname, 2550 .getname = tipc_getname,
2551 .poll = tipc_poll, 2551 .poll = tipc_poll,
@@ -2566,7 +2566,7 @@ static const struct proto_ops packet_ops = {
2566 .release = tipc_release, 2566 .release = tipc_release,
2567 .bind = tipc_bind, 2567 .bind = tipc_bind,
2568 .connect = tipc_connect, 2568 .connect = tipc_connect,
2569 .socketpair = sock_no_socketpair, 2569 .socketpair = tipc_socketpair,
2570 .accept = tipc_accept, 2570 .accept = tipc_accept,
2571 .getname = tipc_getname, 2571 .getname = tipc_getname,
2572 .poll = tipc_poll, 2572 .poll = tipc_poll,
@@ -2587,7 +2587,7 @@ static const struct proto_ops stream_ops = {
2587 .release = tipc_release, 2587 .release = tipc_release,
2588 .bind = tipc_bind, 2588 .bind = tipc_bind,
2589 .connect = tipc_connect, 2589 .connect = tipc_connect,
2590 .socketpair = sock_no_socketpair, 2590 .socketpair = tipc_socketpair,
2591 .accept = tipc_accept, 2591 .accept = tipc_accept,
2592 .getname = tipc_getname, 2592 .getname = tipc_getname,
2593 .poll = tipc_poll, 2593 .poll = tipc_poll,
@@ -2597,7 +2597,7 @@ static const struct proto_ops stream_ops = {
2597 .setsockopt = tipc_setsockopt, 2597 .setsockopt = tipc_setsockopt,
2598 .getsockopt = tipc_getsockopt, 2598 .getsockopt = tipc_getsockopt,
2599 .sendmsg = tipc_sendstream, 2599 .sendmsg = tipc_sendstream,
2600 .recvmsg = tipc_recv_stream, 2600 .recvmsg = tipc_recvstream,
2601 .mmap = sock_no_mmap, 2601 .mmap = sock_no_mmap,
2602 .sendpage = sock_no_sendpage 2602 .sendpage = sock_no_sendpage
2603}; 2603};
@@ -2870,7 +2870,7 @@ int tipc_nl_publ_dump(struct sk_buff *skb, struct netlink_callback *cb)
2870 2870
2871 err = nla_parse_nested(sock, TIPC_NLA_SOCK_MAX, 2871 err = nla_parse_nested(sock, TIPC_NLA_SOCK_MAX,
2872 attrs[TIPC_NLA_SOCK], 2872 attrs[TIPC_NLA_SOCK],
2873 tipc_nl_sock_policy); 2873 tipc_nl_sock_policy, NULL);
2874 if (err) 2874 if (err)
2875 return err; 2875 return err;
2876 2876
diff --git a/net/tipc/subscr.c b/net/tipc/subscr.c
index 271cd66e4b3b..0bf91cd3733c 100644
--- a/net/tipc/subscr.c
+++ b/net/tipc/subscr.c
@@ -54,8 +54,6 @@ struct tipc_subscriber {
54 54
55static void tipc_subscrp_delete(struct tipc_subscription *sub); 55static void tipc_subscrp_delete(struct tipc_subscription *sub);
56static void tipc_subscrb_put(struct tipc_subscriber *subscriber); 56static void tipc_subscrb_put(struct tipc_subscriber *subscriber);
57static void tipc_subscrp_put(struct tipc_subscription *subscription);
58static void tipc_subscrp_get(struct tipc_subscription *subscription);
59 57
60/** 58/**
61 * htohl - convert value to endianness used by destination 59 * htohl - convert value to endianness used by destination
@@ -125,7 +123,6 @@ void tipc_subscrp_report_overlap(struct tipc_subscription *sub, u32 found_lower,
125{ 123{
126 struct tipc_name_seq seq; 124 struct tipc_name_seq seq;
127 125
128 tipc_subscrp_get(sub);
129 tipc_subscrp_convert_seq(&sub->evt.s.seq, sub->swap, &seq); 126 tipc_subscrp_convert_seq(&sub->evt.s.seq, sub->swap, &seq);
130 if (!tipc_subscrp_check_overlap(&seq, found_lower, found_upper)) 127 if (!tipc_subscrp_check_overlap(&seq, found_lower, found_upper))
131 return; 128 return;
@@ -135,7 +132,6 @@ void tipc_subscrp_report_overlap(struct tipc_subscription *sub, u32 found_lower,
135 132
136 tipc_subscrp_send_event(sub, found_lower, found_upper, event, port_ref, 133 tipc_subscrp_send_event(sub, found_lower, found_upper, event, port_ref,
137 node); 134 node);
138 tipc_subscrp_put(sub);
139} 135}
140 136
141static void tipc_subscrp_timeout(unsigned long data) 137static void tipc_subscrp_timeout(unsigned long data)
@@ -145,6 +141,7 @@ static void tipc_subscrp_timeout(unsigned long data)
145 141
146 spin_lock_bh(&subscriber->lock); 142 spin_lock_bh(&subscriber->lock);
147 tipc_nametbl_unsubscribe(sub); 143 tipc_nametbl_unsubscribe(sub);
144 list_del(&sub->subscrp_list);
148 spin_unlock_bh(&subscriber->lock); 145 spin_unlock_bh(&subscriber->lock);
149 146
150 /* Notify subscriber of timeout */ 147 /* Notify subscriber of timeout */
@@ -177,20 +174,17 @@ static void tipc_subscrp_kref_release(struct kref *kref)
177 struct tipc_net *tn = net_generic(sub->net, tipc_net_id); 174 struct tipc_net *tn = net_generic(sub->net, tipc_net_id);
178 struct tipc_subscriber *subscriber = sub->subscriber; 175 struct tipc_subscriber *subscriber = sub->subscriber;
179 176
180 spin_lock_bh(&subscriber->lock);
181 list_del(&sub->subscrp_list);
182 atomic_dec(&tn->subscription_count); 177 atomic_dec(&tn->subscription_count);
183 spin_unlock_bh(&subscriber->lock);
184 kfree(sub); 178 kfree(sub);
185 tipc_subscrb_put(subscriber); 179 tipc_subscrb_put(subscriber);
186} 180}
187 181
188static void tipc_subscrp_put(struct tipc_subscription *subscription) 182void tipc_subscrp_put(struct tipc_subscription *subscription)
189{ 183{
190 kref_put(&subscription->kref, tipc_subscrp_kref_release); 184 kref_put(&subscription->kref, tipc_subscrp_kref_release);
191} 185}
192 186
193static void tipc_subscrp_get(struct tipc_subscription *subscription) 187void tipc_subscrp_get(struct tipc_subscription *subscription)
194{ 188{
195 kref_get(&subscription->kref); 189 kref_get(&subscription->kref);
196} 190}
@@ -210,11 +204,8 @@ static void tipc_subscrb_subscrp_delete(struct tipc_subscriber *subscriber,
210 continue; 204 continue;
211 205
212 tipc_nametbl_unsubscribe(sub); 206 tipc_nametbl_unsubscribe(sub);
213 tipc_subscrp_get(sub); 207 list_del(&sub->subscrp_list);
214 spin_unlock_bh(&subscriber->lock);
215 tipc_subscrp_delete(sub); 208 tipc_subscrp_delete(sub);
216 tipc_subscrp_put(sub);
217 spin_lock_bh(&subscriber->lock);
218 209
219 if (s) 210 if (s)
220 break; 211 break;
diff --git a/net/tipc/subscr.h b/net/tipc/subscr.h
index ffdc214c117a..ee52957dc952 100644
--- a/net/tipc/subscr.h
+++ b/net/tipc/subscr.h
@@ -78,4 +78,7 @@ u32 tipc_subscrp_convert_seq_type(u32 type, int swap);
78int tipc_topsrv_start(struct net *net); 78int tipc_topsrv_start(struct net *net);
79void tipc_topsrv_stop(struct net *net); 79void tipc_topsrv_stop(struct net *net);
80 80
81void tipc_subscrp_put(struct tipc_subscription *subscription);
82void tipc_subscrp_get(struct tipc_subscription *subscription);
83
81#endif 84#endif
diff --git a/net/tipc/udp_media.c b/net/tipc/udp_media.c
index 46061cf48cd1..ecca64fc6a6f 100644
--- a/net/tipc/udp_media.c
+++ b/net/tipc/udp_media.c
@@ -457,7 +457,7 @@ int tipc_udp_nl_dump_remoteip(struct sk_buff *skb, struct netlink_callback *cb)
457 457
458 err = nla_parse_nested(battrs, TIPC_NLA_BEARER_MAX, 458 err = nla_parse_nested(battrs, TIPC_NLA_BEARER_MAX,
459 attrs[TIPC_NLA_BEARER], 459 attrs[TIPC_NLA_BEARER],
460 tipc_nl_bearer_policy); 460 tipc_nl_bearer_policy, NULL);
461 if (err) 461 if (err)
462 return err; 462 return err;
463 463
@@ -609,7 +609,8 @@ int tipc_udp_nl_bearer_add(struct tipc_bearer *b, struct nlattr *attr)
609 struct nlattr *opts[TIPC_NLA_UDP_MAX + 1]; 609 struct nlattr *opts[TIPC_NLA_UDP_MAX + 1];
610 struct udp_media_addr *dst; 610 struct udp_media_addr *dst;
611 611
612 if (nla_parse_nested(opts, TIPC_NLA_UDP_MAX, attr, tipc_nl_udp_policy)) 612 if (nla_parse_nested(opts, TIPC_NLA_UDP_MAX, attr,
613 tipc_nl_udp_policy, NULL))
613 return -EINVAL; 614 return -EINVAL;
614 615
615 if (!opts[TIPC_NLA_UDP_REMOTE]) 616 if (!opts[TIPC_NLA_UDP_REMOTE])
@@ -662,7 +663,7 @@ static int tipc_udp_enable(struct net *net, struct tipc_bearer *b,
662 663
663 if (nla_parse_nested(opts, TIPC_NLA_UDP_MAX, 664 if (nla_parse_nested(opts, TIPC_NLA_UDP_MAX,
664 attrs[TIPC_NLA_BEARER_UDP_OPTS], 665 attrs[TIPC_NLA_BEARER_UDP_OPTS],
665 tipc_nl_udp_policy)) 666 tipc_nl_udp_policy, NULL))
666 goto err; 667 goto err;
667 668
668 if (!opts[TIPC_NLA_UDP_LOCAL] || !opts[TIPC_NLA_UDP_REMOTE]) { 669 if (!opts[TIPC_NLA_UDP_LOCAL] || !opts[TIPC_NLA_UDP_REMOTE]) {