diff options
author | Tony Lindgren <tony@atomide.com> | 2010-03-01 17:19:05 -0500 |
---|---|---|
committer | Tony Lindgren <tony@atomide.com> | 2010-03-01 17:19:05 -0500 |
commit | d702d12167a2c05a346f49aac7a311d597762495 (patch) | |
tree | baae42c299cce34d6df24b5d01f8b1d0b481bd9a /net | |
parent | 9418c65f9bd861d0f7e39aab9cfb3aa6f2275d11 (diff) | |
parent | ac0f6f927db539e03e1f3f61bcd4ed57d5cde7a9 (diff) |
Merge with mainline to remove plat-omap/Kconfig conflict
Conflicts:
arch/arm/plat-omap/Kconfig
Diffstat (limited to 'net')
-rw-r--r-- | net/bluetooth/hidp/core.c | 17 | ||||
-rw-r--r-- | net/core/dev.c | 4 | ||||
-rw-r--r-- | net/core/ethtool.c | 1 | ||||
-rw-r--r-- | net/core/filter.c | 6 | ||||
-rw-r--r-- | net/core/net-sysfs.c | 3 | ||||
-rw-r--r-- | net/core/rtnetlink.c | 8 | ||||
-rw-r--r-- | net/core/sock.c | 3 | ||||
-rw-r--r-- | net/decnet/dn_route.c | 14 | ||||
-rw-r--r-- | net/ipv4/devinet.c | 7 | ||||
-rw-r--r-- | net/ipv4/igmp.c | 2 | ||||
-rw-r--r-- | net/ipv4/ipcomp.c | 6 | ||||
-rw-r--r-- | net/ipv4/route.c | 14 | ||||
-rw-r--r-- | net/ipv4/tcp_input.c | 6 | ||||
-rw-r--r-- | net/ipv6/addrconf.c | 16 | ||||
-rw-r--r-- | net/ipv6/ipcomp6.c | 6 | ||||
-rw-r--r-- | net/mac80211/ibss.c | 2 | ||||
-rw-r--r-- | net/mac80211/rate.c | 3 | ||||
-rw-r--r-- | net/mac80211/scan.c | 18 | ||||
-rw-r--r-- | net/packet/af_packet.c | 2 | ||||
-rw-r--r-- | net/xfrm/xfrm_algo.c | 16 | ||||
-rw-r--r-- | net/xfrm/xfrm_state.c | 12 |
21 files changed, 105 insertions, 61 deletions
diff --git a/net/bluetooth/hidp/core.c b/net/bluetooth/hidp/core.c index fc6ec1e7265..280529ad927 100644 --- a/net/bluetooth/hidp/core.c +++ b/net/bluetooth/hidp/core.c | |||
@@ -313,10 +313,21 @@ static int hidp_send_report(struct hidp_session *session, struct hid_report *rep | |||
313 | return hidp_queue_report(session, buf, rsize); | 313 | return hidp_queue_report(session, buf, rsize); |
314 | } | 314 | } |
315 | 315 | ||
316 | static int hidp_output_raw_report(struct hid_device *hid, unsigned char *data, size_t count) | 316 | static int hidp_output_raw_report(struct hid_device *hid, unsigned char *data, size_t count, |
317 | unsigned char report_type) | ||
317 | { | 318 | { |
318 | if (hidp_send_ctrl_message(hid->driver_data, | 319 | switch (report_type) { |
319 | HIDP_TRANS_SET_REPORT | HIDP_DATA_RTYPE_FEATURE, | 320 | case HID_FEATURE_REPORT: |
321 | report_type = HIDP_TRANS_SET_REPORT | HIDP_DATA_RTYPE_FEATURE; | ||
322 | break; | ||
323 | case HID_OUTPUT_REPORT: | ||
324 | report_type = HIDP_TRANS_DATA | HIDP_DATA_RTYPE_OUPUT; | ||
325 | break; | ||
326 | default: | ||
327 | return -EINVAL; | ||
328 | } | ||
329 | |||
330 | if (hidp_send_ctrl_message(hid->driver_data, report_type, | ||
320 | data, count)) | 331 | data, count)) |
321 | return -ENOMEM; | 332 | return -ENOMEM; |
322 | return count; | 333 | return count; |
diff --git a/net/core/dev.c b/net/core/dev.c index be9924f60ec..bb1f1da2b8a 100644 --- a/net/core/dev.c +++ b/net/core/dev.c | |||
@@ -2041,7 +2041,7 @@ gso: | |||
2041 | rcu_read_lock_bh(); | 2041 | rcu_read_lock_bh(); |
2042 | 2042 | ||
2043 | txq = dev_pick_tx(dev, skb); | 2043 | txq = dev_pick_tx(dev, skb); |
2044 | q = rcu_dereference(txq->qdisc); | 2044 | q = rcu_dereference_bh(txq->qdisc); |
2045 | 2045 | ||
2046 | #ifdef CONFIG_NET_CLS_ACT | 2046 | #ifdef CONFIG_NET_CLS_ACT |
2047 | skb->tc_verd = SET_TC_AT(skb->tc_verd, AT_EGRESS); | 2047 | skb->tc_verd = SET_TC_AT(skb->tc_verd, AT_EGRESS); |
@@ -2761,7 +2761,7 @@ gro_result_t napi_frags_finish(struct napi_struct *napi, struct sk_buff *skb, | |||
2761 | switch (ret) { | 2761 | switch (ret) { |
2762 | case GRO_NORMAL: | 2762 | case GRO_NORMAL: |
2763 | case GRO_HELD: | 2763 | case GRO_HELD: |
2764 | skb->protocol = eth_type_trans(skb, napi->dev); | 2764 | skb->protocol = eth_type_trans(skb, skb->dev); |
2765 | 2765 | ||
2766 | if (ret == GRO_HELD) | 2766 | if (ret == GRO_HELD) |
2767 | skb_gro_pull(skb, -ETH_HLEN); | 2767 | skb_gro_pull(skb, -ETH_HLEN); |
diff --git a/net/core/ethtool.c b/net/core/ethtool.c index d8aee584e8d..236a9988ea9 100644 --- a/net/core/ethtool.c +++ b/net/core/ethtool.c | |||
@@ -927,6 +927,7 @@ int dev_ethtool(struct net *net, struct ifreq *ifr) | |||
927 | case ETHTOOL_GPERMADDR: | 927 | case ETHTOOL_GPERMADDR: |
928 | case ETHTOOL_GUFO: | 928 | case ETHTOOL_GUFO: |
929 | case ETHTOOL_GGSO: | 929 | case ETHTOOL_GGSO: |
930 | case ETHTOOL_GGRO: | ||
930 | case ETHTOOL_GFLAGS: | 931 | case ETHTOOL_GFLAGS: |
931 | case ETHTOOL_GPFLAGS: | 932 | case ETHTOOL_GPFLAGS: |
932 | case ETHTOOL_GRXFH: | 933 | case ETHTOOL_GRXFH: |
diff --git a/net/core/filter.c b/net/core/filter.c index 08db7b9143a..3541aa48d21 100644 --- a/net/core/filter.c +++ b/net/core/filter.c | |||
@@ -86,7 +86,7 @@ int sk_filter(struct sock *sk, struct sk_buff *skb) | |||
86 | return err; | 86 | return err; |
87 | 87 | ||
88 | rcu_read_lock_bh(); | 88 | rcu_read_lock_bh(); |
89 | filter = rcu_dereference(sk->sk_filter); | 89 | filter = rcu_dereference_bh(sk->sk_filter); |
90 | if (filter) { | 90 | if (filter) { |
91 | unsigned int pkt_len = sk_run_filter(skb, filter->insns, | 91 | unsigned int pkt_len = sk_run_filter(skb, filter->insns, |
92 | filter->len); | 92 | filter->len); |
@@ -521,7 +521,7 @@ int sk_attach_filter(struct sock_fprog *fprog, struct sock *sk) | |||
521 | } | 521 | } |
522 | 522 | ||
523 | rcu_read_lock_bh(); | 523 | rcu_read_lock_bh(); |
524 | old_fp = rcu_dereference(sk->sk_filter); | 524 | old_fp = rcu_dereference_bh(sk->sk_filter); |
525 | rcu_assign_pointer(sk->sk_filter, fp); | 525 | rcu_assign_pointer(sk->sk_filter, fp); |
526 | rcu_read_unlock_bh(); | 526 | rcu_read_unlock_bh(); |
527 | 527 | ||
@@ -536,7 +536,7 @@ int sk_detach_filter(struct sock *sk) | |||
536 | struct sk_filter *filter; | 536 | struct sk_filter *filter; |
537 | 537 | ||
538 | rcu_read_lock_bh(); | 538 | rcu_read_lock_bh(); |
539 | filter = rcu_dereference(sk->sk_filter); | 539 | filter = rcu_dereference_bh(sk->sk_filter); |
540 | if (filter) { | 540 | if (filter) { |
541 | rcu_assign_pointer(sk->sk_filter, NULL); | 541 | rcu_assign_pointer(sk->sk_filter, NULL); |
542 | sk_filter_delayed_uncharge(sk, filter); | 542 | sk_filter_delayed_uncharge(sk, filter); |
diff --git a/net/core/net-sysfs.c b/net/core/net-sysfs.c index fbc1c7472c5..099c753c421 100644 --- a/net/core/net-sysfs.c +++ b/net/core/net-sysfs.c | |||
@@ -410,7 +410,8 @@ static ssize_t wireless_show(struct device *d, char *buf, | |||
410 | const struct iw_statistics *iw; | 410 | const struct iw_statistics *iw; |
411 | ssize_t ret = -EINVAL; | 411 | ssize_t ret = -EINVAL; |
412 | 412 | ||
413 | rtnl_lock(); | 413 | if (!rtnl_trylock()) |
414 | return restart_syscall(); | ||
414 | if (dev_isalive(dev)) { | 415 | if (dev_isalive(dev)) { |
415 | iw = get_wireless_stats(dev); | 416 | iw = get_wireless_stats(dev); |
416 | if (iw) | 417 | if (iw) |
diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c index 794bcb897ff..4c7d3f635ba 100644 --- a/net/core/rtnetlink.c +++ b/net/core/rtnetlink.c | |||
@@ -89,6 +89,14 @@ int rtnl_is_locked(void) | |||
89 | } | 89 | } |
90 | EXPORT_SYMBOL(rtnl_is_locked); | 90 | EXPORT_SYMBOL(rtnl_is_locked); |
91 | 91 | ||
92 | #ifdef CONFIG_PROVE_LOCKING | ||
93 | int lockdep_rtnl_is_held(void) | ||
94 | { | ||
95 | return lockdep_is_held(&rtnl_mutex); | ||
96 | } | ||
97 | EXPORT_SYMBOL(lockdep_rtnl_is_held); | ||
98 | #endif /* #ifdef CONFIG_PROVE_LOCKING */ | ||
99 | |||
92 | static struct rtnl_link *rtnl_msg_handlers[NPROTO]; | 100 | static struct rtnl_link *rtnl_msg_handlers[NPROTO]; |
93 | 101 | ||
94 | static inline int rtm_msgindex(int msgtype) | 102 | static inline int rtm_msgindex(int msgtype) |
diff --git a/net/core/sock.c b/net/core/sock.c index e1f6f225f01..305cba401ae 100644 --- a/net/core/sock.c +++ b/net/core/sock.c | |||
@@ -1073,7 +1073,8 @@ static void __sk_free(struct sock *sk) | |||
1073 | if (sk->sk_destruct) | 1073 | if (sk->sk_destruct) |
1074 | sk->sk_destruct(sk); | 1074 | sk->sk_destruct(sk); |
1075 | 1075 | ||
1076 | filter = rcu_dereference(sk->sk_filter); | 1076 | filter = rcu_dereference_check(sk->sk_filter, |
1077 | atomic_read(&sk->sk_wmem_alloc) == 0); | ||
1077 | if (filter) { | 1078 | if (filter) { |
1078 | sk_filter_uncharge(sk, filter); | 1079 | sk_filter_uncharge(sk, filter); |
1079 | rcu_assign_pointer(sk->sk_filter, NULL); | 1080 | rcu_assign_pointer(sk->sk_filter, NULL); |
diff --git a/net/decnet/dn_route.c b/net/decnet/dn_route.c index a03284061a3..a7bf03ca0a3 100644 --- a/net/decnet/dn_route.c +++ b/net/decnet/dn_route.c | |||
@@ -1155,8 +1155,8 @@ static int __dn_route_output_key(struct dst_entry **pprt, const struct flowi *fl | |||
1155 | 1155 | ||
1156 | if (!(flags & MSG_TRYHARD)) { | 1156 | if (!(flags & MSG_TRYHARD)) { |
1157 | rcu_read_lock_bh(); | 1157 | rcu_read_lock_bh(); |
1158 | for(rt = rcu_dereference(dn_rt_hash_table[hash].chain); rt; | 1158 | for (rt = rcu_dereference_bh(dn_rt_hash_table[hash].chain); rt; |
1159 | rt = rcu_dereference(rt->u.dst.dn_next)) { | 1159 | rt = rcu_dereference_bh(rt->u.dst.dn_next)) { |
1160 | if ((flp->fld_dst == rt->fl.fld_dst) && | 1160 | if ((flp->fld_dst == rt->fl.fld_dst) && |
1161 | (flp->fld_src == rt->fl.fld_src) && | 1161 | (flp->fld_src == rt->fl.fld_src) && |
1162 | (flp->mark == rt->fl.mark) && | 1162 | (flp->mark == rt->fl.mark) && |
@@ -1618,9 +1618,9 @@ int dn_cache_dump(struct sk_buff *skb, struct netlink_callback *cb) | |||
1618 | if (h > s_h) | 1618 | if (h > s_h) |
1619 | s_idx = 0; | 1619 | s_idx = 0; |
1620 | rcu_read_lock_bh(); | 1620 | rcu_read_lock_bh(); |
1621 | for(rt = rcu_dereference(dn_rt_hash_table[h].chain), idx = 0; | 1621 | for(rt = rcu_dereference_bh(dn_rt_hash_table[h].chain), idx = 0; |
1622 | rt; | 1622 | rt; |
1623 | rt = rcu_dereference(rt->u.dst.dn_next), idx++) { | 1623 | rt = rcu_dereference_bh(rt->u.dst.dn_next), idx++) { |
1624 | if (idx < s_idx) | 1624 | if (idx < s_idx) |
1625 | continue; | 1625 | continue; |
1626 | skb_dst_set(skb, dst_clone(&rt->u.dst)); | 1626 | skb_dst_set(skb, dst_clone(&rt->u.dst)); |
@@ -1654,12 +1654,12 @@ static struct dn_route *dn_rt_cache_get_first(struct seq_file *seq) | |||
1654 | 1654 | ||
1655 | for(s->bucket = dn_rt_hash_mask; s->bucket >= 0; --s->bucket) { | 1655 | for(s->bucket = dn_rt_hash_mask; s->bucket >= 0; --s->bucket) { |
1656 | rcu_read_lock_bh(); | 1656 | rcu_read_lock_bh(); |
1657 | rt = dn_rt_hash_table[s->bucket].chain; | 1657 | rt = rcu_dereference_bh(dn_rt_hash_table[s->bucket].chain); |
1658 | if (rt) | 1658 | if (rt) |
1659 | break; | 1659 | break; |
1660 | rcu_read_unlock_bh(); | 1660 | rcu_read_unlock_bh(); |
1661 | } | 1661 | } |
1662 | return rcu_dereference(rt); | 1662 | return rt; |
1663 | } | 1663 | } |
1664 | 1664 | ||
1665 | static struct dn_route *dn_rt_cache_get_next(struct seq_file *seq, struct dn_route *rt) | 1665 | static struct dn_route *dn_rt_cache_get_next(struct seq_file *seq, struct dn_route *rt) |
@@ -1674,7 +1674,7 @@ static struct dn_route *dn_rt_cache_get_next(struct seq_file *seq, struct dn_rou | |||
1674 | rcu_read_lock_bh(); | 1674 | rcu_read_lock_bh(); |
1675 | rt = dn_rt_hash_table[s->bucket].chain; | 1675 | rt = dn_rt_hash_table[s->bucket].chain; |
1676 | } | 1676 | } |
1677 | return rcu_dereference(rt); | 1677 | return rcu_dereference_bh(rt); |
1678 | } | 1678 | } |
1679 | 1679 | ||
1680 | static void *dn_rt_cache_seq_start(struct seq_file *seq, loff_t *pos) | 1680 | static void *dn_rt_cache_seq_start(struct seq_file *seq, loff_t *pos) |
diff --git a/net/ipv4/devinet.c b/net/ipv4/devinet.c index 040c4f05b65..26dec2be961 100644 --- a/net/ipv4/devinet.c +++ b/net/ipv4/devinet.c | |||
@@ -1317,14 +1317,19 @@ static int devinet_sysctl_forward(ctl_table *ctl, int write, | |||
1317 | { | 1317 | { |
1318 | int *valp = ctl->data; | 1318 | int *valp = ctl->data; |
1319 | int val = *valp; | 1319 | int val = *valp; |
1320 | loff_t pos = *ppos; | ||
1320 | int ret = proc_dointvec(ctl, write, buffer, lenp, ppos); | 1321 | int ret = proc_dointvec(ctl, write, buffer, lenp, ppos); |
1321 | 1322 | ||
1322 | if (write && *valp != val) { | 1323 | if (write && *valp != val) { |
1323 | struct net *net = ctl->extra2; | 1324 | struct net *net = ctl->extra2; |
1324 | 1325 | ||
1325 | if (valp != &IPV4_DEVCONF_DFLT(net, FORWARDING)) { | 1326 | if (valp != &IPV4_DEVCONF_DFLT(net, FORWARDING)) { |
1326 | if (!rtnl_trylock()) | 1327 | if (!rtnl_trylock()) { |
1328 | /* Restore the original values before restarting */ | ||
1329 | *valp = val; | ||
1330 | *ppos = pos; | ||
1327 | return restart_syscall(); | 1331 | return restart_syscall(); |
1332 | } | ||
1328 | if (valp == &IPV4_DEVCONF_ALL(net, FORWARDING)) { | 1333 | if (valp == &IPV4_DEVCONF_ALL(net, FORWARDING)) { |
1329 | inet_forward_change(net); | 1334 | inet_forward_change(net); |
1330 | } else if (*valp) { | 1335 | } else if (*valp) { |
diff --git a/net/ipv4/igmp.c b/net/ipv4/igmp.c index 76c08402c93..a42f658e756 100644 --- a/net/ipv4/igmp.c +++ b/net/ipv4/igmp.c | |||
@@ -946,7 +946,6 @@ int igmp_rcv(struct sk_buff *skb) | |||
946 | break; | 946 | break; |
947 | case IGMP_HOST_MEMBERSHIP_REPORT: | 947 | case IGMP_HOST_MEMBERSHIP_REPORT: |
948 | case IGMPV2_HOST_MEMBERSHIP_REPORT: | 948 | case IGMPV2_HOST_MEMBERSHIP_REPORT: |
949 | case IGMPV3_HOST_MEMBERSHIP_REPORT: | ||
950 | /* Is it our report looped back? */ | 949 | /* Is it our report looped back? */ |
951 | if (skb_rtable(skb)->fl.iif == 0) | 950 | if (skb_rtable(skb)->fl.iif == 0) |
952 | break; | 951 | break; |
@@ -960,6 +959,7 @@ int igmp_rcv(struct sk_buff *skb) | |||
960 | in_dev_put(in_dev); | 959 | in_dev_put(in_dev); |
961 | return pim_rcv_v1(skb); | 960 | return pim_rcv_v1(skb); |
962 | #endif | 961 | #endif |
962 | case IGMPV3_HOST_MEMBERSHIP_REPORT: | ||
963 | case IGMP_DVMRP: | 963 | case IGMP_DVMRP: |
964 | case IGMP_TRACE: | 964 | case IGMP_TRACE: |
965 | case IGMP_HOST_LEAVE_MESSAGE: | 965 | case IGMP_HOST_LEAVE_MESSAGE: |
diff --git a/net/ipv4/ipcomp.c b/net/ipv4/ipcomp.c index 38fbf04150a..544ce0876f1 100644 --- a/net/ipv4/ipcomp.c +++ b/net/ipv4/ipcomp.c | |||
@@ -124,16 +124,12 @@ static int ipcomp4_init_state(struct xfrm_state *x) | |||
124 | if (x->props.mode == XFRM_MODE_TUNNEL) { | 124 | if (x->props.mode == XFRM_MODE_TUNNEL) { |
125 | err = ipcomp_tunnel_attach(x); | 125 | err = ipcomp_tunnel_attach(x); |
126 | if (err) | 126 | if (err) |
127 | goto error_tunnel; | 127 | goto out; |
128 | } | 128 | } |
129 | 129 | ||
130 | err = 0; | 130 | err = 0; |
131 | out: | 131 | out: |
132 | return err; | 132 | return err; |
133 | |||
134 | error_tunnel: | ||
135 | ipcomp_destroy(x); | ||
136 | goto out; | ||
137 | } | 133 | } |
138 | 134 | ||
139 | static const struct xfrm_type ipcomp_type = { | 135 | static const struct xfrm_type ipcomp_type = { |
diff --git a/net/ipv4/route.c b/net/ipv4/route.c index d62b05d3338..4f11faa5c82 100644 --- a/net/ipv4/route.c +++ b/net/ipv4/route.c | |||
@@ -287,12 +287,12 @@ static struct rtable *rt_cache_get_first(struct seq_file *seq) | |||
287 | if (!rt_hash_table[st->bucket].chain) | 287 | if (!rt_hash_table[st->bucket].chain) |
288 | continue; | 288 | continue; |
289 | rcu_read_lock_bh(); | 289 | rcu_read_lock_bh(); |
290 | r = rcu_dereference(rt_hash_table[st->bucket].chain); | 290 | r = rcu_dereference_bh(rt_hash_table[st->bucket].chain); |
291 | while (r) { | 291 | while (r) { |
292 | if (dev_net(r->u.dst.dev) == seq_file_net(seq) && | 292 | if (dev_net(r->u.dst.dev) == seq_file_net(seq) && |
293 | r->rt_genid == st->genid) | 293 | r->rt_genid == st->genid) |
294 | return r; | 294 | return r; |
295 | r = rcu_dereference(r->u.dst.rt_next); | 295 | r = rcu_dereference_bh(r->u.dst.rt_next); |
296 | } | 296 | } |
297 | rcu_read_unlock_bh(); | 297 | rcu_read_unlock_bh(); |
298 | } | 298 | } |
@@ -314,7 +314,7 @@ static struct rtable *__rt_cache_get_next(struct seq_file *seq, | |||
314 | rcu_read_lock_bh(); | 314 | rcu_read_lock_bh(); |
315 | r = rt_hash_table[st->bucket].chain; | 315 | r = rt_hash_table[st->bucket].chain; |
316 | } | 316 | } |
317 | return rcu_dereference(r); | 317 | return rcu_dereference_bh(r); |
318 | } | 318 | } |
319 | 319 | ||
320 | static struct rtable *rt_cache_get_next(struct seq_file *seq, | 320 | static struct rtable *rt_cache_get_next(struct seq_file *seq, |
@@ -2689,8 +2689,8 @@ int __ip_route_output_key(struct net *net, struct rtable **rp, | |||
2689 | hash = rt_hash(flp->fl4_dst, flp->fl4_src, flp->oif, rt_genid(net)); | 2689 | hash = rt_hash(flp->fl4_dst, flp->fl4_src, flp->oif, rt_genid(net)); |
2690 | 2690 | ||
2691 | rcu_read_lock_bh(); | 2691 | rcu_read_lock_bh(); |
2692 | for (rth = rcu_dereference(rt_hash_table[hash].chain); rth; | 2692 | for (rth = rcu_dereference_bh(rt_hash_table[hash].chain); rth; |
2693 | rth = rcu_dereference(rth->u.dst.rt_next)) { | 2693 | rth = rcu_dereference_bh(rth->u.dst.rt_next)) { |
2694 | if (rth->fl.fl4_dst == flp->fl4_dst && | 2694 | if (rth->fl.fl4_dst == flp->fl4_dst && |
2695 | rth->fl.fl4_src == flp->fl4_src && | 2695 | rth->fl.fl4_src == flp->fl4_src && |
2696 | rth->fl.iif == 0 && | 2696 | rth->fl.iif == 0 && |
@@ -3008,8 +3008,8 @@ int ip_rt_dump(struct sk_buff *skb, struct netlink_callback *cb) | |||
3008 | if (!rt_hash_table[h].chain) | 3008 | if (!rt_hash_table[h].chain) |
3009 | continue; | 3009 | continue; |
3010 | rcu_read_lock_bh(); | 3010 | rcu_read_lock_bh(); |
3011 | for (rt = rcu_dereference(rt_hash_table[h].chain), idx = 0; rt; | 3011 | for (rt = rcu_dereference_bh(rt_hash_table[h].chain), idx = 0; rt; |
3012 | rt = rcu_dereference(rt->u.dst.rt_next), idx++) { | 3012 | rt = rcu_dereference_bh(rt->u.dst.rt_next), idx++) { |
3013 | if (!net_eq(dev_net(rt->u.dst.dev), net) || idx < s_idx) | 3013 | if (!net_eq(dev_net(rt->u.dst.dev), net) || idx < s_idx) |
3014 | continue; | 3014 | continue; |
3015 | if (rt_is_expired(rt)) | 3015 | if (rt_is_expired(rt)) |
diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c index 28e02963249..3fddc69cccc 100644 --- a/net/ipv4/tcp_input.c +++ b/net/ipv4/tcp_input.c | |||
@@ -5783,11 +5783,9 @@ int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb, | |||
5783 | 5783 | ||
5784 | /* tcp_ack considers this ACK as duplicate | 5784 | /* tcp_ack considers this ACK as duplicate |
5785 | * and does not calculate rtt. | 5785 | * and does not calculate rtt. |
5786 | * Fix it at least with timestamps. | 5786 | * Force it here. |
5787 | */ | 5787 | */ |
5788 | if (tp->rx_opt.saw_tstamp && | 5788 | tcp_ack_update_rtt(sk, 0, 0); |
5789 | tp->rx_opt.rcv_tsecr && !tp->srtt) | ||
5790 | tcp_ack_saw_tstamp(sk, 0); | ||
5791 | 5789 | ||
5792 | if (tp->rx_opt.tstamp_ok) | 5790 | if (tp->rx_opt.tstamp_ok) |
5793 | tp->advmss -= TCPOLEN_TSTAMP_ALIGNED; | 5791 | tp->advmss -= TCPOLEN_TSTAMP_ALIGNED; |
diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c index de7a194a64a..143791da062 100644 --- a/net/ipv6/addrconf.c +++ b/net/ipv6/addrconf.c | |||
@@ -502,8 +502,11 @@ static int addrconf_fixup_forwarding(struct ctl_table *table, int *p, int old) | |||
502 | if (p == &net->ipv6.devconf_dflt->forwarding) | 502 | if (p == &net->ipv6.devconf_dflt->forwarding) |
503 | return 0; | 503 | return 0; |
504 | 504 | ||
505 | if (!rtnl_trylock()) | 505 | if (!rtnl_trylock()) { |
506 | /* Restore the original values before restarting */ | ||
507 | *p = old; | ||
506 | return restart_syscall(); | 508 | return restart_syscall(); |
509 | } | ||
507 | 510 | ||
508 | if (p == &net->ipv6.devconf_all->forwarding) { | 511 | if (p == &net->ipv6.devconf_all->forwarding) { |
509 | __s32 newf = net->ipv6.devconf_all->forwarding; | 512 | __s32 newf = net->ipv6.devconf_all->forwarding; |
@@ -4028,12 +4031,15 @@ int addrconf_sysctl_forward(ctl_table *ctl, int write, | |||
4028 | { | 4031 | { |
4029 | int *valp = ctl->data; | 4032 | int *valp = ctl->data; |
4030 | int val = *valp; | 4033 | int val = *valp; |
4034 | loff_t pos = *ppos; | ||
4031 | int ret; | 4035 | int ret; |
4032 | 4036 | ||
4033 | ret = proc_dointvec(ctl, write, buffer, lenp, ppos); | 4037 | ret = proc_dointvec(ctl, write, buffer, lenp, ppos); |
4034 | 4038 | ||
4035 | if (write) | 4039 | if (write) |
4036 | ret = addrconf_fixup_forwarding(ctl, valp, val); | 4040 | ret = addrconf_fixup_forwarding(ctl, valp, val); |
4041 | if (ret) | ||
4042 | *ppos = pos; | ||
4037 | return ret; | 4043 | return ret; |
4038 | } | 4044 | } |
4039 | 4045 | ||
@@ -4075,8 +4081,11 @@ static int addrconf_disable_ipv6(struct ctl_table *table, int *p, int old) | |||
4075 | if (p == &net->ipv6.devconf_dflt->disable_ipv6) | 4081 | if (p == &net->ipv6.devconf_dflt->disable_ipv6) |
4076 | return 0; | 4082 | return 0; |
4077 | 4083 | ||
4078 | if (!rtnl_trylock()) | 4084 | if (!rtnl_trylock()) { |
4085 | /* Restore the original values before restarting */ | ||
4086 | *p = old; | ||
4079 | return restart_syscall(); | 4087 | return restart_syscall(); |
4088 | } | ||
4080 | 4089 | ||
4081 | if (p == &net->ipv6.devconf_all->disable_ipv6) { | 4090 | if (p == &net->ipv6.devconf_all->disable_ipv6) { |
4082 | __s32 newf = net->ipv6.devconf_all->disable_ipv6; | 4091 | __s32 newf = net->ipv6.devconf_all->disable_ipv6; |
@@ -4095,12 +4104,15 @@ int addrconf_sysctl_disable(ctl_table *ctl, int write, | |||
4095 | { | 4104 | { |
4096 | int *valp = ctl->data; | 4105 | int *valp = ctl->data; |
4097 | int val = *valp; | 4106 | int val = *valp; |
4107 | loff_t pos = *ppos; | ||
4098 | int ret; | 4108 | int ret; |
4099 | 4109 | ||
4100 | ret = proc_dointvec(ctl, write, buffer, lenp, ppos); | 4110 | ret = proc_dointvec(ctl, write, buffer, lenp, ppos); |
4101 | 4111 | ||
4102 | if (write) | 4112 | if (write) |
4103 | ret = addrconf_disable_ipv6(ctl, valp, val); | 4113 | ret = addrconf_disable_ipv6(ctl, valp, val); |
4114 | if (ret) | ||
4115 | *ppos = pos; | ||
4104 | return ret; | 4116 | return ret; |
4105 | } | 4117 | } |
4106 | 4118 | ||
diff --git a/net/ipv6/ipcomp6.c b/net/ipv6/ipcomp6.c index 2f2a5ca2c87..002e6eef912 100644 --- a/net/ipv6/ipcomp6.c +++ b/net/ipv6/ipcomp6.c | |||
@@ -154,16 +154,12 @@ static int ipcomp6_init_state(struct xfrm_state *x) | |||
154 | if (x->props.mode == XFRM_MODE_TUNNEL) { | 154 | if (x->props.mode == XFRM_MODE_TUNNEL) { |
155 | err = ipcomp6_tunnel_attach(x); | 155 | err = ipcomp6_tunnel_attach(x); |
156 | if (err) | 156 | if (err) |
157 | goto error_tunnel; | 157 | goto out; |
158 | } | 158 | } |
159 | 159 | ||
160 | err = 0; | 160 | err = 0; |
161 | out: | 161 | out: |
162 | return err; | 162 | return err; |
163 | error_tunnel: | ||
164 | ipcomp_destroy(x); | ||
165 | |||
166 | goto out; | ||
167 | } | 163 | } |
168 | 164 | ||
169 | static const struct xfrm_type ipcomp6_type = | 165 | static const struct xfrm_type ipcomp6_type = |
diff --git a/net/mac80211/ibss.c b/net/mac80211/ibss.c index 1f2db647bb5..22f0c2aa7a8 100644 --- a/net/mac80211/ibss.c +++ b/net/mac80211/ibss.c | |||
@@ -647,7 +647,7 @@ static void ieee80211_rx_mgmt_probe_req(struct ieee80211_sub_if_data *sdata, | |||
647 | } | 647 | } |
648 | if (pos[1] != 0 && | 648 | if (pos[1] != 0 && |
649 | (pos[1] != ifibss->ssid_len || | 649 | (pos[1] != ifibss->ssid_len || |
650 | !memcmp(pos + 2, ifibss->ssid, ifibss->ssid_len))) { | 650 | memcmp(pos + 2, ifibss->ssid, ifibss->ssid_len))) { |
651 | /* Ignore ProbeReq for foreign SSID */ | 651 | /* Ignore ProbeReq for foreign SSID */ |
652 | return; | 652 | return; |
653 | } | 653 | } |
diff --git a/net/mac80211/rate.c b/net/mac80211/rate.c index b9007f80cb9..12a2bff7dcd 100644 --- a/net/mac80211/rate.c +++ b/net/mac80211/rate.c | |||
@@ -245,6 +245,9 @@ void rate_control_get_rate(struct ieee80211_sub_if_data *sdata, | |||
245 | info->control.rates[i].count = 1; | 245 | info->control.rates[i].count = 1; |
246 | } | 246 | } |
247 | 247 | ||
248 | if (sdata->local->hw.flags & IEEE80211_HW_HAS_RATE_CONTROL) | ||
249 | return; | ||
250 | |||
248 | if (sta && sdata->force_unicast_rateidx > -1) { | 251 | if (sta && sdata->force_unicast_rateidx > -1) { |
249 | info->control.rates[0].idx = sdata->force_unicast_rateidx; | 252 | info->control.rates[0].idx = sdata->force_unicast_rateidx; |
250 | } else { | 253 | } else { |
diff --git a/net/mac80211/scan.c b/net/mac80211/scan.c index f934c9620b7..bc17cf7d68d 100644 --- a/net/mac80211/scan.c +++ b/net/mac80211/scan.c | |||
@@ -439,6 +439,16 @@ static int __ieee80211_start_scan(struct ieee80211_sub_if_data *sdata, | |||
439 | if (local->scan_req) | 439 | if (local->scan_req) |
440 | return -EBUSY; | 440 | return -EBUSY; |
441 | 441 | ||
442 | if (req != local->int_scan_req && | ||
443 | sdata->vif.type == NL80211_IFTYPE_STATION && | ||
444 | !list_empty(&ifmgd->work_list)) { | ||
445 | /* actually wait for the work it's doing to finish/time out */ | ||
446 | set_bit(IEEE80211_STA_REQ_SCAN, &ifmgd->request); | ||
447 | local->scan_req = req; | ||
448 | local->scan_sdata = sdata; | ||
449 | return 0; | ||
450 | } | ||
451 | |||
442 | if (local->ops->hw_scan) { | 452 | if (local->ops->hw_scan) { |
443 | u8 *ies; | 453 | u8 *ies; |
444 | 454 | ||
@@ -463,14 +473,6 @@ static int __ieee80211_start_scan(struct ieee80211_sub_if_data *sdata, | |||
463 | local->scan_req = req; | 473 | local->scan_req = req; |
464 | local->scan_sdata = sdata; | 474 | local->scan_sdata = sdata; |
465 | 475 | ||
466 | if (req != local->int_scan_req && | ||
467 | sdata->vif.type == NL80211_IFTYPE_STATION && | ||
468 | !list_empty(&ifmgd->work_list)) { | ||
469 | /* actually wait for the work it's doing to finish/time out */ | ||
470 | set_bit(IEEE80211_STA_REQ_SCAN, &ifmgd->request); | ||
471 | return 0; | ||
472 | } | ||
473 | |||
474 | if (local->ops->hw_scan) | 476 | if (local->ops->hw_scan) |
475 | __set_bit(SCAN_HW_SCANNING, &local->scanning); | 477 | __set_bit(SCAN_HW_SCANNING, &local->scanning); |
476 | else | 478 | else |
diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c index f126d18dbdc..939471ef8d5 100644 --- a/net/packet/af_packet.c +++ b/net/packet/af_packet.c | |||
@@ -508,7 +508,7 @@ static inline unsigned int run_filter(struct sk_buff *skb, struct sock *sk, | |||
508 | struct sk_filter *filter; | 508 | struct sk_filter *filter; |
509 | 509 | ||
510 | rcu_read_lock_bh(); | 510 | rcu_read_lock_bh(); |
511 | filter = rcu_dereference(sk->sk_filter); | 511 | filter = rcu_dereference_bh(sk->sk_filter); |
512 | if (filter != NULL) | 512 | if (filter != NULL) |
513 | res = sk_run_filter(skb, filter->insns, filter->len); | 513 | res = sk_run_filter(skb, filter->insns, filter->len); |
514 | rcu_read_unlock_bh(); | 514 | rcu_read_unlock_bh(); |
diff --git a/net/xfrm/xfrm_algo.c b/net/xfrm/xfrm_algo.c index 743c0134a6a..8b4d6e3246e 100644 --- a/net/xfrm/xfrm_algo.c +++ b/net/xfrm/xfrm_algo.c | |||
@@ -125,6 +125,22 @@ static struct xfrm_algo_desc aead_list[] = { | |||
125 | .sadb_alg_maxbits = 256 | 125 | .sadb_alg_maxbits = 256 |
126 | } | 126 | } |
127 | }, | 127 | }, |
128 | { | ||
129 | .name = "rfc4543(gcm(aes))", | ||
130 | |||
131 | .uinfo = { | ||
132 | .aead = { | ||
133 | .icv_truncbits = 128, | ||
134 | } | ||
135 | }, | ||
136 | |||
137 | .desc = { | ||
138 | .sadb_alg_id = SADB_X_EALG_NULL_AES_GMAC, | ||
139 | .sadb_alg_ivlen = 8, | ||
140 | .sadb_alg_minbits = 128, | ||
141 | .sadb_alg_maxbits = 256 | ||
142 | } | ||
143 | }, | ||
128 | }; | 144 | }; |
129 | 145 | ||
130 | static struct xfrm_algo_desc aalg_list[] = { | 146 | static struct xfrm_algo_desc aalg_list[] = { |
diff --git a/net/xfrm/xfrm_state.c b/net/xfrm/xfrm_state.c index b36cc344474..f445ea1c5f5 100644 --- a/net/xfrm/xfrm_state.c +++ b/net/xfrm/xfrm_state.c | |||
@@ -1102,7 +1102,7 @@ static struct xfrm_state *xfrm_state_clone(struct xfrm_state *orig, int *errp) | |||
1102 | int err = -ENOMEM; | 1102 | int err = -ENOMEM; |
1103 | struct xfrm_state *x = xfrm_state_alloc(net); | 1103 | struct xfrm_state *x = xfrm_state_alloc(net); |
1104 | if (!x) | 1104 | if (!x) |
1105 | goto error; | 1105 | goto out; |
1106 | 1106 | ||
1107 | memcpy(&x->id, &orig->id, sizeof(x->id)); | 1107 | memcpy(&x->id, &orig->id, sizeof(x->id)); |
1108 | memcpy(&x->sel, &orig->sel, sizeof(x->sel)); | 1108 | memcpy(&x->sel, &orig->sel, sizeof(x->sel)); |
@@ -1160,16 +1160,10 @@ static struct xfrm_state *xfrm_state_clone(struct xfrm_state *orig, int *errp) | |||
1160 | return x; | 1160 | return x; |
1161 | 1161 | ||
1162 | error: | 1162 | error: |
1163 | xfrm_state_put(x); | ||
1164 | out: | ||
1163 | if (errp) | 1165 | if (errp) |
1164 | *errp = err; | 1166 | *errp = err; |
1165 | if (x) { | ||
1166 | kfree(x->aalg); | ||
1167 | kfree(x->ealg); | ||
1168 | kfree(x->calg); | ||
1169 | kfree(x->encap); | ||
1170 | kfree(x->coaddr); | ||
1171 | } | ||
1172 | kfree(x); | ||
1173 | return NULL; | 1167 | return NULL; |
1174 | } | 1168 | } |
1175 | 1169 | ||