diff options
author | David S. Miller <davem@davemloft.net> | 2015-03-03 21:16:48 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2015-03-03 21:16:48 -0500 |
commit | 71a83a6db6138b9d41d8a0b6b91cb59f6dc4742c (patch) | |
tree | f74b6e4e48257ec6ce40b95645ecb8533b9cc1f8 /net | |
parent | b97526f3ff95f92b107f0fb52cbb8627e395429b (diff) | |
parent | a6c5170d1edea97c538c81e377e56c7b5c5b7e63 (diff) |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
Conflicts:
drivers/net/ethernet/rocker/rocker.c
The rocker commit was two overlapping changes, one to rename
the ->vport member to ->pport, and another making the bitmask
expression use '1ULL' instead of plain '1'.
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net')
53 files changed, 269 insertions, 252 deletions
diff --git a/net/9p/trans_virtio.c b/net/9p/trans_virtio.c index daa749c8b3fb..d8e376a5f0f1 100644 --- a/net/9p/trans_virtio.c +++ b/net/9p/trans_virtio.c | |||
@@ -524,6 +524,12 @@ static int p9_virtio_probe(struct virtio_device *vdev) | |||
524 | int err; | 524 | int err; |
525 | struct virtio_chan *chan; | 525 | struct virtio_chan *chan; |
526 | 526 | ||
527 | if (!vdev->config->get) { | ||
528 | dev_err(&vdev->dev, "%s failure: config access disabled\n", | ||
529 | __func__); | ||
530 | return -EINVAL; | ||
531 | } | ||
532 | |||
527 | chan = kmalloc(sizeof(struct virtio_chan), GFP_KERNEL); | 533 | chan = kmalloc(sizeof(struct virtio_chan), GFP_KERNEL); |
528 | if (!chan) { | 534 | if (!chan) { |
529 | pr_err("Failed to allocate virtio 9P channel\n"); | 535 | pr_err("Failed to allocate virtio 9P channel\n"); |
diff --git a/net/Kconfig b/net/Kconfig index ff9ffc17fa0e..44dd5786ee91 100644 --- a/net/Kconfig +++ b/net/Kconfig | |||
@@ -231,18 +231,18 @@ source "net/hsr/Kconfig" | |||
231 | source "net/switchdev/Kconfig" | 231 | source "net/switchdev/Kconfig" |
232 | 232 | ||
233 | config RPS | 233 | config RPS |
234 | boolean | 234 | bool |
235 | depends on SMP && SYSFS | 235 | depends on SMP && SYSFS |
236 | default y | 236 | default y |
237 | 237 | ||
238 | config RFS_ACCEL | 238 | config RFS_ACCEL |
239 | boolean | 239 | bool |
240 | depends on RPS | 240 | depends on RPS |
241 | select CPU_RMAP | 241 | select CPU_RMAP |
242 | default y | 242 | default y |
243 | 243 | ||
244 | config XPS | 244 | config XPS |
245 | boolean | 245 | bool |
246 | depends on SMP | 246 | depends on SMP |
247 | default y | 247 | default y |
248 | 248 | ||
@@ -254,18 +254,18 @@ config CGROUP_NET_PRIO | |||
254 | a per-interface basis. | 254 | a per-interface basis. |
255 | 255 | ||
256 | config CGROUP_NET_CLASSID | 256 | config CGROUP_NET_CLASSID |
257 | boolean "Network classid cgroup" | 257 | bool "Network classid cgroup" |
258 | depends on CGROUPS | 258 | depends on CGROUPS |
259 | ---help--- | 259 | ---help--- |
260 | Cgroup subsystem for use as general purpose socket classid marker that is | 260 | Cgroup subsystem for use as general purpose socket classid marker that is |
261 | being used in cls_cgroup and for netfilter matching. | 261 | being used in cls_cgroup and for netfilter matching. |
262 | 262 | ||
263 | config NET_RX_BUSY_POLL | 263 | config NET_RX_BUSY_POLL |
264 | boolean | 264 | bool |
265 | default y | 265 | default y |
266 | 266 | ||
267 | config BQL | 267 | config BQL |
268 | boolean | 268 | bool |
269 | depends on SYSFS | 269 | depends on SYSFS |
270 | select DQL | 270 | select DQL |
271 | default y | 271 | default y |
@@ -282,7 +282,7 @@ config BPF_JIT | |||
282 | this feature changing /proc/sys/net/core/bpf_jit_enable | 282 | this feature changing /proc/sys/net/core/bpf_jit_enable |
283 | 283 | ||
284 | config NET_FLOW_LIMIT | 284 | config NET_FLOW_LIMIT |
285 | boolean | 285 | bool |
286 | depends on RPS | 286 | depends on RPS |
287 | default y | 287 | default y |
288 | ---help--- | 288 | ---help--- |
diff --git a/net/bridge/br.c b/net/bridge/br.c index fb57ab6b24f9..02c24cf63c34 100644 --- a/net/bridge/br.c +++ b/net/bridge/br.c | |||
@@ -190,6 +190,8 @@ static int __init br_init(void) | |||
190 | { | 190 | { |
191 | int err; | 191 | int err; |
192 | 192 | ||
193 | BUILD_BUG_ON(sizeof(struct br_input_skb_cb) > FIELD_SIZEOF(struct sk_buff, cb)); | ||
194 | |||
193 | err = stp_proto_register(&br_stp_proto); | 195 | err = stp_proto_register(&br_stp_proto); |
194 | if (err < 0) { | 196 | if (err < 0) { |
195 | pr_err("bridge: can't register sap for STP\n"); | 197 | pr_err("bridge: can't register sap for STP\n"); |
diff --git a/net/caif/cffrml.c b/net/caif/cffrml.c index 8bc7caa28e64..434ba8557826 100644 --- a/net/caif/cffrml.c +++ b/net/caif/cffrml.c | |||
@@ -84,7 +84,7 @@ static int cffrml_receive(struct cflayer *layr, struct cfpkt *pkt) | |||
84 | u16 tmp; | 84 | u16 tmp; |
85 | u16 len; | 85 | u16 len; |
86 | u16 hdrchks; | 86 | u16 hdrchks; |
87 | u16 pktchks; | 87 | int pktchks; |
88 | struct cffrml *this; | 88 | struct cffrml *this; |
89 | this = container_obj(layr); | 89 | this = container_obj(layr); |
90 | 90 | ||
diff --git a/net/caif/cfpkt_skbuff.c b/net/caif/cfpkt_skbuff.c index 1be0b521ac49..f6c3b2137eea 100644 --- a/net/caif/cfpkt_skbuff.c +++ b/net/caif/cfpkt_skbuff.c | |||
@@ -255,9 +255,9 @@ inline u16 cfpkt_getlen(struct cfpkt *pkt) | |||
255 | return skb->len; | 255 | return skb->len; |
256 | } | 256 | } |
257 | 257 | ||
258 | inline u16 cfpkt_iterate(struct cfpkt *pkt, | 258 | int cfpkt_iterate(struct cfpkt *pkt, |
259 | u16 (*iter_func)(u16, void *, u16), | 259 | u16 (*iter_func)(u16, void *, u16), |
260 | u16 data) | 260 | u16 data) |
261 | { | 261 | { |
262 | /* | 262 | /* |
263 | * Don't care about the performance hit of linearizing, | 263 | * Don't care about the performance hit of linearizing, |
diff --git a/net/ceph/ceph_common.c b/net/ceph/ceph_common.c index 5d5ab67f516d..ec565508e904 100644 --- a/net/ceph/ceph_common.c +++ b/net/ceph/ceph_common.c | |||
@@ -239,6 +239,8 @@ enum { | |||
239 | Opt_nocrc, | 239 | Opt_nocrc, |
240 | Opt_cephx_require_signatures, | 240 | Opt_cephx_require_signatures, |
241 | Opt_nocephx_require_signatures, | 241 | Opt_nocephx_require_signatures, |
242 | Opt_tcp_nodelay, | ||
243 | Opt_notcp_nodelay, | ||
242 | }; | 244 | }; |
243 | 245 | ||
244 | static match_table_t opt_tokens = { | 246 | static match_table_t opt_tokens = { |
@@ -259,6 +261,8 @@ static match_table_t opt_tokens = { | |||
259 | {Opt_nocrc, "nocrc"}, | 261 | {Opt_nocrc, "nocrc"}, |
260 | {Opt_cephx_require_signatures, "cephx_require_signatures"}, | 262 | {Opt_cephx_require_signatures, "cephx_require_signatures"}, |
261 | {Opt_nocephx_require_signatures, "nocephx_require_signatures"}, | 263 | {Opt_nocephx_require_signatures, "nocephx_require_signatures"}, |
264 | {Opt_tcp_nodelay, "tcp_nodelay"}, | ||
265 | {Opt_notcp_nodelay, "notcp_nodelay"}, | ||
262 | {-1, NULL} | 266 | {-1, NULL} |
263 | }; | 267 | }; |
264 | 268 | ||
@@ -457,6 +461,7 @@ ceph_parse_options(char *options, const char *dev_name, | |||
457 | case Opt_nocrc: | 461 | case Opt_nocrc: |
458 | opt->flags |= CEPH_OPT_NOCRC; | 462 | opt->flags |= CEPH_OPT_NOCRC; |
459 | break; | 463 | break; |
464 | |||
460 | case Opt_cephx_require_signatures: | 465 | case Opt_cephx_require_signatures: |
461 | opt->flags &= ~CEPH_OPT_NOMSGAUTH; | 466 | opt->flags &= ~CEPH_OPT_NOMSGAUTH; |
462 | break; | 467 | break; |
@@ -464,6 +469,13 @@ ceph_parse_options(char *options, const char *dev_name, | |||
464 | opt->flags |= CEPH_OPT_NOMSGAUTH; | 469 | opt->flags |= CEPH_OPT_NOMSGAUTH; |
465 | break; | 470 | break; |
466 | 471 | ||
472 | case Opt_tcp_nodelay: | ||
473 | opt->flags |= CEPH_OPT_TCP_NODELAY; | ||
474 | break; | ||
475 | case Opt_notcp_nodelay: | ||
476 | opt->flags &= ~CEPH_OPT_TCP_NODELAY; | ||
477 | break; | ||
478 | |||
467 | default: | 479 | default: |
468 | BUG_ON(token); | 480 | BUG_ON(token); |
469 | } | 481 | } |
@@ -518,10 +530,12 @@ struct ceph_client *ceph_create_client(struct ceph_options *opt, void *private, | |||
518 | /* msgr */ | 530 | /* msgr */ |
519 | if (ceph_test_opt(client, MYIP)) | 531 | if (ceph_test_opt(client, MYIP)) |
520 | myaddr = &client->options->my_addr; | 532 | myaddr = &client->options->my_addr; |
533 | |||
521 | ceph_messenger_init(&client->msgr, myaddr, | 534 | ceph_messenger_init(&client->msgr, myaddr, |
522 | client->supported_features, | 535 | client->supported_features, |
523 | client->required_features, | 536 | client->required_features, |
524 | ceph_test_opt(client, NOCRC)); | 537 | ceph_test_opt(client, NOCRC), |
538 | ceph_test_opt(client, TCP_NODELAY)); | ||
525 | 539 | ||
526 | /* subsystems */ | 540 | /* subsystems */ |
527 | err = ceph_monc_init(&client->monc, client); | 541 | err = ceph_monc_init(&client->monc, client); |
diff --git a/net/ceph/ceph_strings.c b/net/ceph/ceph_strings.c index 30560202f57b..139a9cb19b0c 100644 --- a/net/ceph/ceph_strings.c +++ b/net/ceph/ceph_strings.c | |||
@@ -42,17 +42,3 @@ const char *ceph_osd_state_name(int s) | |||
42 | return "???"; | 42 | return "???"; |
43 | } | 43 | } |
44 | } | 44 | } |
45 | |||
46 | const char *ceph_pool_op_name(int op) | ||
47 | { | ||
48 | switch (op) { | ||
49 | case POOL_OP_CREATE: return "create"; | ||
50 | case POOL_OP_DELETE: return "delete"; | ||
51 | case POOL_OP_AUID_CHANGE: return "auid change"; | ||
52 | case POOL_OP_CREATE_SNAP: return "create snap"; | ||
53 | case POOL_OP_DELETE_SNAP: return "delete snap"; | ||
54 | case POOL_OP_CREATE_UNMANAGED_SNAP: return "create unmanaged snap"; | ||
55 | case POOL_OP_DELETE_UNMANAGED_SNAP: return "delete unmanaged snap"; | ||
56 | } | ||
57 | return "???"; | ||
58 | } | ||
diff --git a/net/ceph/debugfs.c b/net/ceph/debugfs.c index d2d525529f87..14d9995097cc 100644 --- a/net/ceph/debugfs.c +++ b/net/ceph/debugfs.c | |||
@@ -127,8 +127,6 @@ static int monc_show(struct seq_file *s, void *p) | |||
127 | op = le16_to_cpu(req->request->hdr.type); | 127 | op = le16_to_cpu(req->request->hdr.type); |
128 | if (op == CEPH_MSG_STATFS) | 128 | if (op == CEPH_MSG_STATFS) |
129 | seq_printf(s, "%llu statfs\n", req->tid); | 129 | seq_printf(s, "%llu statfs\n", req->tid); |
130 | else if (op == CEPH_MSG_POOLOP) | ||
131 | seq_printf(s, "%llu poolop\n", req->tid); | ||
132 | else if (op == CEPH_MSG_MON_GET_VERSION) | 130 | else if (op == CEPH_MSG_MON_GET_VERSION) |
133 | seq_printf(s, "%llu mon_get_version", req->tid); | 131 | seq_printf(s, "%llu mon_get_version", req->tid); |
134 | else | 132 | else |
diff --git a/net/ceph/messenger.c b/net/ceph/messenger.c index 33a2f201e460..6b3f54ed65ba 100644 --- a/net/ceph/messenger.c +++ b/net/ceph/messenger.c | |||
@@ -510,6 +510,16 @@ static int ceph_tcp_connect(struct ceph_connection *con) | |||
510 | return ret; | 510 | return ret; |
511 | } | 511 | } |
512 | 512 | ||
513 | if (con->msgr->tcp_nodelay) { | ||
514 | int optval = 1; | ||
515 | |||
516 | ret = kernel_setsockopt(sock, SOL_TCP, TCP_NODELAY, | ||
517 | (char *)&optval, sizeof(optval)); | ||
518 | if (ret) | ||
519 | pr_err("kernel_setsockopt(TCP_NODELAY) failed: %d", | ||
520 | ret); | ||
521 | } | ||
522 | |||
513 | sk_set_memalloc(sock->sk); | 523 | sk_set_memalloc(sock->sk); |
514 | 524 | ||
515 | con->sock = sock; | 525 | con->sock = sock; |
@@ -2922,7 +2932,8 @@ void ceph_messenger_init(struct ceph_messenger *msgr, | |||
2922 | struct ceph_entity_addr *myaddr, | 2932 | struct ceph_entity_addr *myaddr, |
2923 | u64 supported_features, | 2933 | u64 supported_features, |
2924 | u64 required_features, | 2934 | u64 required_features, |
2925 | bool nocrc) | 2935 | bool nocrc, |
2936 | bool tcp_nodelay) | ||
2926 | { | 2937 | { |
2927 | msgr->supported_features = supported_features; | 2938 | msgr->supported_features = supported_features; |
2928 | msgr->required_features = required_features; | 2939 | msgr->required_features = required_features; |
@@ -2937,6 +2948,7 @@ void ceph_messenger_init(struct ceph_messenger *msgr, | |||
2937 | get_random_bytes(&msgr->inst.addr.nonce, sizeof(msgr->inst.addr.nonce)); | 2948 | get_random_bytes(&msgr->inst.addr.nonce, sizeof(msgr->inst.addr.nonce)); |
2938 | encode_my_addr(msgr); | 2949 | encode_my_addr(msgr); |
2939 | msgr->nocrc = nocrc; | 2950 | msgr->nocrc = nocrc; |
2951 | msgr->tcp_nodelay = tcp_nodelay; | ||
2940 | 2952 | ||
2941 | atomic_set(&msgr->stopping, 0); | 2953 | atomic_set(&msgr->stopping, 0); |
2942 | 2954 | ||
diff --git a/net/ceph/mon_client.c b/net/ceph/mon_client.c index f2148e22b148..2b3cf05e87b0 100644 --- a/net/ceph/mon_client.c +++ b/net/ceph/mon_client.c | |||
@@ -410,7 +410,7 @@ out_unlocked: | |||
410 | } | 410 | } |
411 | 411 | ||
412 | /* | 412 | /* |
413 | * generic requests (e.g., statfs, poolop) | 413 | * generic requests (currently statfs, mon_get_version) |
414 | */ | 414 | */ |
415 | static struct ceph_mon_generic_request *__lookup_generic_req( | 415 | static struct ceph_mon_generic_request *__lookup_generic_req( |
416 | struct ceph_mon_client *monc, u64 tid) | 416 | struct ceph_mon_client *monc, u64 tid) |
@@ -569,7 +569,7 @@ static void handle_statfs_reply(struct ceph_mon_client *monc, | |||
569 | return; | 569 | return; |
570 | 570 | ||
571 | bad: | 571 | bad: |
572 | pr_err("corrupt generic reply, tid %llu\n", tid); | 572 | pr_err("corrupt statfs reply, tid %llu\n", tid); |
573 | ceph_msg_dump(msg); | 573 | ceph_msg_dump(msg); |
574 | } | 574 | } |
575 | 575 | ||
@@ -588,7 +588,6 @@ int ceph_monc_do_statfs(struct ceph_mon_client *monc, struct ceph_statfs *buf) | |||
588 | 588 | ||
589 | kref_init(&req->kref); | 589 | kref_init(&req->kref); |
590 | req->buf = buf; | 590 | req->buf = buf; |
591 | req->buf_len = sizeof(*buf); | ||
592 | init_completion(&req->completion); | 591 | init_completion(&req->completion); |
593 | 592 | ||
594 | err = -ENOMEM; | 593 | err = -ENOMEM; |
@@ -611,7 +610,7 @@ int ceph_monc_do_statfs(struct ceph_mon_client *monc, struct ceph_statfs *buf) | |||
611 | err = do_generic_request(monc, req); | 610 | err = do_generic_request(monc, req); |
612 | 611 | ||
613 | out: | 612 | out: |
614 | kref_put(&req->kref, release_generic_request); | 613 | put_generic_request(req); |
615 | return err; | 614 | return err; |
616 | } | 615 | } |
617 | EXPORT_SYMBOL(ceph_monc_do_statfs); | 616 | EXPORT_SYMBOL(ceph_monc_do_statfs); |
@@ -647,7 +646,7 @@ static void handle_get_version_reply(struct ceph_mon_client *monc, | |||
647 | 646 | ||
648 | return; | 647 | return; |
649 | bad: | 648 | bad: |
650 | pr_err("corrupt mon_get_version reply\n"); | 649 | pr_err("corrupt mon_get_version reply, tid %llu\n", tid); |
651 | ceph_msg_dump(msg); | 650 | ceph_msg_dump(msg); |
652 | } | 651 | } |
653 | 652 | ||
@@ -670,7 +669,6 @@ int ceph_monc_do_get_version(struct ceph_mon_client *monc, const char *what, | |||
670 | 669 | ||
671 | kref_init(&req->kref); | 670 | kref_init(&req->kref); |
672 | req->buf = newest; | 671 | req->buf = newest; |
673 | req->buf_len = sizeof(*newest); | ||
674 | init_completion(&req->completion); | 672 | init_completion(&req->completion); |
675 | 673 | ||
676 | req->request = ceph_msg_new(CEPH_MSG_MON_GET_VERSION, | 674 | req->request = ceph_msg_new(CEPH_MSG_MON_GET_VERSION, |
@@ -701,134 +699,12 @@ int ceph_monc_do_get_version(struct ceph_mon_client *monc, const char *what, | |||
701 | 699 | ||
702 | mutex_unlock(&monc->mutex); | 700 | mutex_unlock(&monc->mutex); |
703 | out: | 701 | out: |
704 | kref_put(&req->kref, release_generic_request); | 702 | put_generic_request(req); |
705 | return err; | 703 | return err; |
706 | } | 704 | } |
707 | EXPORT_SYMBOL(ceph_monc_do_get_version); | 705 | EXPORT_SYMBOL(ceph_monc_do_get_version); |
708 | 706 | ||
709 | /* | 707 | /* |
710 | * pool ops | ||
711 | */ | ||
712 | static int get_poolop_reply_buf(const char *src, size_t src_len, | ||
713 | char *dst, size_t dst_len) | ||
714 | { | ||
715 | u32 buf_len; | ||
716 | |||
717 | if (src_len != sizeof(u32) + dst_len) | ||
718 | return -EINVAL; | ||
719 | |||
720 | buf_len = le32_to_cpu(*(__le32 *)src); | ||
721 | if (buf_len != dst_len) | ||
722 | return -EINVAL; | ||
723 | |||
724 | memcpy(dst, src + sizeof(u32), dst_len); | ||
725 | return 0; | ||
726 | } | ||
727 | |||
728 | static void handle_poolop_reply(struct ceph_mon_client *monc, | ||
729 | struct ceph_msg *msg) | ||
730 | { | ||
731 | struct ceph_mon_generic_request *req; | ||
732 | struct ceph_mon_poolop_reply *reply = msg->front.iov_base; | ||
733 | u64 tid = le64_to_cpu(msg->hdr.tid); | ||
734 | |||
735 | if (msg->front.iov_len < sizeof(*reply)) | ||
736 | goto bad; | ||
737 | dout("handle_poolop_reply %p tid %llu\n", msg, tid); | ||
738 | |||
739 | mutex_lock(&monc->mutex); | ||
740 | req = __lookup_generic_req(monc, tid); | ||
741 | if (req) { | ||
742 | if (req->buf_len && | ||
743 | get_poolop_reply_buf(msg->front.iov_base + sizeof(*reply), | ||
744 | msg->front.iov_len - sizeof(*reply), | ||
745 | req->buf, req->buf_len) < 0) { | ||
746 | mutex_unlock(&monc->mutex); | ||
747 | goto bad; | ||
748 | } | ||
749 | req->result = le32_to_cpu(reply->reply_code); | ||
750 | get_generic_request(req); | ||
751 | } | ||
752 | mutex_unlock(&monc->mutex); | ||
753 | if (req) { | ||
754 | complete(&req->completion); | ||
755 | put_generic_request(req); | ||
756 | } | ||
757 | return; | ||
758 | |||
759 | bad: | ||
760 | pr_err("corrupt generic reply, tid %llu\n", tid); | ||
761 | ceph_msg_dump(msg); | ||
762 | } | ||
763 | |||
764 | /* | ||
765 | * Do a synchronous pool op. | ||
766 | */ | ||
767 | static int do_poolop(struct ceph_mon_client *monc, u32 op, | ||
768 | u32 pool, u64 snapid, | ||
769 | char *buf, int len) | ||
770 | { | ||
771 | struct ceph_mon_generic_request *req; | ||
772 | struct ceph_mon_poolop *h; | ||
773 | int err; | ||
774 | |||
775 | req = kzalloc(sizeof(*req), GFP_NOFS); | ||
776 | if (!req) | ||
777 | return -ENOMEM; | ||
778 | |||
779 | kref_init(&req->kref); | ||
780 | req->buf = buf; | ||
781 | req->buf_len = len; | ||
782 | init_completion(&req->completion); | ||
783 | |||
784 | err = -ENOMEM; | ||
785 | req->request = ceph_msg_new(CEPH_MSG_POOLOP, sizeof(*h), GFP_NOFS, | ||
786 | true); | ||
787 | if (!req->request) | ||
788 | goto out; | ||
789 | req->reply = ceph_msg_new(CEPH_MSG_POOLOP_REPLY, 1024, GFP_NOFS, | ||
790 | true); | ||
791 | if (!req->reply) | ||
792 | goto out; | ||
793 | |||
794 | /* fill out request */ | ||
795 | req->request->hdr.version = cpu_to_le16(2); | ||
796 | h = req->request->front.iov_base; | ||
797 | h->monhdr.have_version = 0; | ||
798 | h->monhdr.session_mon = cpu_to_le16(-1); | ||
799 | h->monhdr.session_mon_tid = 0; | ||
800 | h->fsid = monc->monmap->fsid; | ||
801 | h->pool = cpu_to_le32(pool); | ||
802 | h->op = cpu_to_le32(op); | ||
803 | h->auid = 0; | ||
804 | h->snapid = cpu_to_le64(snapid); | ||
805 | h->name_len = 0; | ||
806 | |||
807 | err = do_generic_request(monc, req); | ||
808 | |||
809 | out: | ||
810 | kref_put(&req->kref, release_generic_request); | ||
811 | return err; | ||
812 | } | ||
813 | |||
814 | int ceph_monc_create_snapid(struct ceph_mon_client *monc, | ||
815 | u32 pool, u64 *snapid) | ||
816 | { | ||
817 | return do_poolop(monc, POOL_OP_CREATE_UNMANAGED_SNAP, | ||
818 | pool, 0, (char *)snapid, sizeof(*snapid)); | ||
819 | |||
820 | } | ||
821 | EXPORT_SYMBOL(ceph_monc_create_snapid); | ||
822 | |||
823 | int ceph_monc_delete_snapid(struct ceph_mon_client *monc, | ||
824 | u32 pool, u64 snapid) | ||
825 | { | ||
826 | return do_poolop(monc, POOL_OP_CREATE_UNMANAGED_SNAP, | ||
827 | pool, snapid, NULL, 0); | ||
828 | |||
829 | } | ||
830 | |||
831 | /* | ||
832 | * Resend pending generic requests. | 708 | * Resend pending generic requests. |
833 | */ | 709 | */ |
834 | static void __resend_generic_request(struct ceph_mon_client *monc) | 710 | static void __resend_generic_request(struct ceph_mon_client *monc) |
@@ -1112,10 +988,6 @@ static void dispatch(struct ceph_connection *con, struct ceph_msg *msg) | |||
1112 | handle_get_version_reply(monc, msg); | 988 | handle_get_version_reply(monc, msg); |
1113 | break; | 989 | break; |
1114 | 990 | ||
1115 | case CEPH_MSG_POOLOP_REPLY: | ||
1116 | handle_poolop_reply(monc, msg); | ||
1117 | break; | ||
1118 | |||
1119 | case CEPH_MSG_MON_MAP: | 991 | case CEPH_MSG_MON_MAP: |
1120 | ceph_monc_handle_map(monc, msg); | 992 | ceph_monc_handle_map(monc, msg); |
1121 | break; | 993 | break; |
@@ -1154,7 +1026,6 @@ static struct ceph_msg *mon_alloc_msg(struct ceph_connection *con, | |||
1154 | case CEPH_MSG_MON_SUBSCRIBE_ACK: | 1026 | case CEPH_MSG_MON_SUBSCRIBE_ACK: |
1155 | m = ceph_msg_get(monc->m_subscribe_ack); | 1027 | m = ceph_msg_get(monc->m_subscribe_ack); |
1156 | break; | 1028 | break; |
1157 | case CEPH_MSG_POOLOP_REPLY: | ||
1158 | case CEPH_MSG_STATFS_REPLY: | 1029 | case CEPH_MSG_STATFS_REPLY: |
1159 | return get_generic_reply(con, hdr, skip); | 1030 | return get_generic_reply(con, hdr, skip); |
1160 | case CEPH_MSG_AUTH_REPLY: | 1031 | case CEPH_MSG_AUTH_REPLY: |
diff --git a/net/ceph/osd_client.c b/net/ceph/osd_client.c index 53299c7b0ca4..41a4abc7e98e 100644 --- a/net/ceph/osd_client.c +++ b/net/ceph/osd_client.c | |||
@@ -1035,10 +1035,11 @@ static void put_osd(struct ceph_osd *osd) | |||
1035 | { | 1035 | { |
1036 | dout("put_osd %p %d -> %d\n", osd, atomic_read(&osd->o_ref), | 1036 | dout("put_osd %p %d -> %d\n", osd, atomic_read(&osd->o_ref), |
1037 | atomic_read(&osd->o_ref) - 1); | 1037 | atomic_read(&osd->o_ref) - 1); |
1038 | if (atomic_dec_and_test(&osd->o_ref) && osd->o_auth.authorizer) { | 1038 | if (atomic_dec_and_test(&osd->o_ref)) { |
1039 | struct ceph_auth_client *ac = osd->o_osdc->client->monc.auth; | 1039 | struct ceph_auth_client *ac = osd->o_osdc->client->monc.auth; |
1040 | 1040 | ||
1041 | ceph_auth_destroy_authorizer(ac, osd->o_auth.authorizer); | 1041 | if (osd->o_auth.authorizer) |
1042 | ceph_auth_destroy_authorizer(ac, osd->o_auth.authorizer); | ||
1042 | kfree(osd); | 1043 | kfree(osd); |
1043 | } | 1044 | } |
1044 | } | 1045 | } |
@@ -1048,14 +1049,24 @@ static void put_osd(struct ceph_osd *osd) | |||
1048 | */ | 1049 | */ |
1049 | static void __remove_osd(struct ceph_osd_client *osdc, struct ceph_osd *osd) | 1050 | static void __remove_osd(struct ceph_osd_client *osdc, struct ceph_osd *osd) |
1050 | { | 1051 | { |
1051 | dout("__remove_osd %p\n", osd); | 1052 | dout("%s %p osd%d\n", __func__, osd, osd->o_osd); |
1052 | WARN_ON(!list_empty(&osd->o_requests)); | 1053 | WARN_ON(!list_empty(&osd->o_requests)); |
1053 | WARN_ON(!list_empty(&osd->o_linger_requests)); | 1054 | WARN_ON(!list_empty(&osd->o_linger_requests)); |
1054 | 1055 | ||
1055 | rb_erase(&osd->o_node, &osdc->osds); | ||
1056 | list_del_init(&osd->o_osd_lru); | 1056 | list_del_init(&osd->o_osd_lru); |
1057 | ceph_con_close(&osd->o_con); | 1057 | rb_erase(&osd->o_node, &osdc->osds); |
1058 | put_osd(osd); | 1058 | RB_CLEAR_NODE(&osd->o_node); |
1059 | } | ||
1060 | |||
1061 | static void remove_osd(struct ceph_osd_client *osdc, struct ceph_osd *osd) | ||
1062 | { | ||
1063 | dout("%s %p osd%d\n", __func__, osd, osd->o_osd); | ||
1064 | |||
1065 | if (!RB_EMPTY_NODE(&osd->o_node)) { | ||
1066 | ceph_con_close(&osd->o_con); | ||
1067 | __remove_osd(osdc, osd); | ||
1068 | put_osd(osd); | ||
1069 | } | ||
1059 | } | 1070 | } |
1060 | 1071 | ||
1061 | static void remove_all_osds(struct ceph_osd_client *osdc) | 1072 | static void remove_all_osds(struct ceph_osd_client *osdc) |
@@ -1065,7 +1076,7 @@ static void remove_all_osds(struct ceph_osd_client *osdc) | |||
1065 | while (!RB_EMPTY_ROOT(&osdc->osds)) { | 1076 | while (!RB_EMPTY_ROOT(&osdc->osds)) { |
1066 | struct ceph_osd *osd = rb_entry(rb_first(&osdc->osds), | 1077 | struct ceph_osd *osd = rb_entry(rb_first(&osdc->osds), |
1067 | struct ceph_osd, o_node); | 1078 | struct ceph_osd, o_node); |
1068 | __remove_osd(osdc, osd); | 1079 | remove_osd(osdc, osd); |
1069 | } | 1080 | } |
1070 | mutex_unlock(&osdc->request_mutex); | 1081 | mutex_unlock(&osdc->request_mutex); |
1071 | } | 1082 | } |
@@ -1106,7 +1117,7 @@ static void remove_old_osds(struct ceph_osd_client *osdc) | |||
1106 | list_for_each_entry_safe(osd, nosd, &osdc->osd_lru, o_osd_lru) { | 1117 | list_for_each_entry_safe(osd, nosd, &osdc->osd_lru, o_osd_lru) { |
1107 | if (time_before(jiffies, osd->lru_ttl)) | 1118 | if (time_before(jiffies, osd->lru_ttl)) |
1108 | break; | 1119 | break; |
1109 | __remove_osd(osdc, osd); | 1120 | remove_osd(osdc, osd); |
1110 | } | 1121 | } |
1111 | mutex_unlock(&osdc->request_mutex); | 1122 | mutex_unlock(&osdc->request_mutex); |
1112 | } | 1123 | } |
@@ -1121,8 +1132,7 @@ static int __reset_osd(struct ceph_osd_client *osdc, struct ceph_osd *osd) | |||
1121 | dout("__reset_osd %p osd%d\n", osd, osd->o_osd); | 1132 | dout("__reset_osd %p osd%d\n", osd, osd->o_osd); |
1122 | if (list_empty(&osd->o_requests) && | 1133 | if (list_empty(&osd->o_requests) && |
1123 | list_empty(&osd->o_linger_requests)) { | 1134 | list_empty(&osd->o_linger_requests)) { |
1124 | __remove_osd(osdc, osd); | 1135 | remove_osd(osdc, osd); |
1125 | |||
1126 | return -ENODEV; | 1136 | return -ENODEV; |
1127 | } | 1137 | } |
1128 | 1138 | ||
@@ -1926,6 +1936,7 @@ static void reset_changed_osds(struct ceph_osd_client *osdc) | |||
1926 | { | 1936 | { |
1927 | struct rb_node *p, *n; | 1937 | struct rb_node *p, *n; |
1928 | 1938 | ||
1939 | dout("%s %p\n", __func__, osdc); | ||
1929 | for (p = rb_first(&osdc->osds); p; p = n) { | 1940 | for (p = rb_first(&osdc->osds); p; p = n) { |
1930 | struct ceph_osd *osd = rb_entry(p, struct ceph_osd, o_node); | 1941 | struct ceph_osd *osd = rb_entry(p, struct ceph_osd, o_node); |
1931 | 1942 | ||
diff --git a/net/compat.c b/net/compat.c index 49c6a8fb9f09..478443182bbe 100644 --- a/net/compat.c +++ b/net/compat.c | |||
@@ -711,24 +711,18 @@ static unsigned char nas[21] = { | |||
711 | 711 | ||
712 | COMPAT_SYSCALL_DEFINE3(sendmsg, int, fd, struct compat_msghdr __user *, msg, unsigned int, flags) | 712 | COMPAT_SYSCALL_DEFINE3(sendmsg, int, fd, struct compat_msghdr __user *, msg, unsigned int, flags) |
713 | { | 713 | { |
714 | if (flags & MSG_CMSG_COMPAT) | ||
715 | return -EINVAL; | ||
716 | return __sys_sendmsg(fd, (struct user_msghdr __user *)msg, flags | MSG_CMSG_COMPAT); | 714 | return __sys_sendmsg(fd, (struct user_msghdr __user *)msg, flags | MSG_CMSG_COMPAT); |
717 | } | 715 | } |
718 | 716 | ||
719 | COMPAT_SYSCALL_DEFINE4(sendmmsg, int, fd, struct compat_mmsghdr __user *, mmsg, | 717 | COMPAT_SYSCALL_DEFINE4(sendmmsg, int, fd, struct compat_mmsghdr __user *, mmsg, |
720 | unsigned int, vlen, unsigned int, flags) | 718 | unsigned int, vlen, unsigned int, flags) |
721 | { | 719 | { |
722 | if (flags & MSG_CMSG_COMPAT) | ||
723 | return -EINVAL; | ||
724 | return __sys_sendmmsg(fd, (struct mmsghdr __user *)mmsg, vlen, | 720 | return __sys_sendmmsg(fd, (struct mmsghdr __user *)mmsg, vlen, |
725 | flags | MSG_CMSG_COMPAT); | 721 | flags | MSG_CMSG_COMPAT); |
726 | } | 722 | } |
727 | 723 | ||
728 | COMPAT_SYSCALL_DEFINE3(recvmsg, int, fd, struct compat_msghdr __user *, msg, unsigned int, flags) | 724 | COMPAT_SYSCALL_DEFINE3(recvmsg, int, fd, struct compat_msghdr __user *, msg, unsigned int, flags) |
729 | { | 725 | { |
730 | if (flags & MSG_CMSG_COMPAT) | ||
731 | return -EINVAL; | ||
732 | return __sys_recvmsg(fd, (struct user_msghdr __user *)msg, flags | MSG_CMSG_COMPAT); | 726 | return __sys_recvmsg(fd, (struct user_msghdr __user *)msg, flags | MSG_CMSG_COMPAT); |
733 | } | 727 | } |
734 | 728 | ||
@@ -751,9 +745,6 @@ COMPAT_SYSCALL_DEFINE5(recvmmsg, int, fd, struct compat_mmsghdr __user *, mmsg, | |||
751 | int datagrams; | 745 | int datagrams; |
752 | struct timespec ktspec; | 746 | struct timespec ktspec; |
753 | 747 | ||
754 | if (flags & MSG_CMSG_COMPAT) | ||
755 | return -EINVAL; | ||
756 | |||
757 | if (timeout == NULL) | 748 | if (timeout == NULL) |
758 | return __sys_recvmmsg(fd, (struct mmsghdr __user *)mmsg, vlen, | 749 | return __sys_recvmmsg(fd, (struct mmsghdr __user *)mmsg, vlen, |
759 | flags | MSG_CMSG_COMPAT, NULL); | 750 | flags | MSG_CMSG_COMPAT, NULL); |
diff --git a/net/core/dev.c b/net/core/dev.c index 8f9710c62e20..962ee9d71964 100644 --- a/net/core/dev.c +++ b/net/core/dev.c | |||
@@ -946,7 +946,7 @@ bool dev_valid_name(const char *name) | |||
946 | return false; | 946 | return false; |
947 | 947 | ||
948 | while (*name) { | 948 | while (*name) { |
949 | if (*name == '/' || isspace(*name)) | 949 | if (*name == '/' || *name == ':' || isspace(*name)) |
950 | return false; | 950 | return false; |
951 | name++; | 951 | name++; |
952 | } | 952 | } |
diff --git a/net/core/ethtool.c b/net/core/ethtool.c index eb0c3ace7458..1d00b8922902 100644 --- a/net/core/ethtool.c +++ b/net/core/ethtool.c | |||
@@ -98,6 +98,7 @@ static const char netdev_features_strings[NETDEV_FEATURE_COUNT][ETH_GSTRING_LEN] | |||
98 | [NETIF_F_RXALL_BIT] = "rx-all", | 98 | [NETIF_F_RXALL_BIT] = "rx-all", |
99 | [NETIF_F_HW_L2FW_DOFFLOAD_BIT] = "l2-fwd-offload", | 99 | [NETIF_F_HW_L2FW_DOFFLOAD_BIT] = "l2-fwd-offload", |
100 | [NETIF_F_BUSY_POLL_BIT] = "busy-poll", | 100 | [NETIF_F_BUSY_POLL_BIT] = "busy-poll", |
101 | [NETIF_F_HW_SWITCH_OFFLOAD_BIT] = "hw-switch-offload", | ||
101 | }; | 102 | }; |
102 | 103 | ||
103 | static const char | 104 | static const char |
diff --git a/net/core/gen_stats.c b/net/core/gen_stats.c index 0c08062d1796..1e2f46a69d50 100644 --- a/net/core/gen_stats.c +++ b/net/core/gen_stats.c | |||
@@ -32,6 +32,9 @@ gnet_stats_copy(struct gnet_dump *d, int type, void *buf, int size) | |||
32 | return 0; | 32 | return 0; |
33 | 33 | ||
34 | nla_put_failure: | 34 | nla_put_failure: |
35 | kfree(d->xstats); | ||
36 | d->xstats = NULL; | ||
37 | d->xstats_len = 0; | ||
35 | spin_unlock_bh(d->lock); | 38 | spin_unlock_bh(d->lock); |
36 | return -1; | 39 | return -1; |
37 | } | 40 | } |
@@ -305,7 +308,9 @@ int | |||
305 | gnet_stats_copy_app(struct gnet_dump *d, void *st, int len) | 308 | gnet_stats_copy_app(struct gnet_dump *d, void *st, int len) |
306 | { | 309 | { |
307 | if (d->compat_xstats) { | 310 | if (d->compat_xstats) { |
308 | d->xstats = st; | 311 | d->xstats = kmemdup(st, len, GFP_ATOMIC); |
312 | if (!d->xstats) | ||
313 | goto err_out; | ||
309 | d->xstats_len = len; | 314 | d->xstats_len = len; |
310 | } | 315 | } |
311 | 316 | ||
@@ -313,6 +318,11 @@ gnet_stats_copy_app(struct gnet_dump *d, void *st, int len) | |||
313 | return gnet_stats_copy(d, TCA_STATS_APP, st, len); | 318 | return gnet_stats_copy(d, TCA_STATS_APP, st, len); |
314 | 319 | ||
315 | return 0; | 320 | return 0; |
321 | |||
322 | err_out: | ||
323 | d->xstats_len = 0; | ||
324 | spin_unlock_bh(d->lock); | ||
325 | return -1; | ||
316 | } | 326 | } |
317 | EXPORT_SYMBOL(gnet_stats_copy_app); | 327 | EXPORT_SYMBOL(gnet_stats_copy_app); |
318 | 328 | ||
@@ -345,6 +355,9 @@ gnet_stats_finish_copy(struct gnet_dump *d) | |||
345 | return -1; | 355 | return -1; |
346 | } | 356 | } |
347 | 357 | ||
358 | kfree(d->xstats); | ||
359 | d->xstats = NULL; | ||
360 | d->xstats_len = 0; | ||
348 | spin_unlock_bh(d->lock); | 361 | spin_unlock_bh(d->lock); |
349 | return 0; | 362 | return 0; |
350 | } | 363 | } |
diff --git a/net/core/pktgen.c b/net/core/pktgen.c index b4899f5b7388..508155b283dd 100644 --- a/net/core/pktgen.c +++ b/net/core/pktgen.c | |||
@@ -1134,6 +1134,9 @@ static ssize_t pktgen_if_write(struct file *file, | |||
1134 | return len; | 1134 | return len; |
1135 | 1135 | ||
1136 | i += len; | 1136 | i += len; |
1137 | if ((value > 1) && | ||
1138 | (!(pkt_dev->odev->priv_flags & IFF_TX_SKB_SHARING))) | ||
1139 | return -ENOTSUPP; | ||
1137 | pkt_dev->burst = value < 1 ? 1 : value; | 1140 | pkt_dev->burst = value < 1 ? 1 : value; |
1138 | sprintf(pg_result, "OK: burst=%d", pkt_dev->burst); | 1141 | sprintf(pg_result, "OK: burst=%d", pkt_dev->burst); |
1139 | return count; | 1142 | return count; |
diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c index ab293a3066b3..25b4b5d23485 100644 --- a/net/core/rtnetlink.c +++ b/net/core/rtnetlink.c | |||
@@ -1300,7 +1300,6 @@ static int rtnl_dump_ifinfo(struct sk_buff *skb, struct netlink_callback *cb) | |||
1300 | s_h = cb->args[0]; | 1300 | s_h = cb->args[0]; |
1301 | s_idx = cb->args[1]; | 1301 | s_idx = cb->args[1]; |
1302 | 1302 | ||
1303 | rcu_read_lock(); | ||
1304 | cb->seq = net->dev_base_seq; | 1303 | cb->seq = net->dev_base_seq; |
1305 | 1304 | ||
1306 | /* A hack to preserve kernel<->userspace interface. | 1305 | /* A hack to preserve kernel<->userspace interface. |
@@ -1322,7 +1321,7 @@ static int rtnl_dump_ifinfo(struct sk_buff *skb, struct netlink_callback *cb) | |||
1322 | for (h = s_h; h < NETDEV_HASHENTRIES; h++, s_idx = 0) { | 1321 | for (h = s_h; h < NETDEV_HASHENTRIES; h++, s_idx = 0) { |
1323 | idx = 0; | 1322 | idx = 0; |
1324 | head = &net->dev_index_head[h]; | 1323 | head = &net->dev_index_head[h]; |
1325 | hlist_for_each_entry_rcu(dev, head, index_hlist) { | 1324 | hlist_for_each_entry(dev, head, index_hlist) { |
1326 | if (idx < s_idx) | 1325 | if (idx < s_idx) |
1327 | goto cont; | 1326 | goto cont; |
1328 | err = rtnl_fill_ifinfo(skb, dev, RTM_NEWLINK, | 1327 | err = rtnl_fill_ifinfo(skb, dev, RTM_NEWLINK, |
@@ -1344,7 +1343,6 @@ cont: | |||
1344 | } | 1343 | } |
1345 | } | 1344 | } |
1346 | out: | 1345 | out: |
1347 | rcu_read_unlock(); | ||
1348 | cb->args[1] = idx; | 1346 | cb->args[1] = idx; |
1349 | cb->args[0] = h; | 1347 | cb->args[0] = h; |
1350 | 1348 | ||
@@ -2012,8 +2010,8 @@ replay: | |||
2012 | } | 2010 | } |
2013 | 2011 | ||
2014 | if (1) { | 2012 | if (1) { |
2015 | struct nlattr *attr[ops ? ops->maxtype + 1 : 0]; | 2013 | struct nlattr *attr[ops ? ops->maxtype + 1 : 1]; |
2016 | struct nlattr *slave_attr[m_ops ? m_ops->slave_maxtype + 1 : 0]; | 2014 | struct nlattr *slave_attr[m_ops ? m_ops->slave_maxtype + 1 : 1]; |
2017 | struct nlattr **data = NULL; | 2015 | struct nlattr **data = NULL; |
2018 | struct nlattr **slave_data = NULL; | 2016 | struct nlattr **slave_data = NULL; |
2019 | struct net *dest_net, *link_net = NULL; | 2017 | struct net *dest_net, *link_net = NULL; |
@@ -2122,6 +2120,10 @@ replay: | |||
2122 | if (IS_ERR(dest_net)) | 2120 | if (IS_ERR(dest_net)) |
2123 | return PTR_ERR(dest_net); | 2121 | return PTR_ERR(dest_net); |
2124 | 2122 | ||
2123 | err = -EPERM; | ||
2124 | if (!netlink_ns_capable(skb, dest_net->user_ns, CAP_NET_ADMIN)) | ||
2125 | goto out; | ||
2126 | |||
2125 | if (tb[IFLA_LINK_NETNSID]) { | 2127 | if (tb[IFLA_LINK_NETNSID]) { |
2126 | int id = nla_get_s32(tb[IFLA_LINK_NETNSID]); | 2128 | int id = nla_get_s32(tb[IFLA_LINK_NETNSID]); |
2127 | 2129 | ||
@@ -2130,6 +2132,9 @@ replay: | |||
2130 | err = -EINVAL; | 2132 | err = -EINVAL; |
2131 | goto out; | 2133 | goto out; |
2132 | } | 2134 | } |
2135 | err = -EPERM; | ||
2136 | if (!netlink_ns_capable(skb, link_net->user_ns, CAP_NET_ADMIN)) | ||
2137 | goto out; | ||
2133 | } | 2138 | } |
2134 | 2139 | ||
2135 | dev = rtnl_create_link(link_net ? : dest_net, ifname, | 2140 | dev = rtnl_create_link(link_net ? : dest_net, ifname, |
diff --git a/net/core/skbuff.c b/net/core/skbuff.c index 374e43bc6b80..913b94a77060 100644 --- a/net/core/skbuff.c +++ b/net/core/skbuff.c | |||
@@ -3620,13 +3620,14 @@ struct sk_buff *sock_dequeue_err_skb(struct sock *sk) | |||
3620 | { | 3620 | { |
3621 | struct sk_buff_head *q = &sk->sk_error_queue; | 3621 | struct sk_buff_head *q = &sk->sk_error_queue; |
3622 | struct sk_buff *skb, *skb_next; | 3622 | struct sk_buff *skb, *skb_next; |
3623 | unsigned long flags; | ||
3623 | int err = 0; | 3624 | int err = 0; |
3624 | 3625 | ||
3625 | spin_lock_bh(&q->lock); | 3626 | spin_lock_irqsave(&q->lock, flags); |
3626 | skb = __skb_dequeue(q); | 3627 | skb = __skb_dequeue(q); |
3627 | if (skb && (skb_next = skb_peek(q))) | 3628 | if (skb && (skb_next = skb_peek(q))) |
3628 | err = SKB_EXT_ERR(skb_next)->ee.ee_errno; | 3629 | err = SKB_EXT_ERR(skb_next)->ee.ee_errno; |
3629 | spin_unlock_bh(&q->lock); | 3630 | spin_unlock_irqrestore(&q->lock, flags); |
3630 | 3631 | ||
3631 | sk->sk_err = err; | 3632 | sk->sk_err = err; |
3632 | if (err) | 3633 | if (err) |
diff --git a/net/decnet/dn_route.c b/net/decnet/dn_route.c index 1d7c1256e845..3b81092771f8 100644 --- a/net/decnet/dn_route.c +++ b/net/decnet/dn_route.c | |||
@@ -1062,7 +1062,7 @@ source_ok: | |||
1062 | if (decnet_debug_level & 16) | 1062 | if (decnet_debug_level & 16) |
1063 | printk(KERN_DEBUG | 1063 | printk(KERN_DEBUG |
1064 | "dn_route_output_slow: initial checks complete." | 1064 | "dn_route_output_slow: initial checks complete." |
1065 | " dst=%o4x src=%04x oif=%d try_hard=%d\n", | 1065 | " dst=%04x src=%04x oif=%d try_hard=%d\n", |
1066 | le16_to_cpu(fld.daddr), le16_to_cpu(fld.saddr), | 1066 | le16_to_cpu(fld.daddr), le16_to_cpu(fld.saddr), |
1067 | fld.flowidn_oif, try_hard); | 1067 | fld.flowidn_oif, try_hard); |
1068 | 1068 | ||
diff --git a/net/hsr/hsr_device.c b/net/hsr/hsr_device.c index a138d75751df..44d27469ae55 100644 --- a/net/hsr/hsr_device.c +++ b/net/hsr/hsr_device.c | |||
@@ -359,8 +359,11 @@ static void hsr_dev_destroy(struct net_device *hsr_dev) | |||
359 | struct hsr_port *port; | 359 | struct hsr_port *port; |
360 | 360 | ||
361 | hsr = netdev_priv(hsr_dev); | 361 | hsr = netdev_priv(hsr_dev); |
362 | |||
363 | rtnl_lock(); | ||
362 | hsr_for_each_port(hsr, port) | 364 | hsr_for_each_port(hsr, port) |
363 | hsr_del_port(port); | 365 | hsr_del_port(port); |
366 | rtnl_unlock(); | ||
364 | 367 | ||
365 | del_timer_sync(&hsr->prune_timer); | 368 | del_timer_sync(&hsr->prune_timer); |
366 | del_timer_sync(&hsr->announce_timer); | 369 | del_timer_sync(&hsr->announce_timer); |
diff --git a/net/hsr/hsr_main.c b/net/hsr/hsr_main.c index 779d28b65417..cd37d0011b42 100644 --- a/net/hsr/hsr_main.c +++ b/net/hsr/hsr_main.c | |||
@@ -36,6 +36,10 @@ static int hsr_netdev_notify(struct notifier_block *nb, unsigned long event, | |||
36 | return NOTIFY_DONE; /* Not an HSR device */ | 36 | return NOTIFY_DONE; /* Not an HSR device */ |
37 | hsr = netdev_priv(dev); | 37 | hsr = netdev_priv(dev); |
38 | port = hsr_port_get_hsr(hsr, HSR_PT_MASTER); | 38 | port = hsr_port_get_hsr(hsr, HSR_PT_MASTER); |
39 | if (port == NULL) { | ||
40 | /* Resend of notification concerning removed device? */ | ||
41 | return NOTIFY_DONE; | ||
42 | } | ||
39 | } else { | 43 | } else { |
40 | hsr = port->hsr; | 44 | hsr = port->hsr; |
41 | } | 45 | } |
diff --git a/net/hsr/hsr_slave.c b/net/hsr/hsr_slave.c index a348dcbcd683..7d37366cc695 100644 --- a/net/hsr/hsr_slave.c +++ b/net/hsr/hsr_slave.c | |||
@@ -181,8 +181,10 @@ void hsr_del_port(struct hsr_port *port) | |||
181 | list_del_rcu(&port->port_list); | 181 | list_del_rcu(&port->port_list); |
182 | 182 | ||
183 | if (port != master) { | 183 | if (port != master) { |
184 | netdev_update_features(master->dev); | 184 | if (master != NULL) { |
185 | dev_set_mtu(master->dev, hsr_get_max_mtu(hsr)); | 185 | netdev_update_features(master->dev); |
186 | dev_set_mtu(master->dev, hsr_get_max_mtu(hsr)); | ||
187 | } | ||
186 | netdev_rx_handler_unregister(port->dev); | 188 | netdev_rx_handler_unregister(port->dev); |
187 | dev_set_promiscuity(port->dev, -1); | 189 | dev_set_promiscuity(port->dev, -1); |
188 | } | 190 | } |
@@ -192,5 +194,7 @@ void hsr_del_port(struct hsr_port *port) | |||
192 | */ | 194 | */ |
193 | 195 | ||
194 | synchronize_rcu(); | 196 | synchronize_rcu(); |
195 | dev_put(port->dev); | 197 | |
198 | if (port != master) | ||
199 | dev_put(port->dev); | ||
196 | } | 200 | } |
diff --git a/net/ipv4/ip_fragment.c b/net/ipv4/ip_fragment.c index e5b6d0ddcb58..2c8d98e728c0 100644 --- a/net/ipv4/ip_fragment.c +++ b/net/ipv4/ip_fragment.c | |||
@@ -664,7 +664,7 @@ struct sk_buff *ip_check_defrag(struct sk_buff *skb, u32 user) | |||
664 | if (skb->protocol != htons(ETH_P_IP)) | 664 | if (skb->protocol != htons(ETH_P_IP)) |
665 | return skb; | 665 | return skb; |
666 | 666 | ||
667 | if (!skb_copy_bits(skb, 0, &iph, sizeof(iph))) | 667 | if (skb_copy_bits(skb, 0, &iph, sizeof(iph)) < 0) |
668 | return skb; | 668 | return skb; |
669 | 669 | ||
670 | if (iph.ihl < 5 || iph.version != 4) | 670 | if (iph.ihl < 5 || iph.version != 4) |
diff --git a/net/ipv4/ip_output.c b/net/ipv4/ip_output.c index d68199d9b2b0..a7aea2048a0d 100644 --- a/net/ipv4/ip_output.c +++ b/net/ipv4/ip_output.c | |||
@@ -888,7 +888,8 @@ static int __ip_append_data(struct sock *sk, | |||
888 | cork->length += length; | 888 | cork->length += length; |
889 | if (((length > mtu) || (skb && skb_is_gso(skb))) && | 889 | if (((length > mtu) || (skb && skb_is_gso(skb))) && |
890 | (sk->sk_protocol == IPPROTO_UDP) && | 890 | (sk->sk_protocol == IPPROTO_UDP) && |
891 | (rt->dst.dev->features & NETIF_F_UFO) && !rt->dst.header_len) { | 891 | (rt->dst.dev->features & NETIF_F_UFO) && !rt->dst.header_len && |
892 | (sk->sk_type == SOCK_DGRAM)) { | ||
892 | err = ip_ufo_append_data(sk, queue, getfrag, from, length, | 893 | err = ip_ufo_append_data(sk, queue, getfrag, from, length, |
893 | hh_len, fragheaderlen, transhdrlen, | 894 | hh_len, fragheaderlen, transhdrlen, |
894 | maxfraglen, flags); | 895 | maxfraglen, flags); |
diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c index 8fdd27b17306..fb4cf8b8e121 100644 --- a/net/ipv4/tcp_input.c +++ b/net/ipv4/tcp_input.c | |||
@@ -4770,7 +4770,7 @@ static bool tcp_should_expand_sndbuf(const struct sock *sk) | |||
4770 | return false; | 4770 | return false; |
4771 | 4771 | ||
4772 | /* If we filled the congestion window, do not expand. */ | 4772 | /* If we filled the congestion window, do not expand. */ |
4773 | if (tp->packets_out >= tp->snd_cwnd) | 4773 | if (tcp_packets_in_flight(tp) >= tp->snd_cwnd) |
4774 | return false; | 4774 | return false; |
4775 | 4775 | ||
4776 | return true; | 4776 | return true; |
diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c index 783bccfcc060..88d2cf0cae52 100644 --- a/net/ipv6/addrconf.c +++ b/net/ipv6/addrconf.c | |||
@@ -4935,6 +4935,21 @@ int addrconf_sysctl_forward(struct ctl_table *ctl, int write, | |||
4935 | return ret; | 4935 | return ret; |
4936 | } | 4936 | } |
4937 | 4937 | ||
4938 | static | ||
4939 | int addrconf_sysctl_mtu(struct ctl_table *ctl, int write, | ||
4940 | void __user *buffer, size_t *lenp, loff_t *ppos) | ||
4941 | { | ||
4942 | struct inet6_dev *idev = ctl->extra1; | ||
4943 | int min_mtu = IPV6_MIN_MTU; | ||
4944 | struct ctl_table lctl; | ||
4945 | |||
4946 | lctl = *ctl; | ||
4947 | lctl.extra1 = &min_mtu; | ||
4948 | lctl.extra2 = idev ? &idev->dev->mtu : NULL; | ||
4949 | |||
4950 | return proc_dointvec_minmax(&lctl, write, buffer, lenp, ppos); | ||
4951 | } | ||
4952 | |||
4938 | static void dev_disable_change(struct inet6_dev *idev) | 4953 | static void dev_disable_change(struct inet6_dev *idev) |
4939 | { | 4954 | { |
4940 | struct netdev_notifier_info info; | 4955 | struct netdev_notifier_info info; |
@@ -5086,7 +5101,7 @@ static struct addrconf_sysctl_table | |||
5086 | .data = &ipv6_devconf.mtu6, | 5101 | .data = &ipv6_devconf.mtu6, |
5087 | .maxlen = sizeof(int), | 5102 | .maxlen = sizeof(int), |
5088 | .mode = 0644, | 5103 | .mode = 0644, |
5089 | .proc_handler = proc_dointvec, | 5104 | .proc_handler = addrconf_sysctl_mtu, |
5090 | }, | 5105 | }, |
5091 | { | 5106 | { |
5092 | .procname = "accept_ra", | 5107 | .procname = "accept_ra", |
diff --git a/net/ipv6/ip6_output.c b/net/ipv6/ip6_output.c index 7deebf102cba..0a04a37305d5 100644 --- a/net/ipv6/ip6_output.c +++ b/net/ipv6/ip6_output.c | |||
@@ -1298,7 +1298,8 @@ emsgsize: | |||
1298 | if (((length > mtu) || | 1298 | if (((length > mtu) || |
1299 | (skb && skb_is_gso(skb))) && | 1299 | (skb && skb_is_gso(skb))) && |
1300 | (sk->sk_protocol == IPPROTO_UDP) && | 1300 | (sk->sk_protocol == IPPROTO_UDP) && |
1301 | (rt->dst.dev->features & NETIF_F_UFO)) { | 1301 | (rt->dst.dev->features & NETIF_F_UFO) && |
1302 | (sk->sk_type == SOCK_DGRAM)) { | ||
1302 | err = ip6_ufo_append_data(sk, queue, getfrag, from, length, | 1303 | err = ip6_ufo_append_data(sk, queue, getfrag, from, length, |
1303 | hh_len, fragheaderlen, | 1304 | hh_len, fragheaderlen, |
1304 | transhdrlen, mtu, flags, rt); | 1305 | transhdrlen, mtu, flags, rt); |
diff --git a/net/irda/ircomm/ircomm_tty.c b/net/irda/ircomm/ircomm_tty.c index 40695b9751c1..9940a41efca1 100644 --- a/net/irda/ircomm/ircomm_tty.c +++ b/net/irda/ircomm/ircomm_tty.c | |||
@@ -811,7 +811,7 @@ static void ircomm_tty_wait_until_sent(struct tty_struct *tty, int timeout) | |||
811 | break; | 811 | break; |
812 | } | 812 | } |
813 | spin_unlock_irqrestore(&self->spinlock, flags); | 813 | spin_unlock_irqrestore(&self->spinlock, flags); |
814 | current->state = TASK_RUNNING; | 814 | __set_current_state(TASK_RUNNING); |
815 | } | 815 | } |
816 | 816 | ||
817 | /* | 817 | /* |
diff --git a/net/irda/irnet/irnet_ppp.c b/net/irda/irnet/irnet_ppp.c index 3c83a1e5ab03..1215693fdd22 100644 --- a/net/irda/irnet/irnet_ppp.c +++ b/net/irda/irnet/irnet_ppp.c | |||
@@ -305,7 +305,7 @@ irnet_ctrl_read(irnet_socket * ap, | |||
305 | 305 | ||
306 | /* Put ourselves on the wait queue to be woken up */ | 306 | /* Put ourselves on the wait queue to be woken up */ |
307 | add_wait_queue(&irnet_events.rwait, &wait); | 307 | add_wait_queue(&irnet_events.rwait, &wait); |
308 | current->state = TASK_INTERRUPTIBLE; | 308 | set_current_state(TASK_INTERRUPTIBLE); |
309 | for(;;) | 309 | for(;;) |
310 | { | 310 | { |
311 | /* If there is unread events */ | 311 | /* If there is unread events */ |
@@ -321,7 +321,7 @@ irnet_ctrl_read(irnet_socket * ap, | |||
321 | /* Yield and wait to be woken up */ | 321 | /* Yield and wait to be woken up */ |
322 | schedule(); | 322 | schedule(); |
323 | } | 323 | } |
324 | current->state = TASK_RUNNING; | 324 | __set_current_state(TASK_RUNNING); |
325 | remove_wait_queue(&irnet_events.rwait, &wait); | 325 | remove_wait_queue(&irnet_events.rwait, &wait); |
326 | 326 | ||
327 | /* Did we got it ? */ | 327 | /* Did we got it ? */ |
diff --git a/net/mac80211/chan.c b/net/mac80211/chan.c index ff0d2db09df9..5bcd4e5589d3 100644 --- a/net/mac80211/chan.c +++ b/net/mac80211/chan.c | |||
@@ -1508,6 +1508,8 @@ static void __ieee80211_vif_release_channel(struct ieee80211_sub_if_data *sdata) | |||
1508 | if (ieee80211_chanctx_refcount(local, ctx) == 0) | 1508 | if (ieee80211_chanctx_refcount(local, ctx) == 0) |
1509 | ieee80211_free_chanctx(local, ctx); | 1509 | ieee80211_free_chanctx(local, ctx); |
1510 | 1510 | ||
1511 | sdata->radar_required = false; | ||
1512 | |||
1511 | /* Unreserving may ready an in-place reservation. */ | 1513 | /* Unreserving may ready an in-place reservation. */ |
1512 | if (use_reserved_switch) | 1514 | if (use_reserved_switch) |
1513 | ieee80211_vif_use_reserved_switch(local); | 1515 | ieee80211_vif_use_reserved_switch(local); |
@@ -1566,6 +1568,9 @@ int ieee80211_vif_use_channel(struct ieee80211_sub_if_data *sdata, | |||
1566 | ieee80211_recalc_smps_chanctx(local, ctx); | 1568 | ieee80211_recalc_smps_chanctx(local, ctx); |
1567 | ieee80211_recalc_radar_chanctx(local, ctx); | 1569 | ieee80211_recalc_radar_chanctx(local, ctx); |
1568 | out: | 1570 | out: |
1571 | if (ret) | ||
1572 | sdata->radar_required = false; | ||
1573 | |||
1569 | mutex_unlock(&local->chanctx_mtx); | 1574 | mutex_unlock(&local->chanctx_mtx); |
1570 | return ret; | 1575 | return ret; |
1571 | } | 1576 | } |
diff --git a/net/mac80211/rc80211_minstrel.c b/net/mac80211/rc80211_minstrel.c index 7c86a002df95..ef6e8a6c4253 100644 --- a/net/mac80211/rc80211_minstrel.c +++ b/net/mac80211/rc80211_minstrel.c | |||
@@ -373,7 +373,7 @@ minstrel_get_rate(void *priv, struct ieee80211_sta *sta, | |||
373 | rate++; | 373 | rate++; |
374 | mi->sample_deferred++; | 374 | mi->sample_deferred++; |
375 | } else { | 375 | } else { |
376 | if (!msr->sample_limit != 0) | 376 | if (!msr->sample_limit) |
377 | return; | 377 | return; |
378 | 378 | ||
379 | mi->sample_packets++; | 379 | mi->sample_packets++; |
diff --git a/net/mac80211/tx.c b/net/mac80211/tx.c index 88a18ffe2975..07bd8db00af8 100644 --- a/net/mac80211/tx.c +++ b/net/mac80211/tx.c | |||
@@ -566,6 +566,7 @@ ieee80211_tx_h_check_control_port_protocol(struct ieee80211_tx_data *tx) | |||
566 | if (tx->sdata->control_port_no_encrypt) | 566 | if (tx->sdata->control_port_no_encrypt) |
567 | info->flags |= IEEE80211_TX_INTFL_DONT_ENCRYPT; | 567 | info->flags |= IEEE80211_TX_INTFL_DONT_ENCRYPT; |
568 | info->control.flags |= IEEE80211_TX_CTRL_PORT_CTRL_PROTO; | 568 | info->control.flags |= IEEE80211_TX_CTRL_PORT_CTRL_PROTO; |
569 | info->flags |= IEEE80211_TX_CTL_USE_MINRATE; | ||
569 | } | 570 | } |
570 | 571 | ||
571 | return TX_CONTINUE; | 572 | return TX_CONTINUE; |
diff --git a/net/netfilter/ipvs/ip_vs_ctl.c b/net/netfilter/ipvs/ip_vs_ctl.c index 76cc9ffd87fa..49532672f66d 100644 --- a/net/netfilter/ipvs/ip_vs_ctl.c +++ b/net/netfilter/ipvs/ip_vs_ctl.c | |||
@@ -3466,7 +3466,7 @@ static int ip_vs_genl_set_cmd(struct sk_buff *skb, struct genl_info *info) | |||
3466 | if (udest.af == 0) | 3466 | if (udest.af == 0) |
3467 | udest.af = svc->af; | 3467 | udest.af = svc->af; |
3468 | 3468 | ||
3469 | if (udest.af != svc->af) { | 3469 | if (udest.af != svc->af && cmd != IPVS_CMD_DEL_DEST) { |
3470 | /* The synchronization protocol is incompatible | 3470 | /* The synchronization protocol is incompatible |
3471 | * with mixed family services | 3471 | * with mixed family services |
3472 | */ | 3472 | */ |
diff --git a/net/netfilter/nft_compat.c b/net/netfilter/nft_compat.c index a990df2f3f71..29fbcf25f88f 100644 --- a/net/netfilter/nft_compat.c +++ b/net/netfilter/nft_compat.c | |||
@@ -634,8 +634,12 @@ nft_match_select_ops(const struct nft_ctx *ctx, | |||
634 | struct xt_match *match = nft_match->ops.data; | 634 | struct xt_match *match = nft_match->ops.data; |
635 | 635 | ||
636 | if (strcmp(match->name, mt_name) == 0 && | 636 | if (strcmp(match->name, mt_name) == 0 && |
637 | match->revision == rev && match->family == family) | 637 | match->revision == rev && match->family == family) { |
638 | if (!try_module_get(match->me)) | ||
639 | return ERR_PTR(-ENOENT); | ||
640 | |||
638 | return &nft_match->ops; | 641 | return &nft_match->ops; |
642 | } | ||
639 | } | 643 | } |
640 | 644 | ||
641 | match = xt_request_find_match(family, mt_name, rev); | 645 | match = xt_request_find_match(family, mt_name, rev); |
@@ -704,8 +708,12 @@ nft_target_select_ops(const struct nft_ctx *ctx, | |||
704 | struct xt_target *target = nft_target->ops.data; | 708 | struct xt_target *target = nft_target->ops.data; |
705 | 709 | ||
706 | if (strcmp(target->name, tg_name) == 0 && | 710 | if (strcmp(target->name, tg_name) == 0 && |
707 | target->revision == rev && target->family == family) | 711 | target->revision == rev && target->family == family) { |
712 | if (!try_module_get(target->me)) | ||
713 | return ERR_PTR(-ENOENT); | ||
714 | |||
708 | return &nft_target->ops; | 715 | return &nft_target->ops; |
716 | } | ||
709 | } | 717 | } |
710 | 718 | ||
711 | target = xt_request_find_target(family, tg_name, rev); | 719 | target = xt_request_find_target(family, tg_name, rev); |
diff --git a/net/netfilter/nft_hash.c b/net/netfilter/nft_hash.c index 61e6c407476a..c82df0a48fcd 100644 --- a/net/netfilter/nft_hash.c +++ b/net/netfilter/nft_hash.c | |||
@@ -192,8 +192,6 @@ static int nft_hash_init(const struct nft_set *set, | |||
192 | .key_offset = offsetof(struct nft_hash_elem, key), | 192 | .key_offset = offsetof(struct nft_hash_elem, key), |
193 | .key_len = set->klen, | 193 | .key_len = set->klen, |
194 | .hashfn = jhash, | 194 | .hashfn = jhash, |
195 | .grow_decision = rht_grow_above_75, | ||
196 | .shrink_decision = rht_shrink_below_30, | ||
197 | }; | 195 | }; |
198 | 196 | ||
199 | return rhashtable_init(priv, ¶ms); | 197 | return rhashtable_init(priv, ¶ms); |
diff --git a/net/netfilter/xt_recent.c b/net/netfilter/xt_recent.c index 30dbe34915ae..45e1b30e4fb2 100644 --- a/net/netfilter/xt_recent.c +++ b/net/netfilter/xt_recent.c | |||
@@ -378,12 +378,11 @@ static int recent_mt_check(const struct xt_mtchk_param *par, | |||
378 | mutex_lock(&recent_mutex); | 378 | mutex_lock(&recent_mutex); |
379 | t = recent_table_lookup(recent_net, info->name); | 379 | t = recent_table_lookup(recent_net, info->name); |
380 | if (t != NULL) { | 380 | if (t != NULL) { |
381 | if (info->hit_count > t->nstamps_max_mask) { | 381 | if (nstamp_mask > t->nstamps_max_mask) { |
382 | pr_info("hitcount (%u) is larger than packets to be remembered (%u) for table %s\n", | 382 | spin_lock_bh(&recent_lock); |
383 | info->hit_count, t->nstamps_max_mask + 1, | 383 | recent_table_flush(t); |
384 | info->name); | 384 | t->nstamps_max_mask = nstamp_mask; |
385 | ret = -EINVAL; | 385 | spin_unlock_bh(&recent_lock); |
386 | goto out; | ||
387 | } | 386 | } |
388 | 387 | ||
389 | t->refcnt++; | 388 | t->refcnt++; |
diff --git a/net/netfilter/xt_socket.c b/net/netfilter/xt_socket.c index 1ba67931eb1b..13332dbf291d 100644 --- a/net/netfilter/xt_socket.c +++ b/net/netfilter/xt_socket.c | |||
@@ -243,12 +243,13 @@ static int | |||
243 | extract_icmp6_fields(const struct sk_buff *skb, | 243 | extract_icmp6_fields(const struct sk_buff *skb, |
244 | unsigned int outside_hdrlen, | 244 | unsigned int outside_hdrlen, |
245 | int *protocol, | 245 | int *protocol, |
246 | struct in6_addr **raddr, | 246 | const struct in6_addr **raddr, |
247 | struct in6_addr **laddr, | 247 | const struct in6_addr **laddr, |
248 | __be16 *rport, | 248 | __be16 *rport, |
249 | __be16 *lport) | 249 | __be16 *lport, |
250 | struct ipv6hdr *ipv6_var) | ||
250 | { | 251 | { |
251 | struct ipv6hdr *inside_iph, _inside_iph; | 252 | const struct ipv6hdr *inside_iph; |
252 | struct icmp6hdr *icmph, _icmph; | 253 | struct icmp6hdr *icmph, _icmph; |
253 | __be16 *ports, _ports[2]; | 254 | __be16 *ports, _ports[2]; |
254 | u8 inside_nexthdr; | 255 | u8 inside_nexthdr; |
@@ -263,12 +264,14 @@ extract_icmp6_fields(const struct sk_buff *skb, | |||
263 | if (icmph->icmp6_type & ICMPV6_INFOMSG_MASK) | 264 | if (icmph->icmp6_type & ICMPV6_INFOMSG_MASK) |
264 | return 1; | 265 | return 1; |
265 | 266 | ||
266 | inside_iph = skb_header_pointer(skb, outside_hdrlen + sizeof(_icmph), sizeof(_inside_iph), &_inside_iph); | 267 | inside_iph = skb_header_pointer(skb, outside_hdrlen + sizeof(_icmph), |
268 | sizeof(*ipv6_var), ipv6_var); | ||
267 | if (inside_iph == NULL) | 269 | if (inside_iph == NULL) |
268 | return 1; | 270 | return 1; |
269 | inside_nexthdr = inside_iph->nexthdr; | 271 | inside_nexthdr = inside_iph->nexthdr; |
270 | 272 | ||
271 | inside_hdrlen = ipv6_skip_exthdr(skb, outside_hdrlen + sizeof(_icmph) + sizeof(_inside_iph), | 273 | inside_hdrlen = ipv6_skip_exthdr(skb, outside_hdrlen + sizeof(_icmph) + |
274 | sizeof(*ipv6_var), | ||
272 | &inside_nexthdr, &inside_fragoff); | 275 | &inside_nexthdr, &inside_fragoff); |
273 | if (inside_hdrlen < 0) | 276 | if (inside_hdrlen < 0) |
274 | return 1; /* hjm: Packet has no/incomplete transport layer headers. */ | 277 | return 1; /* hjm: Packet has no/incomplete transport layer headers. */ |
@@ -315,10 +318,10 @@ xt_socket_get_sock_v6(struct net *net, const u8 protocol, | |||
315 | static bool | 318 | static bool |
316 | socket_mt6_v1_v2(const struct sk_buff *skb, struct xt_action_param *par) | 319 | socket_mt6_v1_v2(const struct sk_buff *skb, struct xt_action_param *par) |
317 | { | 320 | { |
318 | struct ipv6hdr *iph = ipv6_hdr(skb); | 321 | struct ipv6hdr ipv6_var, *iph = ipv6_hdr(skb); |
319 | struct udphdr _hdr, *hp = NULL; | 322 | struct udphdr _hdr, *hp = NULL; |
320 | struct sock *sk = skb->sk; | 323 | struct sock *sk = skb->sk; |
321 | struct in6_addr *daddr = NULL, *saddr = NULL; | 324 | const struct in6_addr *daddr = NULL, *saddr = NULL; |
322 | __be16 uninitialized_var(dport), uninitialized_var(sport); | 325 | __be16 uninitialized_var(dport), uninitialized_var(sport); |
323 | int thoff = 0, uninitialized_var(tproto); | 326 | int thoff = 0, uninitialized_var(tproto); |
324 | const struct xt_socket_mtinfo1 *info = (struct xt_socket_mtinfo1 *) par->matchinfo; | 327 | const struct xt_socket_mtinfo1 *info = (struct xt_socket_mtinfo1 *) par->matchinfo; |
@@ -342,7 +345,7 @@ socket_mt6_v1_v2(const struct sk_buff *skb, struct xt_action_param *par) | |||
342 | 345 | ||
343 | } else if (tproto == IPPROTO_ICMPV6) { | 346 | } else if (tproto == IPPROTO_ICMPV6) { |
344 | if (extract_icmp6_fields(skb, thoff, &tproto, &saddr, &daddr, | 347 | if (extract_icmp6_fields(skb, thoff, &tproto, &saddr, &daddr, |
345 | &sport, &dport)) | 348 | &sport, &dport, &ipv6_var)) |
346 | return false; | 349 | return false; |
347 | } else { | 350 | } else { |
348 | return false; | 351 | return false; |
diff --git a/net/netlink/af_netlink.c b/net/netlink/af_netlink.c index a96025c0583f..6b0f21950e09 100644 --- a/net/netlink/af_netlink.c +++ b/net/netlink/af_netlink.c | |||
@@ -3124,8 +3124,6 @@ static int __init netlink_proto_init(void) | |||
3124 | .key_len = sizeof(u32), /* portid */ | 3124 | .key_len = sizeof(u32), /* portid */ |
3125 | .hashfn = jhash, | 3125 | .hashfn = jhash, |
3126 | .max_shift = 16, /* 64K */ | 3126 | .max_shift = 16, /* 64K */ |
3127 | .grow_decision = rht_grow_above_75, | ||
3128 | .shrink_decision = rht_shrink_below_30, | ||
3129 | }; | 3127 | }; |
3130 | 3128 | ||
3131 | if (err != 0) | 3129 | if (err != 0) |
diff --git a/net/openvswitch/datapath.c b/net/openvswitch/datapath.c index ae5e77cdc0ca..5bae7243c577 100644 --- a/net/openvswitch/datapath.c +++ b/net/openvswitch/datapath.c | |||
@@ -2194,14 +2194,55 @@ static int __net_init ovs_init_net(struct net *net) | |||
2194 | return 0; | 2194 | return 0; |
2195 | } | 2195 | } |
2196 | 2196 | ||
2197 | static void __net_exit ovs_exit_net(struct net *net) | 2197 | static void __net_exit list_vports_from_net(struct net *net, struct net *dnet, |
2198 | struct list_head *head) | ||
2198 | { | 2199 | { |
2199 | struct datapath *dp, *dp_next; | ||
2200 | struct ovs_net *ovs_net = net_generic(net, ovs_net_id); | 2200 | struct ovs_net *ovs_net = net_generic(net, ovs_net_id); |
2201 | struct datapath *dp; | ||
2202 | |||
2203 | list_for_each_entry(dp, &ovs_net->dps, list_node) { | ||
2204 | int i; | ||
2205 | |||
2206 | for (i = 0; i < DP_VPORT_HASH_BUCKETS; i++) { | ||
2207 | struct vport *vport; | ||
2208 | |||
2209 | hlist_for_each_entry(vport, &dp->ports[i], dp_hash_node) { | ||
2210 | struct netdev_vport *netdev_vport; | ||
2211 | |||
2212 | if (vport->ops->type != OVS_VPORT_TYPE_INTERNAL) | ||
2213 | continue; | ||
2214 | |||
2215 | netdev_vport = netdev_vport_priv(vport); | ||
2216 | if (dev_net(netdev_vport->dev) == dnet) | ||
2217 | list_add(&vport->detach_list, head); | ||
2218 | } | ||
2219 | } | ||
2220 | } | ||
2221 | } | ||
2222 | |||
2223 | static void __net_exit ovs_exit_net(struct net *dnet) | ||
2224 | { | ||
2225 | struct datapath *dp, *dp_next; | ||
2226 | struct ovs_net *ovs_net = net_generic(dnet, ovs_net_id); | ||
2227 | struct vport *vport, *vport_next; | ||
2228 | struct net *net; | ||
2229 | LIST_HEAD(head); | ||
2201 | 2230 | ||
2202 | ovs_lock(); | 2231 | ovs_lock(); |
2203 | list_for_each_entry_safe(dp, dp_next, &ovs_net->dps, list_node) | 2232 | list_for_each_entry_safe(dp, dp_next, &ovs_net->dps, list_node) |
2204 | __dp_destroy(dp); | 2233 | __dp_destroy(dp); |
2234 | |||
2235 | rtnl_lock(); | ||
2236 | for_each_net(net) | ||
2237 | list_vports_from_net(net, dnet, &head); | ||
2238 | rtnl_unlock(); | ||
2239 | |||
2240 | /* Detach all vports from given namespace. */ | ||
2241 | list_for_each_entry_safe(vport, vport_next, &head, detach_list) { | ||
2242 | list_del(&vport->detach_list); | ||
2243 | ovs_dp_detach_port(vport); | ||
2244 | } | ||
2245 | |||
2205 | ovs_unlock(); | 2246 | ovs_unlock(); |
2206 | 2247 | ||
2207 | cancel_work_sync(&ovs_net->dp_notify_work); | 2248 | cancel_work_sync(&ovs_net->dp_notify_work); |
diff --git a/net/openvswitch/flow_netlink.c b/net/openvswitch/flow_netlink.c index 216f20b90aa5..22b18c145c92 100644 --- a/net/openvswitch/flow_netlink.c +++ b/net/openvswitch/flow_netlink.c | |||
@@ -2253,14 +2253,20 @@ static int masked_set_action_to_set_action_attr(const struct nlattr *a, | |||
2253 | struct sk_buff *skb) | 2253 | struct sk_buff *skb) |
2254 | { | 2254 | { |
2255 | const struct nlattr *ovs_key = nla_data(a); | 2255 | const struct nlattr *ovs_key = nla_data(a); |
2256 | struct nlattr *nla; | ||
2256 | size_t key_len = nla_len(ovs_key) / 2; | 2257 | size_t key_len = nla_len(ovs_key) / 2; |
2257 | 2258 | ||
2258 | /* Revert the conversion we did from a non-masked set action to | 2259 | /* Revert the conversion we did from a non-masked set action to |
2259 | * masked set action. | 2260 | * masked set action. |
2260 | */ | 2261 | */ |
2261 | if (nla_put(skb, OVS_ACTION_ATTR_SET, nla_len(a) - key_len, ovs_key)) | 2262 | nla = nla_nest_start(skb, OVS_ACTION_ATTR_SET); |
2263 | if (!nla) | ||
2262 | return -EMSGSIZE; | 2264 | return -EMSGSIZE; |
2263 | 2265 | ||
2266 | if (nla_put(skb, nla_type(ovs_key), key_len, nla_data(ovs_key))) | ||
2267 | return -EMSGSIZE; | ||
2268 | |||
2269 | nla_nest_end(skb, nla); | ||
2264 | return 0; | 2270 | return 0; |
2265 | } | 2271 | } |
2266 | 2272 | ||
diff --git a/net/openvswitch/vport.h b/net/openvswitch/vport.h index f8ae295fb001..bc85331a6c60 100644 --- a/net/openvswitch/vport.h +++ b/net/openvswitch/vport.h | |||
@@ -103,6 +103,7 @@ struct vport_portids { | |||
103 | * @ops: Class structure. | 103 | * @ops: Class structure. |
104 | * @percpu_stats: Points to per-CPU statistics used and maintained by vport | 104 | * @percpu_stats: Points to per-CPU statistics used and maintained by vport |
105 | * @err_stats: Points to error statistics used and maintained by vport | 105 | * @err_stats: Points to error statistics used and maintained by vport |
106 | * @detach_list: list used for detaching vport in net-exit call. | ||
106 | */ | 107 | */ |
107 | struct vport { | 108 | struct vport { |
108 | struct rcu_head rcu; | 109 | struct rcu_head rcu; |
@@ -117,6 +118,7 @@ struct vport { | |||
117 | struct pcpu_sw_netstats __percpu *percpu_stats; | 118 | struct pcpu_sw_netstats __percpu *percpu_stats; |
118 | 119 | ||
119 | struct vport_err_stats err_stats; | 120 | struct vport_err_stats err_stats; |
121 | struct list_head detach_list; | ||
120 | }; | 122 | }; |
121 | 123 | ||
122 | /** | 124 | /** |
diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c index 404c9735aee9..8167aecc1594 100644 --- a/net/packet/af_packet.c +++ b/net/packet/af_packet.c | |||
@@ -704,6 +704,10 @@ static void prb_retire_rx_blk_timer_expired(unsigned long data) | |||
704 | 704 | ||
705 | if (pkc->last_kactive_blk_num == pkc->kactive_blk_num) { | 705 | if (pkc->last_kactive_blk_num == pkc->kactive_blk_num) { |
706 | if (!frozen) { | 706 | if (!frozen) { |
707 | if (!BLOCK_NUM_PKTS(pbd)) { | ||
708 | /* An empty block. Just refresh the timer. */ | ||
709 | goto refresh_timer; | ||
710 | } | ||
707 | prb_retire_current_block(pkc, po, TP_STATUS_BLK_TMO); | 711 | prb_retire_current_block(pkc, po, TP_STATUS_BLK_TMO); |
708 | if (!prb_dispatch_next_block(pkc, po)) | 712 | if (!prb_dispatch_next_block(pkc, po)) |
709 | goto refresh_timer; | 713 | goto refresh_timer; |
@@ -804,7 +808,11 @@ static void prb_close_block(struct tpacket_kbdq_core *pkc1, | |||
804 | h1->ts_last_pkt.ts_sec = last_pkt->tp_sec; | 808 | h1->ts_last_pkt.ts_sec = last_pkt->tp_sec; |
805 | h1->ts_last_pkt.ts_nsec = last_pkt->tp_nsec; | 809 | h1->ts_last_pkt.ts_nsec = last_pkt->tp_nsec; |
806 | } else { | 810 | } else { |
807 | /* Ok, we tmo'd - so get the current time */ | 811 | /* Ok, we tmo'd - so get the current time. |
812 | * | ||
813 | * It shouldn't really happen as we don't close empty | ||
814 | * blocks. See prb_retire_rx_blk_timer_expired(). | ||
815 | */ | ||
808 | struct timespec ts; | 816 | struct timespec ts; |
809 | getnstimeofday(&ts); | 817 | getnstimeofday(&ts); |
810 | h1->ts_last_pkt.ts_sec = ts.tv_sec; | 818 | h1->ts_last_pkt.ts_sec = ts.tv_sec; |
@@ -1355,14 +1363,14 @@ static int packet_rcv_fanout(struct sk_buff *skb, struct net_device *dev, | |||
1355 | return 0; | 1363 | return 0; |
1356 | } | 1364 | } |
1357 | 1365 | ||
1366 | if (fanout_has_flag(f, PACKET_FANOUT_FLAG_DEFRAG)) { | ||
1367 | skb = ip_check_defrag(skb, IP_DEFRAG_AF_PACKET); | ||
1368 | if (!skb) | ||
1369 | return 0; | ||
1370 | } | ||
1358 | switch (f->type) { | 1371 | switch (f->type) { |
1359 | case PACKET_FANOUT_HASH: | 1372 | case PACKET_FANOUT_HASH: |
1360 | default: | 1373 | default: |
1361 | if (fanout_has_flag(f, PACKET_FANOUT_FLAG_DEFRAG)) { | ||
1362 | skb = ip_check_defrag(skb, IP_DEFRAG_AF_PACKET); | ||
1363 | if (!skb) | ||
1364 | return 0; | ||
1365 | } | ||
1366 | idx = fanout_demux_hash(f, skb, num); | 1374 | idx = fanout_demux_hash(f, skb, num); |
1367 | break; | 1375 | break; |
1368 | case PACKET_FANOUT_LB: | 1376 | case PACKET_FANOUT_LB: |
diff --git a/net/rxrpc/ar-ack.c b/net/rxrpc/ar-ack.c index c6be17a959a6..e0547f521f20 100644 --- a/net/rxrpc/ar-ack.c +++ b/net/rxrpc/ar-ack.c | |||
@@ -218,7 +218,8 @@ static void rxrpc_resend(struct rxrpc_call *call) | |||
218 | struct rxrpc_header *hdr; | 218 | struct rxrpc_header *hdr; |
219 | struct sk_buff *txb; | 219 | struct sk_buff *txb; |
220 | unsigned long *p_txb, resend_at; | 220 | unsigned long *p_txb, resend_at; |
221 | int loop, stop; | 221 | bool stop; |
222 | int loop; | ||
222 | u8 resend; | 223 | u8 resend; |
223 | 224 | ||
224 | _enter("{%d,%d,%d,%d},", | 225 | _enter("{%d,%d,%d,%d},", |
@@ -226,7 +227,7 @@ static void rxrpc_resend(struct rxrpc_call *call) | |||
226 | atomic_read(&call->sequence), | 227 | atomic_read(&call->sequence), |
227 | CIRC_CNT(call->acks_head, call->acks_tail, call->acks_winsz)); | 228 | CIRC_CNT(call->acks_head, call->acks_tail, call->acks_winsz)); |
228 | 229 | ||
229 | stop = 0; | 230 | stop = false; |
230 | resend = 0; | 231 | resend = 0; |
231 | resend_at = 0; | 232 | resend_at = 0; |
232 | 233 | ||
@@ -255,11 +256,11 @@ static void rxrpc_resend(struct rxrpc_call *call) | |||
255 | _proto("Tx DATA %%%u { #%d }", | 256 | _proto("Tx DATA %%%u { #%d }", |
256 | ntohl(sp->hdr.serial), ntohl(sp->hdr.seq)); | 257 | ntohl(sp->hdr.serial), ntohl(sp->hdr.seq)); |
257 | if (rxrpc_send_packet(call->conn->trans, txb) < 0) { | 258 | if (rxrpc_send_packet(call->conn->trans, txb) < 0) { |
258 | stop = 0; | 259 | stop = true; |
259 | sp->resend_at = jiffies + 3; | 260 | sp->resend_at = jiffies + 3; |
260 | } else { | 261 | } else { |
261 | sp->resend_at = | 262 | sp->resend_at = |
262 | jiffies + rxrpc_resend_timeout * HZ; | 263 | jiffies + rxrpc_resend_timeout; |
263 | } | 264 | } |
264 | } | 265 | } |
265 | 266 | ||
diff --git a/net/sched/Kconfig b/net/sched/Kconfig index 899d0319f2b2..2274e723a3df 100644 --- a/net/sched/Kconfig +++ b/net/sched/Kconfig | |||
@@ -348,7 +348,7 @@ config NET_SCH_PLUG | |||
348 | comment "Classification" | 348 | comment "Classification" |
349 | 349 | ||
350 | config NET_CLS | 350 | config NET_CLS |
351 | boolean | 351 | bool |
352 | 352 | ||
353 | config NET_CLS_BASIC | 353 | config NET_CLS_BASIC |
354 | tristate "Elementary classification (BASIC)" | 354 | tristate "Elementary classification (BASIC)" |
diff --git a/net/sched/ematch.c b/net/sched/ematch.c index 6742200b1307..fbb7ebfc58c6 100644 --- a/net/sched/ematch.c +++ b/net/sched/ematch.c | |||
@@ -228,6 +228,7 @@ static int tcf_em_validate(struct tcf_proto *tp, | |||
228 | * to replay the request. | 228 | * to replay the request. |
229 | */ | 229 | */ |
230 | module_put(em->ops->owner); | 230 | module_put(em->ops->owner); |
231 | em->ops = NULL; | ||
231 | err = -EAGAIN; | 232 | err = -EAGAIN; |
232 | } | 233 | } |
233 | #endif | 234 | #endif |
diff --git a/net/sunrpc/auth_gss/gss_rpc_upcall.c b/net/sunrpc/auth_gss/gss_rpc_upcall.c index abbb7dcd1689..59eeed43eda2 100644 --- a/net/sunrpc/auth_gss/gss_rpc_upcall.c +++ b/net/sunrpc/auth_gss/gss_rpc_upcall.c | |||
@@ -217,6 +217,8 @@ static void gssp_free_receive_pages(struct gssx_arg_accept_sec_context *arg) | |||
217 | 217 | ||
218 | for (i = 0; i < arg->npages && arg->pages[i]; i++) | 218 | for (i = 0; i < arg->npages && arg->pages[i]; i++) |
219 | __free_page(arg->pages[i]); | 219 | __free_page(arg->pages[i]); |
220 | |||
221 | kfree(arg->pages); | ||
220 | } | 222 | } |
221 | 223 | ||
222 | static int gssp_alloc_receive_pages(struct gssx_arg_accept_sec_context *arg) | 224 | static int gssp_alloc_receive_pages(struct gssx_arg_accept_sec_context *arg) |
diff --git a/net/sunrpc/auth_gss/svcauth_gss.c b/net/sunrpc/auth_gss/svcauth_gss.c index 224a82f24d3c..1095be9c80ab 100644 --- a/net/sunrpc/auth_gss/svcauth_gss.c +++ b/net/sunrpc/auth_gss/svcauth_gss.c | |||
@@ -463,6 +463,8 @@ static int rsc_parse(struct cache_detail *cd, | |||
463 | /* number of additional gid's */ | 463 | /* number of additional gid's */ |
464 | if (get_int(&mesg, &N)) | 464 | if (get_int(&mesg, &N)) |
465 | goto out; | 465 | goto out; |
466 | if (N < 0 || N > NGROUPS_MAX) | ||
467 | goto out; | ||
466 | status = -ENOMEM; | 468 | status = -ENOMEM; |
467 | rsci.cred.cr_group_info = groups_alloc(N); | 469 | rsci.cred.cr_group_info = groups_alloc(N); |
468 | if (rsci.cred.cr_group_info == NULL) | 470 | if (rsci.cred.cr_group_info == NULL) |
diff --git a/net/sunrpc/backchannel_rqst.c b/net/sunrpc/backchannel_rqst.c index 651f49ab601f..9dd0ea8db463 100644 --- a/net/sunrpc/backchannel_rqst.c +++ b/net/sunrpc/backchannel_rqst.c | |||
@@ -309,12 +309,15 @@ void xprt_complete_bc_request(struct rpc_rqst *req, uint32_t copied) | |||
309 | struct rpc_xprt *xprt = req->rq_xprt; | 309 | struct rpc_xprt *xprt = req->rq_xprt; |
310 | struct svc_serv *bc_serv = xprt->bc_serv; | 310 | struct svc_serv *bc_serv = xprt->bc_serv; |
311 | 311 | ||
312 | spin_lock(&xprt->bc_pa_lock); | ||
313 | list_del(&req->rq_bc_pa_list); | ||
314 | spin_unlock(&xprt->bc_pa_lock); | ||
315 | |||
312 | req->rq_private_buf.len = copied; | 316 | req->rq_private_buf.len = copied; |
313 | set_bit(RPC_BC_PA_IN_USE, &req->rq_bc_pa_state); | 317 | set_bit(RPC_BC_PA_IN_USE, &req->rq_bc_pa_state); |
314 | 318 | ||
315 | dprintk("RPC: add callback request to list\n"); | 319 | dprintk("RPC: add callback request to list\n"); |
316 | spin_lock(&bc_serv->sv_cb_lock); | 320 | spin_lock(&bc_serv->sv_cb_lock); |
317 | list_del(&req->rq_bc_pa_list); | ||
318 | list_add(&req->rq_bc_list, &bc_serv->sv_cb_list); | 321 | list_add(&req->rq_bc_list, &bc_serv->sv_cb_list); |
319 | wake_up(&bc_serv->sv_cb_waitq); | 322 | wake_up(&bc_serv->sv_cb_waitq); |
320 | spin_unlock(&bc_serv->sv_cb_lock); | 323 | spin_unlock(&bc_serv->sv_cb_lock); |
diff --git a/net/switchdev/Kconfig b/net/switchdev/Kconfig index 155754588fd6..86a47e17cfaf 100644 --- a/net/switchdev/Kconfig +++ b/net/switchdev/Kconfig | |||
@@ -3,7 +3,7 @@ | |||
3 | # | 3 | # |
4 | 4 | ||
5 | config NET_SWITCHDEV | 5 | config NET_SWITCHDEV |
6 | boolean "Switch (and switch-ish) device support (EXPERIMENTAL)" | 6 | bool "Switch (and switch-ish) device support (EXPERIMENTAL)" |
7 | depends on INET | 7 | depends on INET |
8 | ---help--- | 8 | ---help--- |
9 | This module provides glue between core networking code and device | 9 | This module provides glue between core networking code and device |
diff --git a/net/tipc/socket.c b/net/tipc/socket.c index dcb797c60806..95c514a1d7d9 100644 --- a/net/tipc/socket.c +++ b/net/tipc/socket.c | |||
@@ -2363,8 +2363,6 @@ int tipc_sk_rht_init(struct net *net) | |||
2363 | .hashfn = jhash, | 2363 | .hashfn = jhash, |
2364 | .max_shift = 20, /* 1M */ | 2364 | .max_shift = 20, /* 1M */ |
2365 | .min_shift = 8, /* 256 */ | 2365 | .min_shift = 8, /* 256 */ |
2366 | .grow_decision = rht_grow_above_75, | ||
2367 | .shrink_decision = rht_shrink_below_30, | ||
2368 | }; | 2366 | }; |
2369 | 2367 | ||
2370 | return rhashtable_init(&tn->sk_rht, &rht_params); | 2368 | return rhashtable_init(&tn->sk_rht, &rht_params); |
diff --git a/net/wireless/core.c b/net/wireless/core.c index 3af0ecf1cc16..2a0bbd22854b 100644 --- a/net/wireless/core.c +++ b/net/wireless/core.c | |||
@@ -1199,6 +1199,7 @@ out_fail_wq: | |||
1199 | regulatory_exit(); | 1199 | regulatory_exit(); |
1200 | out_fail_reg: | 1200 | out_fail_reg: |
1201 | debugfs_remove(ieee80211_debugfs_dir); | 1201 | debugfs_remove(ieee80211_debugfs_dir); |
1202 | nl80211_exit(); | ||
1202 | out_fail_nl80211: | 1203 | out_fail_nl80211: |
1203 | unregister_netdevice_notifier(&cfg80211_netdev_notifier); | 1204 | unregister_netdevice_notifier(&cfg80211_netdev_notifier); |
1204 | out_fail_notifier: | 1205 | out_fail_notifier: |
diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c index 96fe32889f5e..864b782c0202 100644 --- a/net/wireless/nl80211.c +++ b/net/wireless/nl80211.c | |||
@@ -2654,10 +2654,6 @@ static int nl80211_new_interface(struct sk_buff *skb, struct genl_info *info) | |||
2654 | return err; | 2654 | return err; |
2655 | } | 2655 | } |
2656 | 2656 | ||
2657 | msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); | ||
2658 | if (!msg) | ||
2659 | return -ENOMEM; | ||
2660 | |||
2661 | err = parse_monitor_flags(type == NL80211_IFTYPE_MONITOR ? | 2657 | err = parse_monitor_flags(type == NL80211_IFTYPE_MONITOR ? |
2662 | info->attrs[NL80211_ATTR_MNTR_FLAGS] : NULL, | 2658 | info->attrs[NL80211_ATTR_MNTR_FLAGS] : NULL, |
2663 | &flags); | 2659 | &flags); |
@@ -2666,6 +2662,10 @@ static int nl80211_new_interface(struct sk_buff *skb, struct genl_info *info) | |||
2666 | !(rdev->wiphy.features & NL80211_FEATURE_ACTIVE_MONITOR)) | 2662 | !(rdev->wiphy.features & NL80211_FEATURE_ACTIVE_MONITOR)) |
2667 | return -EOPNOTSUPP; | 2663 | return -EOPNOTSUPP; |
2668 | 2664 | ||
2665 | msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); | ||
2666 | if (!msg) | ||
2667 | return -ENOMEM; | ||
2668 | |||
2669 | wdev = rdev_add_virtual_intf(rdev, | 2669 | wdev = rdev_add_virtual_intf(rdev, |
2670 | nla_data(info->attrs[NL80211_ATTR_IFNAME]), | 2670 | nla_data(info->attrs[NL80211_ATTR_IFNAME]), |
2671 | type, err ? NULL : &flags, ¶ms); | 2671 | type, err ? NULL : &flags, ¶ms); |
@@ -12528,9 +12528,7 @@ static int cfg80211_net_detect_results(struct sk_buff *msg, | |||
12528 | } | 12528 | } |
12529 | 12529 | ||
12530 | for (j = 0; j < match->n_channels; j++) { | 12530 | for (j = 0; j < match->n_channels; j++) { |
12531 | if (nla_put_u32(msg, | 12531 | if (nla_put_u32(msg, j, match->channels[j])) { |
12532 | NL80211_ATTR_WIPHY_FREQ, | ||
12533 | match->channels[j])) { | ||
12534 | nla_nest_cancel(msg, nl_freqs); | 12532 | nla_nest_cancel(msg, nl_freqs); |
12535 | nla_nest_cancel(msg, nl_match); | 12533 | nla_nest_cancel(msg, nl_match); |
12536 | goto out; | 12534 | goto out; |
diff --git a/net/wireless/reg.c b/net/wireless/reg.c index b586d0dcb09e..48dfc7b4e981 100644 --- a/net/wireless/reg.c +++ b/net/wireless/reg.c | |||
@@ -228,7 +228,7 @@ static DECLARE_DELAYED_WORK(reg_timeout, reg_timeout_work); | |||
228 | 228 | ||
229 | /* We keep a static world regulatory domain in case of the absence of CRDA */ | 229 | /* We keep a static world regulatory domain in case of the absence of CRDA */ |
230 | static const struct ieee80211_regdomain world_regdom = { | 230 | static const struct ieee80211_regdomain world_regdom = { |
231 | .n_reg_rules = 6, | 231 | .n_reg_rules = 8, |
232 | .alpha2 = "00", | 232 | .alpha2 = "00", |
233 | .reg_rules = { | 233 | .reg_rules = { |
234 | /* IEEE 802.11b/g, channels 1..11 */ | 234 | /* IEEE 802.11b/g, channels 1..11 */ |