diff options
Diffstat (limited to 'net')
| -rw-r--r-- | net/ax25/af_ax25.c | 9 | ||||
| -rw-r--r-- | net/caif/chnl_net.c | 9 | ||||
| -rw-r--r-- | net/core/dev.c | 20 | ||||
| -rw-r--r-- | net/core/drop_monitor.c | 1 | ||||
| -rw-r--r-- | net/core/net_namespace.c | 33 | ||||
| -rw-r--r-- | net/ipv4/tcp_input.c | 1 | ||||
| -rw-r--r-- | net/ipv4/tcp_output.c | 1 | ||||
| -rw-r--r-- | net/ipv6/addrconf.c | 9 | ||||
| -rw-r--r-- | net/ipv6/ip6_fib.c | 9 | ||||
| -rw-r--r-- | net/ipv6/ndisc.c | 3 | ||||
| -rw-r--r-- | net/ipv6/route.c | 71 | ||||
| -rw-r--r-- | net/ipv6/tcp_ipv6.c | 4 | ||||
| -rw-r--r-- | net/key/af_key.c | 2 | ||||
| -rw-r--r-- | net/l2tp/l2tp_ip.c | 5 | ||||
| -rw-r--r-- | net/mac80211/ibss.c | 4 | ||||
| -rw-r--r-- | net/mac80211/rx.c | 10 | ||||
| -rw-r--r-- | net/phonet/pn_dev.c | 21 | ||||
| -rw-r--r-- | net/sched/sch_gred.c | 7 | ||||
| -rw-r--r-- | net/sunrpc/clnt.c | 50 | ||||
| -rw-r--r-- | net/sunrpc/rpc_pipe.c | 3 | ||||
| -rw-r--r-- | net/sunrpc/sunrpc_syms.c | 17 | ||||
| -rw-r--r-- | net/wireless/util.c | 2 |
22 files changed, 175 insertions, 116 deletions
diff --git a/net/ax25/af_ax25.c b/net/ax25/af_ax25.c index 0906c194a413..9d9a6a3edbd5 100644 --- a/net/ax25/af_ax25.c +++ b/net/ax25/af_ax25.c | |||
| @@ -2011,16 +2011,17 @@ static void __exit ax25_exit(void) | |||
| 2011 | proc_net_remove(&init_net, "ax25_route"); | 2011 | proc_net_remove(&init_net, "ax25_route"); |
| 2012 | proc_net_remove(&init_net, "ax25"); | 2012 | proc_net_remove(&init_net, "ax25"); |
| 2013 | proc_net_remove(&init_net, "ax25_calls"); | 2013 | proc_net_remove(&init_net, "ax25_calls"); |
| 2014 | ax25_rt_free(); | ||
| 2015 | ax25_uid_free(); | ||
| 2016 | ax25_dev_free(); | ||
| 2017 | 2014 | ||
| 2018 | ax25_unregister_sysctl(); | ||
| 2019 | unregister_netdevice_notifier(&ax25_dev_notifier); | 2015 | unregister_netdevice_notifier(&ax25_dev_notifier); |
| 2016 | ax25_unregister_sysctl(); | ||
| 2020 | 2017 | ||
| 2021 | dev_remove_pack(&ax25_packet_type); | 2018 | dev_remove_pack(&ax25_packet_type); |
| 2022 | 2019 | ||
| 2023 | sock_unregister(PF_AX25); | 2020 | sock_unregister(PF_AX25); |
| 2024 | proto_unregister(&ax25_proto); | 2021 | proto_unregister(&ax25_proto); |
| 2022 | |||
| 2023 | ax25_rt_free(); | ||
| 2024 | ax25_uid_free(); | ||
| 2025 | ax25_dev_free(); | ||
| 2025 | } | 2026 | } |
| 2026 | module_exit(ax25_exit); | 2027 | module_exit(ax25_exit); |
diff --git a/net/caif/chnl_net.c b/net/caif/chnl_net.c index 20618dd3088b..d09340e1523f 100644 --- a/net/caif/chnl_net.c +++ b/net/caif/chnl_net.c | |||
| @@ -103,6 +103,7 @@ static int chnl_recv_cb(struct cflayer *layr, struct cfpkt *pkt) | |||
| 103 | skb->protocol = htons(ETH_P_IPV6); | 103 | skb->protocol = htons(ETH_P_IPV6); |
| 104 | break; | 104 | break; |
| 105 | default: | 105 | default: |
| 106 | kfree_skb(skb); | ||
| 106 | priv->netdev->stats.rx_errors++; | 107 | priv->netdev->stats.rx_errors++; |
| 107 | return -EINVAL; | 108 | return -EINVAL; |
| 108 | } | 109 | } |
| @@ -220,14 +221,16 @@ static int chnl_net_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
| 220 | 221 | ||
| 221 | if (skb->len > priv->netdev->mtu) { | 222 | if (skb->len > priv->netdev->mtu) { |
| 222 | pr_warn("Size of skb exceeded MTU\n"); | 223 | pr_warn("Size of skb exceeded MTU\n"); |
| 224 | kfree_skb(skb); | ||
| 223 | dev->stats.tx_errors++; | 225 | dev->stats.tx_errors++; |
| 224 | return -ENOSPC; | 226 | return NETDEV_TX_OK; |
| 225 | } | 227 | } |
| 226 | 228 | ||
| 227 | if (!priv->flowenabled) { | 229 | if (!priv->flowenabled) { |
| 228 | pr_debug("dropping packets flow off\n"); | 230 | pr_debug("dropping packets flow off\n"); |
| 231 | kfree_skb(skb); | ||
| 229 | dev->stats.tx_dropped++; | 232 | dev->stats.tx_dropped++; |
| 230 | return NETDEV_TX_BUSY; | 233 | return NETDEV_TX_OK; |
| 231 | } | 234 | } |
| 232 | 235 | ||
| 233 | if (priv->conn_req.protocol == CAIFPROTO_DATAGRAM_LOOP) | 236 | if (priv->conn_req.protocol == CAIFPROTO_DATAGRAM_LOOP) |
| @@ -242,7 +245,7 @@ static int chnl_net_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
| 242 | result = priv->chnl.dn->transmit(priv->chnl.dn, pkt); | 245 | result = priv->chnl.dn->transmit(priv->chnl.dn, pkt); |
| 243 | if (result) { | 246 | if (result) { |
| 244 | dev->stats.tx_dropped++; | 247 | dev->stats.tx_dropped++; |
| 245 | return result; | 248 | return NETDEV_TX_OK; |
| 246 | } | 249 | } |
| 247 | 250 | ||
| 248 | /* Update statistics. */ | 251 | /* Update statistics. */ |
diff --git a/net/core/dev.c b/net/core/dev.c index c25d453b2803..9bb8f87c4cda 100644 --- a/net/core/dev.c +++ b/net/core/dev.c | |||
| @@ -1409,14 +1409,34 @@ EXPORT_SYMBOL(register_netdevice_notifier); | |||
| 1409 | * register_netdevice_notifier(). The notifier is unlinked into the | 1409 | * register_netdevice_notifier(). The notifier is unlinked into the |
| 1410 | * kernel structures and may then be reused. A negative errno code | 1410 | * kernel structures and may then be reused. A negative errno code |
| 1411 | * is returned on a failure. | 1411 | * is returned on a failure. |
| 1412 | * | ||
| 1413 | * After unregistering unregister and down device events are synthesized | ||
| 1414 | * for all devices on the device list to the removed notifier to remove | ||
| 1415 | * the need for special case cleanup code. | ||
| 1412 | */ | 1416 | */ |
| 1413 | 1417 | ||
| 1414 | int unregister_netdevice_notifier(struct notifier_block *nb) | 1418 | int unregister_netdevice_notifier(struct notifier_block *nb) |
| 1415 | { | 1419 | { |
| 1420 | struct net_device *dev; | ||
| 1421 | struct net *net; | ||
| 1416 | int err; | 1422 | int err; |
| 1417 | 1423 | ||
| 1418 | rtnl_lock(); | 1424 | rtnl_lock(); |
| 1419 | err = raw_notifier_chain_unregister(&netdev_chain, nb); | 1425 | err = raw_notifier_chain_unregister(&netdev_chain, nb); |
| 1426 | if (err) | ||
| 1427 | goto unlock; | ||
| 1428 | |||
| 1429 | for_each_net(net) { | ||
| 1430 | for_each_netdev(net, dev) { | ||
| 1431 | if (dev->flags & IFF_UP) { | ||
| 1432 | nb->notifier_call(nb, NETDEV_GOING_DOWN, dev); | ||
| 1433 | nb->notifier_call(nb, NETDEV_DOWN, dev); | ||
| 1434 | } | ||
| 1435 | nb->notifier_call(nb, NETDEV_UNREGISTER, dev); | ||
| 1436 | nb->notifier_call(nb, NETDEV_UNREGISTER_BATCH, dev); | ||
| 1437 | } | ||
| 1438 | } | ||
| 1439 | unlock: | ||
| 1420 | rtnl_unlock(); | 1440 | rtnl_unlock(); |
| 1421 | return err; | 1441 | return err; |
| 1422 | } | 1442 | } |
diff --git a/net/core/drop_monitor.c b/net/core/drop_monitor.c index 7f36b38e060f..5c3c81a609e5 100644 --- a/net/core/drop_monitor.c +++ b/net/core/drop_monitor.c | |||
| @@ -150,6 +150,7 @@ static void trace_drop_common(struct sk_buff *skb, void *location) | |||
| 150 | for (i = 0; i < msg->entries; i++) { | 150 | for (i = 0; i < msg->entries; i++) { |
| 151 | if (!memcmp(&location, msg->points[i].pc, sizeof(void *))) { | 151 | if (!memcmp(&location, msg->points[i].pc, sizeof(void *))) { |
| 152 | msg->points[i].count++; | 152 | msg->points[i].count++; |
| 153 | atomic_inc(&data->dm_hit_count); | ||
| 153 | goto out; | 154 | goto out; |
| 154 | } | 155 | } |
| 155 | } | 156 | } |
diff --git a/net/core/net_namespace.c b/net/core/net_namespace.c index 0e950fda9a0a..31a5ae51a45c 100644 --- a/net/core/net_namespace.c +++ b/net/core/net_namespace.c | |||
| @@ -83,21 +83,29 @@ assign: | |||
| 83 | 83 | ||
| 84 | static int ops_init(const struct pernet_operations *ops, struct net *net) | 84 | static int ops_init(const struct pernet_operations *ops, struct net *net) |
| 85 | { | 85 | { |
| 86 | int err; | 86 | int err = -ENOMEM; |
| 87 | void *data = NULL; | ||
| 88 | |||
| 87 | if (ops->id && ops->size) { | 89 | if (ops->id && ops->size) { |
| 88 | void *data = kzalloc(ops->size, GFP_KERNEL); | 90 | data = kzalloc(ops->size, GFP_KERNEL); |
| 89 | if (!data) | 91 | if (!data) |
| 90 | return -ENOMEM; | 92 | goto out; |
| 91 | 93 | ||
| 92 | err = net_assign_generic(net, *ops->id, data); | 94 | err = net_assign_generic(net, *ops->id, data); |
| 93 | if (err) { | 95 | if (err) |
| 94 | kfree(data); | 96 | goto cleanup; |
| 95 | return err; | ||
| 96 | } | ||
| 97 | } | 97 | } |
| 98 | err = 0; | ||
| 98 | if (ops->init) | 99 | if (ops->init) |
| 99 | return ops->init(net); | 100 | err = ops->init(net); |
| 100 | return 0; | 101 | if (!err) |
| 102 | return 0; | ||
| 103 | |||
| 104 | cleanup: | ||
| 105 | kfree(data); | ||
| 106 | |||
| 107 | out: | ||
| 108 | return err; | ||
| 101 | } | 109 | } |
| 102 | 110 | ||
| 103 | static void ops_free(const struct pernet_operations *ops, struct net *net) | 111 | static void ops_free(const struct pernet_operations *ops, struct net *net) |
| @@ -448,12 +456,7 @@ static void __unregister_pernet_operations(struct pernet_operations *ops) | |||
| 448 | static int __register_pernet_operations(struct list_head *list, | 456 | static int __register_pernet_operations(struct list_head *list, |
| 449 | struct pernet_operations *ops) | 457 | struct pernet_operations *ops) |
| 450 | { | 458 | { |
| 451 | int err = 0; | 459 | return ops_init(ops, &init_net); |
| 452 | err = ops_init(ops, &init_net); | ||
| 453 | if (err) | ||
| 454 | ops_free(ops, &init_net); | ||
| 455 | return err; | ||
| 456 | |||
| 457 | } | 460 | } |
| 458 | 461 | ||
| 459 | static void __unregister_pernet_operations(struct pernet_operations *ops) | 462 | static void __unregister_pernet_operations(struct pernet_operations *ops) |
diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c index 9944c1d9a218..3ff364065376 100644 --- a/net/ipv4/tcp_input.c +++ b/net/ipv4/tcp_input.c | |||
| @@ -335,6 +335,7 @@ static void tcp_grow_window(struct sock *sk, const struct sk_buff *skb) | |||
| 335 | incr = __tcp_grow_window(sk, skb); | 335 | incr = __tcp_grow_window(sk, skb); |
| 336 | 336 | ||
| 337 | if (incr) { | 337 | if (incr) { |
| 338 | incr = max_t(int, incr, 2 * skb->len); | ||
| 338 | tp->rcv_ssthresh = min(tp->rcv_ssthresh + incr, | 339 | tp->rcv_ssthresh = min(tp->rcv_ssthresh + incr, |
| 339 | tp->window_clamp); | 340 | tp->window_clamp); |
| 340 | inet_csk(sk)->icsk_ack.quick |= 1; | 341 | inet_csk(sk)->icsk_ack.quick |= 1; |
diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c index 376b2cfbb685..7ac6423117ad 100644 --- a/net/ipv4/tcp_output.c +++ b/net/ipv4/tcp_output.c | |||
| @@ -1096,6 +1096,7 @@ static void __pskb_trim_head(struct sk_buff *skb, int len) | |||
| 1096 | eat = min_t(int, len, skb_headlen(skb)); | 1096 | eat = min_t(int, len, skb_headlen(skb)); |
| 1097 | if (eat) { | 1097 | if (eat) { |
| 1098 | __skb_pull(skb, eat); | 1098 | __skb_pull(skb, eat); |
| 1099 | skb->avail_size -= eat; | ||
| 1099 | len -= eat; | 1100 | len -= eat; |
| 1100 | if (!len) | 1101 | if (!len) |
| 1101 | return; | 1102 | return; |
diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c index 6a3bb6077e19..7d5cb975cc6f 100644 --- a/net/ipv6/addrconf.c +++ b/net/ipv6/addrconf.c | |||
| @@ -803,8 +803,7 @@ static void ipv6_del_addr(struct inet6_ifaddr *ifp) | |||
| 803 | ip6_del_rt(rt); | 803 | ip6_del_rt(rt); |
| 804 | rt = NULL; | 804 | rt = NULL; |
| 805 | } else if (!(rt->rt6i_flags & RTF_EXPIRES)) { | 805 | } else if (!(rt->rt6i_flags & RTF_EXPIRES)) { |
| 806 | rt->dst.expires = expires; | 806 | rt6_set_expires(rt, expires); |
| 807 | rt->rt6i_flags |= RTF_EXPIRES; | ||
| 808 | } | 807 | } |
| 809 | } | 808 | } |
| 810 | dst_release(&rt->dst); | 809 | dst_release(&rt->dst); |
| @@ -1887,11 +1886,9 @@ void addrconf_prefix_rcv(struct net_device *dev, u8 *opt, int len, bool sllao) | |||
| 1887 | rt = NULL; | 1886 | rt = NULL; |
| 1888 | } else if (addrconf_finite_timeout(rt_expires)) { | 1887 | } else if (addrconf_finite_timeout(rt_expires)) { |
| 1889 | /* not infinity */ | 1888 | /* not infinity */ |
| 1890 | rt->dst.expires = jiffies + rt_expires; | 1889 | rt6_set_expires(rt, jiffies + rt_expires); |
| 1891 | rt->rt6i_flags |= RTF_EXPIRES; | ||
| 1892 | } else { | 1890 | } else { |
| 1893 | rt->rt6i_flags &= ~RTF_EXPIRES; | 1891 | rt6_clean_expires(rt); |
| 1894 | rt->dst.expires = 0; | ||
| 1895 | } | 1892 | } |
| 1896 | } else if (valid_lft) { | 1893 | } else if (valid_lft) { |
| 1897 | clock_t expires = 0; | 1894 | clock_t expires = 0; |
diff --git a/net/ipv6/ip6_fib.c b/net/ipv6/ip6_fib.c index 5b27fbcae346..93717435013e 100644 --- a/net/ipv6/ip6_fib.c +++ b/net/ipv6/ip6_fib.c | |||
| @@ -673,11 +673,10 @@ static int fib6_add_rt2node(struct fib6_node *fn, struct rt6_info *rt, | |||
| 673 | &rt->rt6i_gateway)) { | 673 | &rt->rt6i_gateway)) { |
| 674 | if (!(iter->rt6i_flags & RTF_EXPIRES)) | 674 | if (!(iter->rt6i_flags & RTF_EXPIRES)) |
| 675 | return -EEXIST; | 675 | return -EEXIST; |
| 676 | iter->dst.expires = rt->dst.expires; | 676 | if (!(rt->rt6i_flags & RTF_EXPIRES)) |
| 677 | if (!(rt->rt6i_flags & RTF_EXPIRES)) { | 677 | rt6_clean_expires(iter); |
| 678 | iter->rt6i_flags &= ~RTF_EXPIRES; | 678 | else |
| 679 | iter->dst.expires = 0; | 679 | rt6_set_expires(iter, rt->dst.expires); |
| 680 | } | ||
| 681 | return -EEXIST; | 680 | return -EEXIST; |
| 682 | } | 681 | } |
| 683 | } | 682 | } |
diff --git a/net/ipv6/ndisc.c b/net/ipv6/ndisc.c index 3dcdb81ec3e8..176b469322ac 100644 --- a/net/ipv6/ndisc.c +++ b/net/ipv6/ndisc.c | |||
| @@ -1264,8 +1264,7 @@ static void ndisc_router_discovery(struct sk_buff *skb) | |||
| 1264 | } | 1264 | } |
| 1265 | 1265 | ||
| 1266 | if (rt) | 1266 | if (rt) |
| 1267 | rt->dst.expires = jiffies + (HZ * lifetime); | 1267 | rt6_set_expires(rt, jiffies + (HZ * lifetime)); |
| 1268 | |||
| 1269 | if (ra_msg->icmph.icmp6_hop_limit) { | 1268 | if (ra_msg->icmph.icmp6_hop_limit) { |
| 1270 | in6_dev->cnf.hop_limit = ra_msg->icmph.icmp6_hop_limit; | 1269 | in6_dev->cnf.hop_limit = ra_msg->icmph.icmp6_hop_limit; |
| 1271 | if (rt) | 1270 | if (rt) |
diff --git a/net/ipv6/route.c b/net/ipv6/route.c index 3992e26a6039..bc4888d902b2 100644 --- a/net/ipv6/route.c +++ b/net/ipv6/route.c | |||
| @@ -62,7 +62,7 @@ | |||
| 62 | #include <linux/sysctl.h> | 62 | #include <linux/sysctl.h> |
| 63 | #endif | 63 | #endif |
| 64 | 64 | ||
| 65 | static struct rt6_info *ip6_rt_copy(const struct rt6_info *ort, | 65 | static struct rt6_info *ip6_rt_copy(struct rt6_info *ort, |
| 66 | const struct in6_addr *dest); | 66 | const struct in6_addr *dest); |
| 67 | static struct dst_entry *ip6_dst_check(struct dst_entry *dst, u32 cookie); | 67 | static struct dst_entry *ip6_dst_check(struct dst_entry *dst, u32 cookie); |
| 68 | static unsigned int ip6_default_advmss(const struct dst_entry *dst); | 68 | static unsigned int ip6_default_advmss(const struct dst_entry *dst); |
| @@ -285,6 +285,10 @@ static void ip6_dst_destroy(struct dst_entry *dst) | |||
| 285 | rt->rt6i_idev = NULL; | 285 | rt->rt6i_idev = NULL; |
| 286 | in6_dev_put(idev); | 286 | in6_dev_put(idev); |
| 287 | } | 287 | } |
| 288 | |||
| 289 | if (!(rt->rt6i_flags & RTF_EXPIRES) && dst->from) | ||
| 290 | dst_release(dst->from); | ||
| 291 | |||
| 288 | if (peer) { | 292 | if (peer) { |
| 289 | rt->rt6i_peer = NULL; | 293 | rt->rt6i_peer = NULL; |
| 290 | inet_putpeer(peer); | 294 | inet_putpeer(peer); |
| @@ -329,8 +333,17 @@ static void ip6_dst_ifdown(struct dst_entry *dst, struct net_device *dev, | |||
| 329 | 333 | ||
| 330 | static __inline__ int rt6_check_expired(const struct rt6_info *rt) | 334 | static __inline__ int rt6_check_expired(const struct rt6_info *rt) |
| 331 | { | 335 | { |
| 332 | return (rt->rt6i_flags & RTF_EXPIRES) && | 336 | struct rt6_info *ort = NULL; |
| 333 | time_after(jiffies, rt->dst.expires); | 337 | |
| 338 | if (rt->rt6i_flags & RTF_EXPIRES) { | ||
| 339 | if (time_after(jiffies, rt->dst.expires)) | ||
| 340 | return 1; | ||
| 341 | } else if (rt->dst.from) { | ||
| 342 | ort = (struct rt6_info *) rt->dst.from; | ||
| 343 | return (ort->rt6i_flags & RTF_EXPIRES) && | ||
| 344 | time_after(jiffies, ort->dst.expires); | ||
| 345 | } | ||
| 346 | return 0; | ||
| 334 | } | 347 | } |
| 335 | 348 | ||
| 336 | static inline int rt6_need_strict(const struct in6_addr *daddr) | 349 | static inline int rt6_need_strict(const struct in6_addr *daddr) |
| @@ -620,12 +633,11 @@ int rt6_route_rcv(struct net_device *dev, u8 *opt, int len, | |||
| 620 | (rt->rt6i_flags & ~RTF_PREF_MASK) | RTF_PREF(pref); | 633 | (rt->rt6i_flags & ~RTF_PREF_MASK) | RTF_PREF(pref); |
| 621 | 634 | ||
| 622 | if (rt) { | 635 | if (rt) { |
| 623 | if (!addrconf_finite_timeout(lifetime)) { | 636 | if (!addrconf_finite_timeout(lifetime)) |
| 624 | rt->rt6i_flags &= ~RTF_EXPIRES; | 637 | rt6_clean_expires(rt); |
| 625 | } else { | 638 | else |
| 626 | rt->dst.expires = jiffies + HZ * lifetime; | 639 | rt6_set_expires(rt, jiffies + HZ * lifetime); |
| 627 | rt->rt6i_flags |= RTF_EXPIRES; | 640 | |
| 628 | } | ||
| 629 | dst_release(&rt->dst); | 641 | dst_release(&rt->dst); |
| 630 | } | 642 | } |
| 631 | return 0; | 643 | return 0; |
| @@ -730,7 +742,7 @@ int ip6_ins_rt(struct rt6_info *rt) | |||
| 730 | return __ip6_ins_rt(rt, &info); | 742 | return __ip6_ins_rt(rt, &info); |
| 731 | } | 743 | } |
| 732 | 744 | ||
| 733 | static struct rt6_info *rt6_alloc_cow(const struct rt6_info *ort, | 745 | static struct rt6_info *rt6_alloc_cow(struct rt6_info *ort, |
| 734 | const struct in6_addr *daddr, | 746 | const struct in6_addr *daddr, |
| 735 | const struct in6_addr *saddr) | 747 | const struct in6_addr *saddr) |
| 736 | { | 748 | { |
| @@ -954,10 +966,10 @@ struct dst_entry *ip6_blackhole_route(struct net *net, struct dst_entry *dst_ori | |||
| 954 | rt->rt6i_idev = ort->rt6i_idev; | 966 | rt->rt6i_idev = ort->rt6i_idev; |
| 955 | if (rt->rt6i_idev) | 967 | if (rt->rt6i_idev) |
| 956 | in6_dev_hold(rt->rt6i_idev); | 968 | in6_dev_hold(rt->rt6i_idev); |
| 957 | rt->dst.expires = 0; | ||
| 958 | 969 | ||
| 959 | rt->rt6i_gateway = ort->rt6i_gateway; | 970 | rt->rt6i_gateway = ort->rt6i_gateway; |
| 960 | rt->rt6i_flags = ort->rt6i_flags & ~RTF_EXPIRES; | 971 | rt->rt6i_flags = ort->rt6i_flags; |
| 972 | rt6_clean_expires(rt); | ||
| 961 | rt->rt6i_metric = 0; | 973 | rt->rt6i_metric = 0; |
| 962 | 974 | ||
| 963 | memcpy(&rt->rt6i_dst, &ort->rt6i_dst, sizeof(struct rt6key)); | 975 | memcpy(&rt->rt6i_dst, &ort->rt6i_dst, sizeof(struct rt6key)); |
| @@ -1019,10 +1031,9 @@ static void ip6_link_failure(struct sk_buff *skb) | |||
| 1019 | 1031 | ||
| 1020 | rt = (struct rt6_info *) skb_dst(skb); | 1032 | rt = (struct rt6_info *) skb_dst(skb); |
| 1021 | if (rt) { | 1033 | if (rt) { |
| 1022 | if (rt->rt6i_flags & RTF_CACHE) { | 1034 | if (rt->rt6i_flags & RTF_CACHE) |
| 1023 | dst_set_expires(&rt->dst, 0); | 1035 | rt6_update_expires(rt, 0); |
| 1024 | rt->rt6i_flags |= RTF_EXPIRES; | 1036 | else if (rt->rt6i_node && (rt->rt6i_flags & RTF_DEFAULT)) |
| 1025 | } else if (rt->rt6i_node && (rt->rt6i_flags & RTF_DEFAULT)) | ||
| 1026 | rt->rt6i_node->fn_sernum = -1; | 1037 | rt->rt6i_node->fn_sernum = -1; |
| 1027 | } | 1038 | } |
| 1028 | } | 1039 | } |
| @@ -1289,9 +1300,12 @@ int ip6_route_add(struct fib6_config *cfg) | |||
| 1289 | } | 1300 | } |
| 1290 | 1301 | ||
| 1291 | rt->dst.obsolete = -1; | 1302 | rt->dst.obsolete = -1; |
| 1292 | rt->dst.expires = (cfg->fc_flags & RTF_EXPIRES) ? | 1303 | |
| 1293 | jiffies + clock_t_to_jiffies(cfg->fc_expires) : | 1304 | if (cfg->fc_flags & RTF_EXPIRES) |
| 1294 | 0; | 1305 | rt6_set_expires(rt, jiffies + |
| 1306 | clock_t_to_jiffies(cfg->fc_expires)); | ||
| 1307 | else | ||
| 1308 | rt6_clean_expires(rt); | ||
| 1295 | 1309 | ||
| 1296 | if (cfg->fc_protocol == RTPROT_UNSPEC) | 1310 | if (cfg->fc_protocol == RTPROT_UNSPEC) |
| 1297 | cfg->fc_protocol = RTPROT_BOOT; | 1311 | cfg->fc_protocol = RTPROT_BOOT; |
| @@ -1736,8 +1750,8 @@ again: | |||
| 1736 | features |= RTAX_FEATURE_ALLFRAG; | 1750 | features |= RTAX_FEATURE_ALLFRAG; |
| 1737 | dst_metric_set(&rt->dst, RTAX_FEATURES, features); | 1751 | dst_metric_set(&rt->dst, RTAX_FEATURES, features); |
| 1738 | } | 1752 | } |
| 1739 | dst_set_expires(&rt->dst, net->ipv6.sysctl.ip6_rt_mtu_expires); | 1753 | rt6_update_expires(rt, net->ipv6.sysctl.ip6_rt_mtu_expires); |
| 1740 | rt->rt6i_flags |= RTF_MODIFIED|RTF_EXPIRES; | 1754 | rt->rt6i_flags |= RTF_MODIFIED; |
| 1741 | goto out; | 1755 | goto out; |
| 1742 | } | 1756 | } |
| 1743 | 1757 | ||
| @@ -1765,9 +1779,8 @@ again: | |||
| 1765 | * which is 10 mins. After 10 mins the decreased pmtu is expired | 1779 | * which is 10 mins. After 10 mins the decreased pmtu is expired |
| 1766 | * and detecting PMTU increase will be automatically happened. | 1780 | * and detecting PMTU increase will be automatically happened. |
| 1767 | */ | 1781 | */ |
| 1768 | dst_set_expires(&nrt->dst, net->ipv6.sysctl.ip6_rt_mtu_expires); | 1782 | rt6_update_expires(nrt, net->ipv6.sysctl.ip6_rt_mtu_expires); |
| 1769 | nrt->rt6i_flags |= RTF_DYNAMIC|RTF_EXPIRES; | 1783 | nrt->rt6i_flags |= RTF_DYNAMIC; |
| 1770 | |||
| 1771 | ip6_ins_rt(nrt); | 1784 | ip6_ins_rt(nrt); |
| 1772 | } | 1785 | } |
| 1773 | out: | 1786 | out: |
| @@ -1799,7 +1812,7 @@ void rt6_pmtu_discovery(const struct in6_addr *daddr, const struct in6_addr *sad | |||
| 1799 | * Misc support functions | 1812 | * Misc support functions |
| 1800 | */ | 1813 | */ |
| 1801 | 1814 | ||
| 1802 | static struct rt6_info *ip6_rt_copy(const struct rt6_info *ort, | 1815 | static struct rt6_info *ip6_rt_copy(struct rt6_info *ort, |
| 1803 | const struct in6_addr *dest) | 1816 | const struct in6_addr *dest) |
| 1804 | { | 1817 | { |
| 1805 | struct net *net = dev_net(ort->dst.dev); | 1818 | struct net *net = dev_net(ort->dst.dev); |
| @@ -1819,10 +1832,14 @@ static struct rt6_info *ip6_rt_copy(const struct rt6_info *ort, | |||
| 1819 | if (rt->rt6i_idev) | 1832 | if (rt->rt6i_idev) |
| 1820 | in6_dev_hold(rt->rt6i_idev); | 1833 | in6_dev_hold(rt->rt6i_idev); |
| 1821 | rt->dst.lastuse = jiffies; | 1834 | rt->dst.lastuse = jiffies; |
| 1822 | rt->dst.expires = 0; | ||
| 1823 | 1835 | ||
| 1824 | rt->rt6i_gateway = ort->rt6i_gateway; | 1836 | rt->rt6i_gateway = ort->rt6i_gateway; |
| 1825 | rt->rt6i_flags = ort->rt6i_flags & ~RTF_EXPIRES; | 1837 | rt->rt6i_flags = ort->rt6i_flags; |
| 1838 | if ((ort->rt6i_flags & (RTF_DEFAULT | RTF_ADDRCONF)) == | ||
| 1839 | (RTF_DEFAULT | RTF_ADDRCONF)) | ||
| 1840 | rt6_set_from(rt, ort); | ||
| 1841 | else | ||
| 1842 | rt6_clean_expires(rt); | ||
| 1826 | rt->rt6i_metric = 0; | 1843 | rt->rt6i_metric = 0; |
| 1827 | 1844 | ||
| 1828 | #ifdef CONFIG_IPV6_SUBTREES | 1845 | #ifdef CONFIG_IPV6_SUBTREES |
diff --git a/net/ipv6/tcp_ipv6.c b/net/ipv6/tcp_ipv6.c index 86cfe6005f40..98256cf72f9d 100644 --- a/net/ipv6/tcp_ipv6.c +++ b/net/ipv6/tcp_ipv6.c | |||
| @@ -1383,6 +1383,10 @@ static struct sock * tcp_v6_syn_recv_sock(struct sock *sk, struct sk_buff *skb, | |||
| 1383 | tcp_mtup_init(newsk); | 1383 | tcp_mtup_init(newsk); |
| 1384 | tcp_sync_mss(newsk, dst_mtu(dst)); | 1384 | tcp_sync_mss(newsk, dst_mtu(dst)); |
| 1385 | newtp->advmss = dst_metric_advmss(dst); | 1385 | newtp->advmss = dst_metric_advmss(dst); |
| 1386 | if (tcp_sk(sk)->rx_opt.user_mss && | ||
| 1387 | tcp_sk(sk)->rx_opt.user_mss < newtp->advmss) | ||
| 1388 | newtp->advmss = tcp_sk(sk)->rx_opt.user_mss; | ||
| 1389 | |||
| 1386 | tcp_initialize_rcv_mss(newsk); | 1390 | tcp_initialize_rcv_mss(newsk); |
| 1387 | if (tcp_rsk(req)->snt_synack) | 1391 | if (tcp_rsk(req)->snt_synack) |
| 1388 | tcp_valid_rtt_meas(newsk, | 1392 | tcp_valid_rtt_meas(newsk, |
diff --git a/net/key/af_key.c b/net/key/af_key.c index 11dbb2255ccb..7e5d927b576f 100644 --- a/net/key/af_key.c +++ b/net/key/af_key.c | |||
| @@ -3480,7 +3480,7 @@ static int pfkey_send_migrate(const struct xfrm_selector *sel, u8 dir, u8 type, | |||
| 3480 | 3480 | ||
| 3481 | /* Addresses to be used by KM for negotiation, if ext is available */ | 3481 | /* Addresses to be used by KM for negotiation, if ext is available */ |
| 3482 | if (k != NULL && (set_sadb_kmaddress(skb, k) < 0)) | 3482 | if (k != NULL && (set_sadb_kmaddress(skb, k) < 0)) |
| 3483 | return -EINVAL; | 3483 | goto err; |
| 3484 | 3484 | ||
| 3485 | /* selector src */ | 3485 | /* selector src */ |
| 3486 | set_sadb_address(skb, sasize_sel, SADB_EXT_ADDRESS_SRC, sel); | 3486 | set_sadb_address(skb, sasize_sel, SADB_EXT_ADDRESS_SRC, sel); |
diff --git a/net/l2tp/l2tp_ip.c b/net/l2tp/l2tp_ip.c index 55670ec3cd0f..585d93ecee2d 100644 --- a/net/l2tp/l2tp_ip.c +++ b/net/l2tp/l2tp_ip.c | |||
| @@ -232,7 +232,7 @@ static void l2tp_ip_close(struct sock *sk, long timeout) | |||
| 232 | { | 232 | { |
| 233 | write_lock_bh(&l2tp_ip_lock); | 233 | write_lock_bh(&l2tp_ip_lock); |
| 234 | hlist_del_init(&sk->sk_bind_node); | 234 | hlist_del_init(&sk->sk_bind_node); |
| 235 | hlist_del_init(&sk->sk_node); | 235 | sk_del_node_init(sk); |
| 236 | write_unlock_bh(&l2tp_ip_lock); | 236 | write_unlock_bh(&l2tp_ip_lock); |
| 237 | sk_common_release(sk); | 237 | sk_common_release(sk); |
| 238 | } | 238 | } |
| @@ -271,7 +271,8 @@ static int l2tp_ip_bind(struct sock *sk, struct sockaddr *uaddr, int addr_len) | |||
| 271 | chk_addr_ret != RTN_MULTICAST && chk_addr_ret != RTN_BROADCAST) | 271 | chk_addr_ret != RTN_MULTICAST && chk_addr_ret != RTN_BROADCAST) |
| 272 | goto out; | 272 | goto out; |
| 273 | 273 | ||
| 274 | inet->inet_rcv_saddr = inet->inet_saddr = addr->l2tp_addr.s_addr; | 274 | if (addr->l2tp_addr.s_addr) |
| 275 | inet->inet_rcv_saddr = inet->inet_saddr = addr->l2tp_addr.s_addr; | ||
| 275 | if (chk_addr_ret == RTN_MULTICAST || chk_addr_ret == RTN_BROADCAST) | 276 | if (chk_addr_ret == RTN_MULTICAST || chk_addr_ret == RTN_BROADCAST) |
| 276 | inet->inet_saddr = 0; /* Use device */ | 277 | inet->inet_saddr = 0; /* Use device */ |
| 277 | sk_dst_reset(sk); | 278 | sk_dst_reset(sk); |
diff --git a/net/mac80211/ibss.c b/net/mac80211/ibss.c index 33fd8d9f714e..cef7c29214a8 100644 --- a/net/mac80211/ibss.c +++ b/net/mac80211/ibss.c | |||
| @@ -457,8 +457,8 @@ static void ieee80211_rx_bss_info(struct ieee80211_sub_if_data *sdata, | |||
| 457 | * fall back to HT20 if we don't use or use | 457 | * fall back to HT20 if we don't use or use |
| 458 | * the other extension channel | 458 | * the other extension channel |
| 459 | */ | 459 | */ |
| 460 | if ((channel_type == NL80211_CHAN_HT40MINUS || | 460 | if (!(channel_type == NL80211_CHAN_HT40MINUS || |
| 461 | channel_type == NL80211_CHAN_HT40PLUS) && | 461 | channel_type == NL80211_CHAN_HT40PLUS) || |
| 462 | channel_type != sdata->u.ibss.channel_type) | 462 | channel_type != sdata->u.ibss.channel_type) |
| 463 | sta_ht_cap_new.cap &= | 463 | sta_ht_cap_new.cap &= |
| 464 | ~IEEE80211_HT_CAP_SUP_WIDTH_20_40; | 464 | ~IEEE80211_HT_CAP_SUP_WIDTH_20_40; |
diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c index bcfe8c77c839..d64e285400aa 100644 --- a/net/mac80211/rx.c +++ b/net/mac80211/rx.c | |||
| @@ -103,7 +103,7 @@ static void | |||
| 103 | ieee80211_add_rx_radiotap_header(struct ieee80211_local *local, | 103 | ieee80211_add_rx_radiotap_header(struct ieee80211_local *local, |
| 104 | struct sk_buff *skb, | 104 | struct sk_buff *skb, |
| 105 | struct ieee80211_rate *rate, | 105 | struct ieee80211_rate *rate, |
| 106 | int rtap_len) | 106 | int rtap_len, bool has_fcs) |
| 107 | { | 107 | { |
| 108 | struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(skb); | 108 | struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(skb); |
| 109 | struct ieee80211_radiotap_header *rthdr; | 109 | struct ieee80211_radiotap_header *rthdr; |
| @@ -134,7 +134,7 @@ ieee80211_add_rx_radiotap_header(struct ieee80211_local *local, | |||
| 134 | } | 134 | } |
| 135 | 135 | ||
| 136 | /* IEEE80211_RADIOTAP_FLAGS */ | 136 | /* IEEE80211_RADIOTAP_FLAGS */ |
| 137 | if (local->hw.flags & IEEE80211_HW_RX_INCLUDES_FCS) | 137 | if (has_fcs && (local->hw.flags & IEEE80211_HW_RX_INCLUDES_FCS)) |
| 138 | *pos |= IEEE80211_RADIOTAP_F_FCS; | 138 | *pos |= IEEE80211_RADIOTAP_F_FCS; |
| 139 | if (status->flag & (RX_FLAG_FAILED_FCS_CRC | RX_FLAG_FAILED_PLCP_CRC)) | 139 | if (status->flag & (RX_FLAG_FAILED_FCS_CRC | RX_FLAG_FAILED_PLCP_CRC)) |
| 140 | *pos |= IEEE80211_RADIOTAP_F_BADFCS; | 140 | *pos |= IEEE80211_RADIOTAP_F_BADFCS; |
| @@ -294,7 +294,8 @@ ieee80211_rx_monitor(struct ieee80211_local *local, struct sk_buff *origskb, | |||
| 294 | } | 294 | } |
| 295 | 295 | ||
| 296 | /* prepend radiotap information */ | 296 | /* prepend radiotap information */ |
| 297 | ieee80211_add_rx_radiotap_header(local, skb, rate, needed_headroom); | 297 | ieee80211_add_rx_radiotap_header(local, skb, rate, needed_headroom, |
| 298 | true); | ||
| 298 | 299 | ||
| 299 | skb_reset_mac_header(skb); | 300 | skb_reset_mac_header(skb); |
| 300 | skb->ip_summed = CHECKSUM_UNNECESSARY; | 301 | skb->ip_summed = CHECKSUM_UNNECESSARY; |
| @@ -2571,7 +2572,8 @@ static void ieee80211_rx_cooked_monitor(struct ieee80211_rx_data *rx, | |||
| 2571 | goto out_free_skb; | 2572 | goto out_free_skb; |
| 2572 | 2573 | ||
| 2573 | /* prepend radiotap information */ | 2574 | /* prepend radiotap information */ |
| 2574 | ieee80211_add_rx_radiotap_header(local, skb, rate, needed_headroom); | 2575 | ieee80211_add_rx_radiotap_header(local, skb, rate, needed_headroom, |
| 2576 | false); | ||
| 2575 | 2577 | ||
| 2576 | skb_set_mac_header(skb, 0); | 2578 | skb_set_mac_header(skb, 0); |
| 2577 | skb->ip_summed = CHECKSUM_UNNECESSARY; | 2579 | skb->ip_summed = CHECKSUM_UNNECESSARY; |
diff --git a/net/phonet/pn_dev.c b/net/phonet/pn_dev.c index 9b9a85ecc4c7..bf5cf69c820a 100644 --- a/net/phonet/pn_dev.c +++ b/net/phonet/pn_dev.c | |||
| @@ -331,23 +331,6 @@ static int __net_init phonet_init_net(struct net *net) | |||
| 331 | 331 | ||
| 332 | static void __net_exit phonet_exit_net(struct net *net) | 332 | static void __net_exit phonet_exit_net(struct net *net) |
| 333 | { | 333 | { |
| 334 | struct phonet_net *pnn = phonet_pernet(net); | ||
| 335 | struct net_device *dev; | ||
| 336 | unsigned i; | ||
| 337 | |||
| 338 | rtnl_lock(); | ||
| 339 | for_each_netdev(net, dev) | ||
| 340 | phonet_device_destroy(dev); | ||
| 341 | |||
| 342 | for (i = 0; i < 64; i++) { | ||
| 343 | dev = pnn->routes.table[i]; | ||
| 344 | if (dev) { | ||
| 345 | rtm_phonet_notify(RTM_DELROUTE, dev, i); | ||
| 346 | dev_put(dev); | ||
| 347 | } | ||
| 348 | } | ||
| 349 | rtnl_unlock(); | ||
| 350 | |||
| 351 | proc_net_remove(net, "phonet"); | 334 | proc_net_remove(net, "phonet"); |
| 352 | } | 335 | } |
| 353 | 336 | ||
| @@ -361,7 +344,7 @@ static struct pernet_operations phonet_net_ops = { | |||
| 361 | /* Initialize Phonet devices list */ | 344 | /* Initialize Phonet devices list */ |
| 362 | int __init phonet_device_init(void) | 345 | int __init phonet_device_init(void) |
| 363 | { | 346 | { |
| 364 | int err = register_pernet_device(&phonet_net_ops); | 347 | int err = register_pernet_subsys(&phonet_net_ops); |
| 365 | if (err) | 348 | if (err) |
| 366 | return err; | 349 | return err; |
| 367 | 350 | ||
| @@ -377,7 +360,7 @@ void phonet_device_exit(void) | |||
| 377 | { | 360 | { |
| 378 | rtnl_unregister_all(PF_PHONET); | 361 | rtnl_unregister_all(PF_PHONET); |
| 379 | unregister_netdevice_notifier(&phonet_device_notifier); | 362 | unregister_netdevice_notifier(&phonet_device_notifier); |
| 380 | unregister_pernet_device(&phonet_net_ops); | 363 | unregister_pernet_subsys(&phonet_net_ops); |
| 381 | proc_net_remove(&init_net, "pnresource"); | 364 | proc_net_remove(&init_net, "pnresource"); |
| 382 | } | 365 | } |
| 383 | 366 | ||
diff --git a/net/sched/sch_gred.c b/net/sched/sch_gred.c index 0b15236be7b6..8179494c269a 100644 --- a/net/sched/sch_gred.c +++ b/net/sched/sch_gred.c | |||
| @@ -565,11 +565,8 @@ static int gred_dump(struct Qdisc *sch, struct sk_buff *skb) | |||
| 565 | opt.packets = q->packetsin; | 565 | opt.packets = q->packetsin; |
| 566 | opt.bytesin = q->bytesin; | 566 | opt.bytesin = q->bytesin; |
| 567 | 567 | ||
| 568 | if (gred_wred_mode(table)) { | 568 | if (gred_wred_mode(table)) |
| 569 | q->vars.qidlestart = | 569 | gred_load_wred_set(table, q); |
| 570 | table->tab[table->def]->vars.qidlestart; | ||
| 571 | q->vars.qavg = table->tab[table->def]->vars.qavg; | ||
| 572 | } | ||
| 573 | 570 | ||
| 574 | opt.qave = red_calc_qavg(&q->parms, &q->vars, q->vars.qavg); | 571 | opt.qave = red_calc_qavg(&q->parms, &q->vars, q->vars.qavg); |
| 575 | 572 | ||
diff --git a/net/sunrpc/clnt.c b/net/sunrpc/clnt.c index 67972462a543..adf2990acebf 100644 --- a/net/sunrpc/clnt.c +++ b/net/sunrpc/clnt.c | |||
| @@ -176,16 +176,22 @@ rpc_setup_pipedir(struct rpc_clnt *clnt, const char *dir_name) | |||
| 176 | return 0; | 176 | return 0; |
| 177 | } | 177 | } |
| 178 | 178 | ||
| 179 | static int __rpc_pipefs_event(struct rpc_clnt *clnt, unsigned long event, | 179 | static inline int rpc_clnt_skip_event(struct rpc_clnt *clnt, unsigned long event) |
| 180 | struct super_block *sb) | 180 | { |
| 181 | if (((event == RPC_PIPEFS_MOUNT) && clnt->cl_dentry) || | ||
| 182 | ((event == RPC_PIPEFS_UMOUNT) && !clnt->cl_dentry)) | ||
| 183 | return 1; | ||
| 184 | return 0; | ||
| 185 | } | ||
| 186 | |||
| 187 | static int __rpc_clnt_handle_event(struct rpc_clnt *clnt, unsigned long event, | ||
| 188 | struct super_block *sb) | ||
| 181 | { | 189 | { |
| 182 | struct dentry *dentry; | 190 | struct dentry *dentry; |
| 183 | int err = 0; | 191 | int err = 0; |
| 184 | 192 | ||
| 185 | switch (event) { | 193 | switch (event) { |
| 186 | case RPC_PIPEFS_MOUNT: | 194 | case RPC_PIPEFS_MOUNT: |
| 187 | if (clnt->cl_program->pipe_dir_name == NULL) | ||
| 188 | break; | ||
| 189 | dentry = rpc_setup_pipedir_sb(sb, clnt, | 195 | dentry = rpc_setup_pipedir_sb(sb, clnt, |
| 190 | clnt->cl_program->pipe_dir_name); | 196 | clnt->cl_program->pipe_dir_name); |
| 191 | BUG_ON(dentry == NULL); | 197 | BUG_ON(dentry == NULL); |
| @@ -208,6 +214,20 @@ static int __rpc_pipefs_event(struct rpc_clnt *clnt, unsigned long event, | |||
| 208 | return err; | 214 | return err; |
| 209 | } | 215 | } |
| 210 | 216 | ||
| 217 | static int __rpc_pipefs_event(struct rpc_clnt *clnt, unsigned long event, | ||
| 218 | struct super_block *sb) | ||
| 219 | { | ||
| 220 | int error = 0; | ||
| 221 | |||
| 222 | for (;; clnt = clnt->cl_parent) { | ||
| 223 | if (!rpc_clnt_skip_event(clnt, event)) | ||
| 224 | error = __rpc_clnt_handle_event(clnt, event, sb); | ||
| 225 | if (error || clnt == clnt->cl_parent) | ||
| 226 | break; | ||
| 227 | } | ||
| 228 | return error; | ||
| 229 | } | ||
| 230 | |||
| 211 | static struct rpc_clnt *rpc_get_client_for_event(struct net *net, int event) | 231 | static struct rpc_clnt *rpc_get_client_for_event(struct net *net, int event) |
| 212 | { | 232 | { |
| 213 | struct sunrpc_net *sn = net_generic(net, sunrpc_net_id); | 233 | struct sunrpc_net *sn = net_generic(net, sunrpc_net_id); |
| @@ -215,10 +235,12 @@ static struct rpc_clnt *rpc_get_client_for_event(struct net *net, int event) | |||
| 215 | 235 | ||
| 216 | spin_lock(&sn->rpc_client_lock); | 236 | spin_lock(&sn->rpc_client_lock); |
| 217 | list_for_each_entry(clnt, &sn->all_clients, cl_clients) { | 237 | list_for_each_entry(clnt, &sn->all_clients, cl_clients) { |
| 218 | if (((event == RPC_PIPEFS_MOUNT) && clnt->cl_dentry) || | 238 | if (clnt->cl_program->pipe_dir_name == NULL) |
| 219 | ((event == RPC_PIPEFS_UMOUNT) && !clnt->cl_dentry)) | 239 | break; |
| 240 | if (rpc_clnt_skip_event(clnt, event)) | ||
| 241 | continue; | ||
| 242 | if (atomic_inc_not_zero(&clnt->cl_count) == 0) | ||
| 220 | continue; | 243 | continue; |
| 221 | atomic_inc(&clnt->cl_count); | ||
| 222 | spin_unlock(&sn->rpc_client_lock); | 244 | spin_unlock(&sn->rpc_client_lock); |
| 223 | return clnt; | 245 | return clnt; |
| 224 | } | 246 | } |
| @@ -257,6 +279,14 @@ void rpc_clients_notifier_unregister(void) | |||
| 257 | return rpc_pipefs_notifier_unregister(&rpc_clients_block); | 279 | return rpc_pipefs_notifier_unregister(&rpc_clients_block); |
| 258 | } | 280 | } |
| 259 | 281 | ||
| 282 | static void rpc_clnt_set_nodename(struct rpc_clnt *clnt, const char *nodename) | ||
| 283 | { | ||
| 284 | clnt->cl_nodelen = strlen(nodename); | ||
| 285 | if (clnt->cl_nodelen > UNX_MAXNODENAME) | ||
| 286 | clnt->cl_nodelen = UNX_MAXNODENAME; | ||
| 287 | memcpy(clnt->cl_nodename, nodename, clnt->cl_nodelen); | ||
| 288 | } | ||
| 289 | |||
| 260 | static struct rpc_clnt * rpc_new_client(const struct rpc_create_args *args, struct rpc_xprt *xprt) | 290 | static struct rpc_clnt * rpc_new_client(const struct rpc_create_args *args, struct rpc_xprt *xprt) |
| 261 | { | 291 | { |
| 262 | const struct rpc_program *program = args->program; | 292 | const struct rpc_program *program = args->program; |
| @@ -337,10 +367,7 @@ static struct rpc_clnt * rpc_new_client(const struct rpc_create_args *args, stru | |||
| 337 | } | 367 | } |
| 338 | 368 | ||
| 339 | /* save the nodename */ | 369 | /* save the nodename */ |
| 340 | clnt->cl_nodelen = strlen(init_utsname()->nodename); | 370 | rpc_clnt_set_nodename(clnt, utsname()->nodename); |
| 341 | if (clnt->cl_nodelen > UNX_MAXNODENAME) | ||
| 342 | clnt->cl_nodelen = UNX_MAXNODENAME; | ||
| 343 | memcpy(clnt->cl_nodename, init_utsname()->nodename, clnt->cl_nodelen); | ||
| 344 | rpc_register_client(clnt); | 371 | rpc_register_client(clnt); |
| 345 | return clnt; | 372 | return clnt; |
| 346 | 373 | ||
| @@ -499,6 +526,7 @@ rpc_clone_client(struct rpc_clnt *clnt) | |||
| 499 | err = rpc_setup_pipedir(new, clnt->cl_program->pipe_dir_name); | 526 | err = rpc_setup_pipedir(new, clnt->cl_program->pipe_dir_name); |
| 500 | if (err != 0) | 527 | if (err != 0) |
| 501 | goto out_no_path; | 528 | goto out_no_path; |
| 529 | rpc_clnt_set_nodename(new, utsname()->nodename); | ||
| 502 | if (new->cl_auth) | 530 | if (new->cl_auth) |
| 503 | atomic_inc(&new->cl_auth->au_count); | 531 | atomic_inc(&new->cl_auth->au_count); |
| 504 | atomic_inc(&clnt->cl_count); | 532 | atomic_inc(&clnt->cl_count); |
diff --git a/net/sunrpc/rpc_pipe.c b/net/sunrpc/rpc_pipe.c index 0af37fc46818..3b62cf288031 100644 --- a/net/sunrpc/rpc_pipe.c +++ b/net/sunrpc/rpc_pipe.c | |||
| @@ -1126,19 +1126,20 @@ rpc_fill_super(struct super_block *sb, void *data, int silent) | |||
| 1126 | return -ENOMEM; | 1126 | return -ENOMEM; |
| 1127 | dprintk("RPC: sending pipefs MOUNT notification for net %p%s\n", net, | 1127 | dprintk("RPC: sending pipefs MOUNT notification for net %p%s\n", net, |
| 1128 | NET_NAME(net)); | 1128 | NET_NAME(net)); |
| 1129 | sn->pipefs_sb = sb; | ||
| 1129 | err = blocking_notifier_call_chain(&rpc_pipefs_notifier_list, | 1130 | err = blocking_notifier_call_chain(&rpc_pipefs_notifier_list, |
| 1130 | RPC_PIPEFS_MOUNT, | 1131 | RPC_PIPEFS_MOUNT, |
| 1131 | sb); | 1132 | sb); |
| 1132 | if (err) | 1133 | if (err) |
| 1133 | goto err_depopulate; | 1134 | goto err_depopulate; |
| 1134 | sb->s_fs_info = get_net(net); | 1135 | sb->s_fs_info = get_net(net); |
| 1135 | sn->pipefs_sb = sb; | ||
| 1136 | return 0; | 1136 | return 0; |
| 1137 | 1137 | ||
| 1138 | err_depopulate: | 1138 | err_depopulate: |
| 1139 | blocking_notifier_call_chain(&rpc_pipefs_notifier_list, | 1139 | blocking_notifier_call_chain(&rpc_pipefs_notifier_list, |
| 1140 | RPC_PIPEFS_UMOUNT, | 1140 | RPC_PIPEFS_UMOUNT, |
| 1141 | sb); | 1141 | sb); |
| 1142 | sn->pipefs_sb = NULL; | ||
| 1142 | __rpc_depopulate(root, files, RPCAUTH_lockd, RPCAUTH_RootEOF); | 1143 | __rpc_depopulate(root, files, RPCAUTH_lockd, RPCAUTH_RootEOF); |
| 1143 | return err; | 1144 | return err; |
| 1144 | } | 1145 | } |
diff --git a/net/sunrpc/sunrpc_syms.c b/net/sunrpc/sunrpc_syms.c index 8adfc88e793a..3d6498af9adc 100644 --- a/net/sunrpc/sunrpc_syms.c +++ b/net/sunrpc/sunrpc_syms.c | |||
| @@ -75,20 +75,21 @@ static struct pernet_operations sunrpc_net_ops = { | |||
| 75 | static int __init | 75 | static int __init |
| 76 | init_sunrpc(void) | 76 | init_sunrpc(void) |
| 77 | { | 77 | { |
| 78 | int err = register_rpc_pipefs(); | 78 | int err = rpc_init_mempool(); |
| 79 | if (err) | 79 | if (err) |
| 80 | goto out; | 80 | goto out; |
| 81 | err = rpc_init_mempool(); | ||
| 82 | if (err) | ||
| 83 | goto out2; | ||
| 84 | err = rpcauth_init_module(); | 81 | err = rpcauth_init_module(); |
| 85 | if (err) | 82 | if (err) |
| 86 | goto out3; | 83 | goto out2; |
| 87 | 84 | ||
| 88 | cache_initialize(); | 85 | cache_initialize(); |
| 89 | 86 | ||
| 90 | err = register_pernet_subsys(&sunrpc_net_ops); | 87 | err = register_pernet_subsys(&sunrpc_net_ops); |
| 91 | if (err) | 88 | if (err) |
| 89 | goto out3; | ||
| 90 | |||
| 91 | err = register_rpc_pipefs(); | ||
| 92 | if (err) | ||
| 92 | goto out4; | 93 | goto out4; |
| 93 | #ifdef RPC_DEBUG | 94 | #ifdef RPC_DEBUG |
| 94 | rpc_register_sysctl(); | 95 | rpc_register_sysctl(); |
| @@ -98,11 +99,11 @@ init_sunrpc(void) | |||
| 98 | return 0; | 99 | return 0; |
| 99 | 100 | ||
| 100 | out4: | 101 | out4: |
| 101 | rpcauth_remove_module(); | 102 | unregister_pernet_subsys(&sunrpc_net_ops); |
| 102 | out3: | 103 | out3: |
| 103 | rpc_destroy_mempool(); | 104 | rpcauth_remove_module(); |
| 104 | out2: | 105 | out2: |
| 105 | unregister_rpc_pipefs(); | 106 | rpc_destroy_mempool(); |
| 106 | out: | 107 | out: |
| 107 | return err; | 108 | return err; |
| 108 | } | 109 | } |
diff --git a/net/wireless/util.c b/net/wireless/util.c index 1b7a08df933c..957f25621617 100644 --- a/net/wireless/util.c +++ b/net/wireless/util.c | |||
| @@ -989,7 +989,7 @@ int cfg80211_can_change_interface(struct cfg80211_registered_device *rdev, | |||
| 989 | if (rdev->wiphy.software_iftypes & BIT(iftype)) | 989 | if (rdev->wiphy.software_iftypes & BIT(iftype)) |
| 990 | continue; | 990 | continue; |
| 991 | for (j = 0; j < c->n_limits; j++) { | 991 | for (j = 0; j < c->n_limits; j++) { |
| 992 | if (!(limits[j].types & iftype)) | 992 | if (!(limits[j].types & BIT(iftype))) |
| 993 | continue; | 993 | continue; |
| 994 | if (limits[j].max < num[iftype]) | 994 | if (limits[j].max < num[iftype]) |
| 995 | goto cont; | 995 | goto cont; |
