diff options
Diffstat (limited to 'net')
| -rw-r--r-- | net/batman-adv/soft-interface.c | 10 | ||||
| -rw-r--r-- | net/ceph/ceph_common.c | 1 | ||||
| -rw-r--r-- | net/ceph/messenger.c | 1 | ||||
| -rw-r--r-- | net/ceph/osd_client.c | 4 | ||||
| -rw-r--r-- | net/ceph/osdmap.c | 84 | ||||
| -rw-r--r-- | net/ipv6/ip6mr.c | 8 | ||||
| -rw-r--r-- | net/ipv6/route.c | 4 | ||||
| -rw-r--r-- | net/wireless/nl80211.c | 5 | ||||
| -rw-r--r-- | net/xfrm/xfrm_policy.c | 10 |
9 files changed, 72 insertions, 55 deletions
diff --git a/net/batman-adv/soft-interface.c b/net/batman-adv/soft-interface.c index 3e2f91ffa4e2..05dd35114a27 100644 --- a/net/batman-adv/soft-interface.c +++ b/net/batman-adv/soft-interface.c | |||
| @@ -565,7 +565,7 @@ static int interface_tx(struct sk_buff *skb, struct net_device *soft_iface) | |||
| 565 | struct orig_node *orig_node = NULL; | 565 | struct orig_node *orig_node = NULL; |
| 566 | int data_len = skb->len, ret; | 566 | int data_len = skb->len, ret; |
| 567 | short vid = -1; | 567 | short vid = -1; |
| 568 | bool do_bcast = false; | 568 | bool do_bcast; |
| 569 | 569 | ||
| 570 | if (atomic_read(&bat_priv->mesh_state) != MESH_ACTIVE) | 570 | if (atomic_read(&bat_priv->mesh_state) != MESH_ACTIVE) |
| 571 | goto dropped; | 571 | goto dropped; |
| @@ -598,15 +598,15 @@ static int interface_tx(struct sk_buff *skb, struct net_device *soft_iface) | |||
| 598 | tt_local_add(soft_iface, ethhdr->h_source); | 598 | tt_local_add(soft_iface, ethhdr->h_source); |
| 599 | 599 | ||
| 600 | orig_node = transtable_search(bat_priv, ethhdr->h_dest); | 600 | orig_node = transtable_search(bat_priv, ethhdr->h_dest); |
| 601 | if (is_multicast_ether_addr(ethhdr->h_dest) || | 601 | do_bcast = is_multicast_ether_addr(ethhdr->h_dest); |
| 602 | (orig_node && orig_node->gw_flags)) { | 602 | if (do_bcast || (orig_node && orig_node->gw_flags)) { |
| 603 | ret = gw_is_target(bat_priv, skb, orig_node); | 603 | ret = gw_is_target(bat_priv, skb, orig_node); |
| 604 | 604 | ||
| 605 | if (ret < 0) | 605 | if (ret < 0) |
| 606 | goto dropped; | 606 | goto dropped; |
| 607 | 607 | ||
| 608 | if (ret == 0) | 608 | if (ret) |
| 609 | do_bcast = true; | 609 | do_bcast = false; |
| 610 | } | 610 | } |
| 611 | 611 | ||
| 612 | /* ethernet packet should be broadcasted */ | 612 | /* ethernet packet should be broadcasted */ |
diff --git a/net/ceph/ceph_common.c b/net/ceph/ceph_common.c index 132963abc266..2883ea01e680 100644 --- a/net/ceph/ceph_common.c +++ b/net/ceph/ceph_common.c | |||
| @@ -232,6 +232,7 @@ void ceph_destroy_options(struct ceph_options *opt) | |||
| 232 | ceph_crypto_key_destroy(opt->key); | 232 | ceph_crypto_key_destroy(opt->key); |
| 233 | kfree(opt->key); | 233 | kfree(opt->key); |
| 234 | } | 234 | } |
| 235 | kfree(opt->mon_addr); | ||
| 235 | kfree(opt); | 236 | kfree(opt); |
| 236 | } | 237 | } |
| 237 | EXPORT_SYMBOL(ceph_destroy_options); | 238 | EXPORT_SYMBOL(ceph_destroy_options); |
diff --git a/net/ceph/messenger.c b/net/ceph/messenger.c index c340e2e0765b..9918e9eb276e 100644 --- a/net/ceph/messenger.c +++ b/net/ceph/messenger.c | |||
| @@ -2307,6 +2307,7 @@ struct ceph_msg *ceph_msg_new(int type, int front_len, gfp_t flags) | |||
| 2307 | m->front_max = front_len; | 2307 | m->front_max = front_len; |
| 2308 | m->front_is_vmalloc = false; | 2308 | m->front_is_vmalloc = false; |
| 2309 | m->more_to_follow = false; | 2309 | m->more_to_follow = false; |
| 2310 | m->ack_stamp = 0; | ||
| 2310 | m->pool = NULL; | 2311 | m->pool = NULL; |
| 2311 | 2312 | ||
| 2312 | /* middle */ | 2313 | /* middle */ |
diff --git a/net/ceph/osd_client.c b/net/ceph/osd_client.c index 16836a7df7a6..88ad8a2501b5 100644 --- a/net/ceph/osd_client.c +++ b/net/ceph/osd_client.c | |||
| @@ -217,6 +217,7 @@ struct ceph_osd_request *ceph_osdc_alloc_request(struct ceph_osd_client *osdc, | |||
| 217 | INIT_LIST_HEAD(&req->r_unsafe_item); | 217 | INIT_LIST_HEAD(&req->r_unsafe_item); |
| 218 | INIT_LIST_HEAD(&req->r_linger_item); | 218 | INIT_LIST_HEAD(&req->r_linger_item); |
| 219 | INIT_LIST_HEAD(&req->r_linger_osd); | 219 | INIT_LIST_HEAD(&req->r_linger_osd); |
| 220 | INIT_LIST_HEAD(&req->r_req_lru_item); | ||
| 220 | req->r_flags = flags; | 221 | req->r_flags = flags; |
| 221 | 222 | ||
| 222 | WARN_ON((flags & (CEPH_OSD_FLAG_READ|CEPH_OSD_FLAG_WRITE)) == 0); | 223 | WARN_ON((flags & (CEPH_OSD_FLAG_READ|CEPH_OSD_FLAG_WRITE)) == 0); |
| @@ -816,13 +817,10 @@ static void __register_request(struct ceph_osd_client *osdc, | |||
| 816 | { | 817 | { |
| 817 | req->r_tid = ++osdc->last_tid; | 818 | req->r_tid = ++osdc->last_tid; |
| 818 | req->r_request->hdr.tid = cpu_to_le64(req->r_tid); | 819 | req->r_request->hdr.tid = cpu_to_le64(req->r_tid); |
| 819 | INIT_LIST_HEAD(&req->r_req_lru_item); | ||
| 820 | |||
| 821 | dout("__register_request %p tid %lld\n", req, req->r_tid); | 820 | dout("__register_request %p tid %lld\n", req, req->r_tid); |
| 822 | __insert_request(osdc, req); | 821 | __insert_request(osdc, req); |
| 823 | ceph_osdc_get_request(req); | 822 | ceph_osdc_get_request(req); |
| 824 | osdc->num_requests++; | 823 | osdc->num_requests++; |
| 825 | |||
| 826 | if (osdc->num_requests == 1) { | 824 | if (osdc->num_requests == 1) { |
| 827 | dout(" first request, scheduling timeout\n"); | 825 | dout(" first request, scheduling timeout\n"); |
| 828 | __schedule_osd_timeout(osdc); | 826 | __schedule_osd_timeout(osdc); |
diff --git a/net/ceph/osdmap.c b/net/ceph/osdmap.c index e97c3588c3ec..fd863fe76934 100644 --- a/net/ceph/osdmap.c +++ b/net/ceph/osdmap.c | |||
| @@ -339,6 +339,7 @@ static int __insert_pg_mapping(struct ceph_pg_mapping *new, | |||
| 339 | struct ceph_pg_mapping *pg = NULL; | 339 | struct ceph_pg_mapping *pg = NULL; |
| 340 | int c; | 340 | int c; |
| 341 | 341 | ||
| 342 | dout("__insert_pg_mapping %llx %p\n", *(u64 *)&new->pgid, new); | ||
| 342 | while (*p) { | 343 | while (*p) { |
| 343 | parent = *p; | 344 | parent = *p; |
| 344 | pg = rb_entry(parent, struct ceph_pg_mapping, node); | 345 | pg = rb_entry(parent, struct ceph_pg_mapping, node); |
| @@ -366,16 +367,33 @@ static struct ceph_pg_mapping *__lookup_pg_mapping(struct rb_root *root, | |||
| 366 | while (n) { | 367 | while (n) { |
| 367 | pg = rb_entry(n, struct ceph_pg_mapping, node); | 368 | pg = rb_entry(n, struct ceph_pg_mapping, node); |
| 368 | c = pgid_cmp(pgid, pg->pgid); | 369 | c = pgid_cmp(pgid, pg->pgid); |
| 369 | if (c < 0) | 370 | if (c < 0) { |
| 370 | n = n->rb_left; | 371 | n = n->rb_left; |
| 371 | else if (c > 0) | 372 | } else if (c > 0) { |
| 372 | n = n->rb_right; | 373 | n = n->rb_right; |
| 373 | else | 374 | } else { |
| 375 | dout("__lookup_pg_mapping %llx got %p\n", | ||
| 376 | *(u64 *)&pgid, pg); | ||
| 374 | return pg; | 377 | return pg; |
| 378 | } | ||
| 375 | } | 379 | } |
| 376 | return NULL; | 380 | return NULL; |
| 377 | } | 381 | } |
| 378 | 382 | ||
| 383 | static int __remove_pg_mapping(struct rb_root *root, struct ceph_pg pgid) | ||
| 384 | { | ||
| 385 | struct ceph_pg_mapping *pg = __lookup_pg_mapping(root, pgid); | ||
| 386 | |||
| 387 | if (pg) { | ||
| 388 | dout("__remove_pg_mapping %llx %p\n", *(u64 *)&pgid, pg); | ||
| 389 | rb_erase(&pg->node, root); | ||
| 390 | kfree(pg); | ||
| 391 | return 0; | ||
| 392 | } | ||
| 393 | dout("__remove_pg_mapping %llx dne\n", *(u64 *)&pgid); | ||
| 394 | return -ENOENT; | ||
| 395 | } | ||
| 396 | |||
| 379 | /* | 397 | /* |
| 380 | * rbtree of pg pool info | 398 | * rbtree of pg pool info |
| 381 | */ | 399 | */ |
| @@ -711,7 +729,6 @@ struct ceph_osdmap *osdmap_apply_incremental(void **p, void *end, | |||
| 711 | void *start = *p; | 729 | void *start = *p; |
| 712 | int err = -EINVAL; | 730 | int err = -EINVAL; |
| 713 | u16 version; | 731 | u16 version; |
| 714 | struct rb_node *rbp; | ||
| 715 | 732 | ||
| 716 | ceph_decode_16_safe(p, end, version, bad); | 733 | ceph_decode_16_safe(p, end, version, bad); |
| 717 | if (version > CEPH_OSDMAP_INC_VERSION) { | 734 | if (version > CEPH_OSDMAP_INC_VERSION) { |
| @@ -861,7 +878,6 @@ struct ceph_osdmap *osdmap_apply_incremental(void **p, void *end, | |||
| 861 | } | 878 | } |
| 862 | 879 | ||
| 863 | /* new_pg_temp */ | 880 | /* new_pg_temp */ |
| 864 | rbp = rb_first(&map->pg_temp); | ||
| 865 | ceph_decode_32_safe(p, end, len, bad); | 881 | ceph_decode_32_safe(p, end, len, bad); |
| 866 | while (len--) { | 882 | while (len--) { |
| 867 | struct ceph_pg_mapping *pg; | 883 | struct ceph_pg_mapping *pg; |
| @@ -872,18 +888,6 @@ struct ceph_osdmap *osdmap_apply_incremental(void **p, void *end, | |||
| 872 | ceph_decode_copy(p, &pgid, sizeof(pgid)); | 888 | ceph_decode_copy(p, &pgid, sizeof(pgid)); |
| 873 | pglen = ceph_decode_32(p); | 889 | pglen = ceph_decode_32(p); |
| 874 | 890 | ||
| 875 | /* remove any? */ | ||
| 876 | while (rbp && pgid_cmp(rb_entry(rbp, struct ceph_pg_mapping, | ||
| 877 | node)->pgid, pgid) <= 0) { | ||
| 878 | struct ceph_pg_mapping *cur = | ||
| 879 | rb_entry(rbp, struct ceph_pg_mapping, node); | ||
| 880 | |||
| 881 | rbp = rb_next(rbp); | ||
| 882 | dout(" removed pg_temp %llx\n", *(u64 *)&cur->pgid); | ||
| 883 | rb_erase(&cur->node, &map->pg_temp); | ||
| 884 | kfree(cur); | ||
| 885 | } | ||
| 886 | |||
| 887 | if (pglen) { | 891 | if (pglen) { |
| 888 | /* insert */ | 892 | /* insert */ |
| 889 | ceph_decode_need(p, end, pglen*sizeof(u32), bad); | 893 | ceph_decode_need(p, end, pglen*sizeof(u32), bad); |
| @@ -903,17 +907,11 @@ struct ceph_osdmap *osdmap_apply_incremental(void **p, void *end, | |||
| 903 | } | 907 | } |
| 904 | dout(" added pg_temp %llx len %d\n", *(u64 *)&pgid, | 908 | dout(" added pg_temp %llx len %d\n", *(u64 *)&pgid, |
| 905 | pglen); | 909 | pglen); |
| 910 | } else { | ||
| 911 | /* remove */ | ||
| 912 | __remove_pg_mapping(&map->pg_temp, pgid); | ||
| 906 | } | 913 | } |
| 907 | } | 914 | } |
| 908 | while (rbp) { | ||
| 909 | struct ceph_pg_mapping *cur = | ||
| 910 | rb_entry(rbp, struct ceph_pg_mapping, node); | ||
| 911 | |||
| 912 | rbp = rb_next(rbp); | ||
| 913 | dout(" removed pg_temp %llx\n", *(u64 *)&cur->pgid); | ||
| 914 | rb_erase(&cur->node, &map->pg_temp); | ||
| 915 | kfree(cur); | ||
| 916 | } | ||
| 917 | 915 | ||
| 918 | /* ignore the rest */ | 916 | /* ignore the rest */ |
| 919 | *p = end; | 917 | *p = end; |
| @@ -1046,10 +1044,25 @@ static int *calc_pg_raw(struct ceph_osdmap *osdmap, struct ceph_pg pgid, | |||
| 1046 | struct ceph_pg_mapping *pg; | 1044 | struct ceph_pg_mapping *pg; |
| 1047 | struct ceph_pg_pool_info *pool; | 1045 | struct ceph_pg_pool_info *pool; |
| 1048 | int ruleno; | 1046 | int ruleno; |
| 1049 | unsigned poolid, ps, pps; | 1047 | unsigned poolid, ps, pps, t; |
| 1050 | int preferred; | 1048 | int preferred; |
| 1051 | 1049 | ||
| 1050 | poolid = le32_to_cpu(pgid.pool); | ||
| 1051 | ps = le16_to_cpu(pgid.ps); | ||
| 1052 | preferred = (s16)le16_to_cpu(pgid.preferred); | ||
| 1053 | |||
| 1054 | pool = __lookup_pg_pool(&osdmap->pg_pools, poolid); | ||
| 1055 | if (!pool) | ||
| 1056 | return NULL; | ||
| 1057 | |||
| 1052 | /* pg_temp? */ | 1058 | /* pg_temp? */ |
| 1059 | if (preferred >= 0) | ||
| 1060 | t = ceph_stable_mod(ps, le32_to_cpu(pool->v.lpg_num), | ||
| 1061 | pool->lpgp_num_mask); | ||
| 1062 | else | ||
| 1063 | t = ceph_stable_mod(ps, le32_to_cpu(pool->v.pg_num), | ||
| 1064 | pool->pgp_num_mask); | ||
| 1065 | pgid.ps = cpu_to_le16(t); | ||
| 1053 | pg = __lookup_pg_mapping(&osdmap->pg_temp, pgid); | 1066 | pg = __lookup_pg_mapping(&osdmap->pg_temp, pgid); |
| 1054 | if (pg) { | 1067 | if (pg) { |
| 1055 | *num = pg->len; | 1068 | *num = pg->len; |
| @@ -1057,18 +1070,6 @@ static int *calc_pg_raw(struct ceph_osdmap *osdmap, struct ceph_pg pgid, | |||
| 1057 | } | 1070 | } |
| 1058 | 1071 | ||
| 1059 | /* crush */ | 1072 | /* crush */ |
| 1060 | poolid = le32_to_cpu(pgid.pool); | ||
| 1061 | ps = le16_to_cpu(pgid.ps); | ||
| 1062 | preferred = (s16)le16_to_cpu(pgid.preferred); | ||
| 1063 | |||
| 1064 | /* don't forcefeed bad device ids to crush */ | ||
| 1065 | if (preferred >= osdmap->max_osd || | ||
| 1066 | preferred >= osdmap->crush->max_devices) | ||
| 1067 | preferred = -1; | ||
| 1068 | |||
| 1069 | pool = __lookup_pg_pool(&osdmap->pg_pools, poolid); | ||
| 1070 | if (!pool) | ||
| 1071 | return NULL; | ||
| 1072 | ruleno = crush_find_rule(osdmap->crush, pool->v.crush_ruleset, | 1073 | ruleno = crush_find_rule(osdmap->crush, pool->v.crush_ruleset, |
| 1073 | pool->v.type, pool->v.size); | 1074 | pool->v.type, pool->v.size); |
| 1074 | if (ruleno < 0) { | 1075 | if (ruleno < 0) { |
| @@ -1078,6 +1079,11 @@ static int *calc_pg_raw(struct ceph_osdmap *osdmap, struct ceph_pg pgid, | |||
| 1078 | return NULL; | 1079 | return NULL; |
| 1079 | } | 1080 | } |
| 1080 | 1081 | ||
| 1082 | /* don't forcefeed bad device ids to crush */ | ||
| 1083 | if (preferred >= osdmap->max_osd || | ||
| 1084 | preferred >= osdmap->crush->max_devices) | ||
| 1085 | preferred = -1; | ||
| 1086 | |||
| 1081 | if (preferred >= 0) | 1087 | if (preferred >= 0) |
| 1082 | pps = ceph_stable_mod(ps, | 1088 | pps = ceph_stable_mod(ps, |
| 1083 | le32_to_cpu(pool->v.lpgp_num), | 1089 | le32_to_cpu(pool->v.lpgp_num), |
diff --git a/net/ipv6/ip6mr.c b/net/ipv6/ip6mr.c index 705c82886281..def0538e2413 100644 --- a/net/ipv6/ip6mr.c +++ b/net/ipv6/ip6mr.c | |||
| @@ -696,8 +696,10 @@ static netdev_tx_t reg_vif_xmit(struct sk_buff *skb, | |||
| 696 | int err; | 696 | int err; |
| 697 | 697 | ||
| 698 | err = ip6mr_fib_lookup(net, &fl6, &mrt); | 698 | err = ip6mr_fib_lookup(net, &fl6, &mrt); |
| 699 | if (err < 0) | 699 | if (err < 0) { |
| 700 | kfree_skb(skb); | ||
| 700 | return err; | 701 | return err; |
| 702 | } | ||
| 701 | 703 | ||
| 702 | read_lock(&mrt_lock); | 704 | read_lock(&mrt_lock); |
| 703 | dev->stats.tx_bytes += skb->len; | 705 | dev->stats.tx_bytes += skb->len; |
| @@ -2052,8 +2054,10 @@ int ip6_mr_input(struct sk_buff *skb) | |||
| 2052 | int err; | 2054 | int err; |
| 2053 | 2055 | ||
| 2054 | err = ip6mr_fib_lookup(net, &fl6, &mrt); | 2056 | err = ip6mr_fib_lookup(net, &fl6, &mrt); |
| 2055 | if (err < 0) | 2057 | if (err < 0) { |
| 2058 | kfree_skb(skb); | ||
| 2056 | return err; | 2059 | return err; |
| 2060 | } | ||
| 2057 | 2061 | ||
| 2058 | read_lock(&mrt_lock); | 2062 | read_lock(&mrt_lock); |
| 2059 | cache = ip6mr_cache_find(mrt, | 2063 | cache = ip6mr_cache_find(mrt, |
diff --git a/net/ipv6/route.c b/net/ipv6/route.c index 1250f9020670..fb545edef6ea 100644 --- a/net/ipv6/route.c +++ b/net/ipv6/route.c | |||
| @@ -244,7 +244,9 @@ static inline struct rt6_info *ip6_dst_alloc(struct dst_ops *ops, | |||
| 244 | { | 244 | { |
| 245 | struct rt6_info *rt = dst_alloc(ops, dev, 0, 0, flags); | 245 | struct rt6_info *rt = dst_alloc(ops, dev, 0, 0, flags); |
| 246 | 246 | ||
| 247 | memset(&rt->rt6i_table, 0, sizeof(*rt) - sizeof(struct dst_entry)); | 247 | if (rt != NULL) |
| 248 | memset(&rt->rt6i_table, 0, | ||
| 249 | sizeof(*rt) - sizeof(struct dst_entry)); | ||
| 248 | 250 | ||
| 249 | return rt; | 251 | return rt; |
| 250 | } | 252 | } |
diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c index e83e7fee3bc0..ea40d540a990 100644 --- a/net/wireless/nl80211.c +++ b/net/wireless/nl80211.c | |||
| @@ -4113,9 +4113,12 @@ static int nl80211_crypto_settings(struct cfg80211_registered_device *rdev, | |||
| 4113 | if (len % sizeof(u32)) | 4113 | if (len % sizeof(u32)) |
| 4114 | return -EINVAL; | 4114 | return -EINVAL; |
| 4115 | 4115 | ||
| 4116 | if (settings->n_akm_suites > NL80211_MAX_NR_AKM_SUITES) | ||
| 4117 | return -EINVAL; | ||
| 4118 | |||
| 4116 | memcpy(settings->akm_suites, data, len); | 4119 | memcpy(settings->akm_suites, data, len); |
| 4117 | 4120 | ||
| 4118 | for (i = 0; i < settings->n_ciphers_pairwise; i++) | 4121 | for (i = 0; i < settings->n_akm_suites; i++) |
| 4119 | if (!nl80211_valid_akm_suite(settings->akm_suites[i])) | 4122 | if (!nl80211_valid_akm_suite(settings->akm_suites[i])) |
| 4120 | return -EINVAL; | 4123 | return -EINVAL; |
| 4121 | } | 4124 | } |
diff --git a/net/xfrm/xfrm_policy.c b/net/xfrm/xfrm_policy.c index 94fdcc7f1030..552df27dcf53 100644 --- a/net/xfrm/xfrm_policy.c +++ b/net/xfrm/xfrm_policy.c | |||
| @@ -1349,14 +1349,16 @@ static inline struct xfrm_dst *xfrm_alloc_dst(struct net *net, int family) | |||
| 1349 | BUG(); | 1349 | BUG(); |
| 1350 | } | 1350 | } |
| 1351 | xdst = dst_alloc(dst_ops, NULL, 0, 0, 0); | 1351 | xdst = dst_alloc(dst_ops, NULL, 0, 0, 0); |
| 1352 | memset(&xdst->u.rt6.rt6i_table, 0, sizeof(*xdst) - sizeof(struct dst_entry)); | ||
| 1353 | xfrm_policy_put_afinfo(afinfo); | ||
| 1354 | 1352 | ||
| 1355 | if (likely(xdst)) | 1353 | if (likely(xdst)) { |
| 1354 | memset(&xdst->u.rt6.rt6i_table, 0, | ||
| 1355 | sizeof(*xdst) - sizeof(struct dst_entry)); | ||
| 1356 | xdst->flo.ops = &xfrm_bundle_fc_ops; | 1356 | xdst->flo.ops = &xfrm_bundle_fc_ops; |
| 1357 | else | 1357 | } else |
| 1358 | xdst = ERR_PTR(-ENOBUFS); | 1358 | xdst = ERR_PTR(-ENOBUFS); |
| 1359 | 1359 | ||
| 1360 | xfrm_policy_put_afinfo(afinfo); | ||
| 1361 | |||
| 1360 | return xdst; | 1362 | return xdst; |
| 1361 | } | 1363 | } |
| 1362 | 1364 | ||
