diff options
Diffstat (limited to 'net')
| -rw-r--r-- | net/8021q/vlan_core.c | 46 | ||||
| -rw-r--r-- | net/9p/client.c | 31 | ||||
| -rw-r--r-- | net/core/dev.c | 3 | ||||
| -rw-r--r-- | net/core/scm.c | 24 | ||||
| -rw-r--r-- | net/ipv4/tcp.c | 3 | ||||
| -rw-r--r-- | net/ipv4/xfrm4_state.c | 1 | ||||
| -rw-r--r-- | net/ipv6/addrconf.c | 4 | ||||
| -rw-r--r-- | net/ipv6/xfrm6_state.c | 1 | ||||
| -rw-r--r-- | net/netfilter/nf_conntrack_helper.c | 3 | ||||
| -rw-r--r-- | net/netfilter/nf_conntrack_proto.c | 5 |
10 files changed, 91 insertions, 30 deletions
diff --git a/net/8021q/vlan_core.c b/net/8021q/vlan_core.c index 916061f681b6..68ced4bf158c 100644 --- a/net/8021q/vlan_core.c +++ b/net/8021q/vlan_core.c | |||
| @@ -3,11 +3,20 @@ | |||
| 3 | #include <linux/if_vlan.h> | 3 | #include <linux/if_vlan.h> |
| 4 | #include "vlan.h" | 4 | #include "vlan.h" |
| 5 | 5 | ||
| 6 | struct vlan_hwaccel_cb { | ||
| 7 | struct net_device *dev; | ||
| 8 | }; | ||
| 9 | |||
| 10 | static inline struct vlan_hwaccel_cb *vlan_hwaccel_cb(struct sk_buff *skb) | ||
| 11 | { | ||
| 12 | return (struct vlan_hwaccel_cb *)skb->cb; | ||
| 13 | } | ||
| 14 | |||
| 6 | /* VLAN rx hw acceleration helper. This acts like netif_{rx,receive_skb}(). */ | 15 | /* VLAN rx hw acceleration helper. This acts like netif_{rx,receive_skb}(). */ |
| 7 | int __vlan_hwaccel_rx(struct sk_buff *skb, struct vlan_group *grp, | 16 | int __vlan_hwaccel_rx(struct sk_buff *skb, struct vlan_group *grp, |
| 8 | u16 vlan_tci, int polling) | 17 | u16 vlan_tci, int polling) |
| 9 | { | 18 | { |
| 10 | struct net_device_stats *stats; | 19 | struct vlan_hwaccel_cb *cb = vlan_hwaccel_cb(skb); |
| 11 | 20 | ||
| 12 | if (skb_bond_should_drop(skb)) { | 21 | if (skb_bond_should_drop(skb)) { |
| 13 | dev_kfree_skb_any(skb); | 22 | dev_kfree_skb_any(skb); |
| @@ -15,23 +24,35 @@ int __vlan_hwaccel_rx(struct sk_buff *skb, struct vlan_group *grp, | |||
| 15 | } | 24 | } |
| 16 | 25 | ||
| 17 | skb->vlan_tci = vlan_tci; | 26 | skb->vlan_tci = vlan_tci; |
| 27 | cb->dev = vlan_group_get_device(grp, vlan_tci & VLAN_VID_MASK); | ||
| 28 | |||
| 29 | return (polling ? netif_receive_skb(skb) : netif_rx(skb)); | ||
| 30 | } | ||
| 31 | EXPORT_SYMBOL(__vlan_hwaccel_rx); | ||
| 32 | |||
| 33 | int vlan_hwaccel_do_receive(struct sk_buff *skb) | ||
| 34 | { | ||
| 35 | struct vlan_hwaccel_cb *cb = vlan_hwaccel_cb(skb); | ||
| 36 | struct net_device *dev = cb->dev; | ||
| 37 | struct net_device_stats *stats; | ||
| 38 | |||
| 18 | netif_nit_deliver(skb); | 39 | netif_nit_deliver(skb); |
| 19 | 40 | ||
| 20 | skb->dev = vlan_group_get_device(grp, vlan_tci & VLAN_VID_MASK); | 41 | if (dev == NULL) { |
| 21 | if (skb->dev == NULL) { | 42 | kfree_skb(skb); |
| 22 | dev_kfree_skb_any(skb); | 43 | return -1; |
| 23 | /* Not NET_RX_DROP, this is not being dropped | ||
| 24 | * due to congestion. */ | ||
| 25 | return NET_RX_SUCCESS; | ||
| 26 | } | 44 | } |
| 27 | skb->dev->last_rx = jiffies; | 45 | |
| 46 | skb->dev = dev; | ||
| 47 | skb->priority = vlan_get_ingress_priority(dev, skb->vlan_tci); | ||
| 28 | skb->vlan_tci = 0; | 48 | skb->vlan_tci = 0; |
| 29 | 49 | ||
| 30 | stats = &skb->dev->stats; | 50 | dev->last_rx = jiffies; |
| 51 | |||
| 52 | stats = &dev->stats; | ||
| 31 | stats->rx_packets++; | 53 | stats->rx_packets++; |
| 32 | stats->rx_bytes += skb->len; | 54 | stats->rx_bytes += skb->len; |
| 33 | 55 | ||
| 34 | skb->priority = vlan_get_ingress_priority(skb->dev, vlan_tci); | ||
| 35 | switch (skb->pkt_type) { | 56 | switch (skb->pkt_type) { |
| 36 | case PACKET_BROADCAST: | 57 | case PACKET_BROADCAST: |
| 37 | break; | 58 | break; |
| @@ -43,13 +64,12 @@ int __vlan_hwaccel_rx(struct sk_buff *skb, struct vlan_group *grp, | |||
| 43 | * This allows the VLAN to have a different MAC than the | 64 | * This allows the VLAN to have a different MAC than the |
| 44 | * underlying device, and still route correctly. */ | 65 | * underlying device, and still route correctly. */ |
| 45 | if (!compare_ether_addr(eth_hdr(skb)->h_dest, | 66 | if (!compare_ether_addr(eth_hdr(skb)->h_dest, |
| 46 | skb->dev->dev_addr)) | 67 | dev->dev_addr)) |
| 47 | skb->pkt_type = PACKET_HOST; | 68 | skb->pkt_type = PACKET_HOST; |
| 48 | break; | 69 | break; |
| 49 | }; | 70 | }; |
| 50 | return (polling ? netif_receive_skb(skb) : netif_rx(skb)); | 71 | return 0; |
| 51 | } | 72 | } |
| 52 | EXPORT_SYMBOL(__vlan_hwaccel_rx); | ||
| 53 | 73 | ||
| 54 | struct net_device *vlan_dev_real_dev(const struct net_device *dev) | 74 | struct net_device *vlan_dev_real_dev(const struct net_device *dev) |
| 55 | { | 75 | { |
diff --git a/net/9p/client.c b/net/9p/client.c index 67717f69412e..0a04faa22116 100644 --- a/net/9p/client.c +++ b/net/9p/client.c | |||
| @@ -818,7 +818,9 @@ struct p9_fid *p9_client_attach(struct p9_client *clnt, struct p9_fid *afid, | |||
| 818 | } | 818 | } |
| 819 | 819 | ||
| 820 | P9_DPRINTK(P9_DEBUG_9P, "<<< RATTACH qid %x.%llx.%x\n", | 820 | P9_DPRINTK(P9_DEBUG_9P, "<<< RATTACH qid %x.%llx.%x\n", |
| 821 | qid.type, qid.path, qid.version); | 821 | qid.type, |
| 822 | (unsigned long long)qid.path, | ||
| 823 | qid.version); | ||
| 822 | 824 | ||
| 823 | memmove(&fid->qid, &qid, sizeof(struct p9_qid)); | 825 | memmove(&fid->qid, &qid, sizeof(struct p9_qid)); |
| 824 | 826 | ||
| @@ -865,7 +867,9 @@ p9_client_auth(struct p9_client *clnt, char *uname, u32 n_uname, char *aname) | |||
| 865 | } | 867 | } |
| 866 | 868 | ||
| 867 | P9_DPRINTK(P9_DEBUG_9P, "<<< RAUTH qid %x.%llx.%x\n", | 869 | P9_DPRINTK(P9_DEBUG_9P, "<<< RAUTH qid %x.%llx.%x\n", |
| 868 | qid.type, qid.path, qid.version); | 870 | qid.type, |
| 871 | (unsigned long long)qid.path, | ||
| 872 | qid.version); | ||
| 869 | 873 | ||
| 870 | memmove(&afid->qid, &qid, sizeof(struct p9_qid)); | 874 | memmove(&afid->qid, &qid, sizeof(struct p9_qid)); |
| 871 | p9_free_req(clnt, req); | 875 | p9_free_req(clnt, req); |
| @@ -930,7 +934,8 @@ struct p9_fid *p9_client_walk(struct p9_fid *oldfid, int nwname, char **wnames, | |||
| 930 | 934 | ||
| 931 | for (count = 0; count < nwqids; count++) | 935 | for (count = 0; count < nwqids; count++) |
| 932 | P9_DPRINTK(P9_DEBUG_9P, "<<< [%d] %x.%llx.%x\n", | 936 | P9_DPRINTK(P9_DEBUG_9P, "<<< [%d] %x.%llx.%x\n", |
| 933 | count, wqids[count].type, wqids[count].path, | 937 | count, wqids[count].type, |
| 938 | (unsigned long long)wqids[count].path, | ||
| 934 | wqids[count].version); | 939 | wqids[count].version); |
| 935 | 940 | ||
| 936 | if (nwname) | 941 | if (nwname) |
| @@ -980,7 +985,9 @@ int p9_client_open(struct p9_fid *fid, int mode) | |||
| 980 | } | 985 | } |
| 981 | 986 | ||
| 982 | P9_DPRINTK(P9_DEBUG_9P, "<<< ROPEN qid %x.%llx.%x iounit %x\n", | 987 | P9_DPRINTK(P9_DEBUG_9P, "<<< ROPEN qid %x.%llx.%x iounit %x\n", |
| 983 | qid.type, qid.path, qid.version, iounit); | 988 | qid.type, |
| 989 | (unsigned long long)qid.path, | ||
| 990 | qid.version, iounit); | ||
| 984 | 991 | ||
| 985 | fid->mode = mode; | 992 | fid->mode = mode; |
| 986 | fid->iounit = iounit; | 993 | fid->iounit = iounit; |
| @@ -1023,7 +1030,9 @@ int p9_client_fcreate(struct p9_fid *fid, char *name, u32 perm, int mode, | |||
| 1023 | } | 1030 | } |
| 1024 | 1031 | ||
| 1025 | P9_DPRINTK(P9_DEBUG_9P, "<<< RCREATE qid %x.%llx.%x iounit %x\n", | 1032 | P9_DPRINTK(P9_DEBUG_9P, "<<< RCREATE qid %x.%llx.%x iounit %x\n", |
| 1026 | qid.type, qid.path, qid.version, iounit); | 1033 | qid.type, |
| 1034 | (unsigned long long)qid.path, | ||
| 1035 | qid.version, iounit); | ||
| 1027 | 1036 | ||
| 1028 | fid->mode = mode; | 1037 | fid->mode = mode; |
| 1029 | fid->iounit = iounit; | 1038 | fid->iounit = iounit; |
| @@ -1230,9 +1239,9 @@ struct p9_wstat *p9_client_stat(struct p9_fid *fid) | |||
| 1230 | "<<< name=%s uid=%s gid=%s muid=%s extension=(%s)\n" | 1239 | "<<< name=%s uid=%s gid=%s muid=%s extension=(%s)\n" |
| 1231 | "<<< uid=%d gid=%d n_muid=%d\n", | 1240 | "<<< uid=%d gid=%d n_muid=%d\n", |
| 1232 | ret->size, ret->type, ret->dev, ret->qid.type, | 1241 | ret->size, ret->type, ret->dev, ret->qid.type, |
| 1233 | ret->qid.path, ret->qid.version, ret->mode, | 1242 | (unsigned long long)ret->qid.path, ret->qid.version, ret->mode, |
| 1234 | ret->atime, ret->mtime, ret->length, ret->name, | 1243 | ret->atime, ret->mtime, (unsigned long long)ret->length, |
| 1235 | ret->uid, ret->gid, ret->muid, ret->extension, | 1244 | ret->name, ret->uid, ret->gid, ret->muid, ret->extension, |
| 1236 | ret->n_uid, ret->n_gid, ret->n_muid); | 1245 | ret->n_uid, ret->n_gid, ret->n_muid); |
| 1237 | 1246 | ||
| 1238 | free_and_error: | 1247 | free_and_error: |
| @@ -1255,9 +1264,9 @@ int p9_client_wstat(struct p9_fid *fid, struct p9_wstat *wst) | |||
| 1255 | " name=%s uid=%s gid=%s muid=%s extension=(%s)\n" | 1264 | " name=%s uid=%s gid=%s muid=%s extension=(%s)\n" |
| 1256 | " uid=%d gid=%d n_muid=%d\n", | 1265 | " uid=%d gid=%d n_muid=%d\n", |
| 1257 | wst->size, wst->type, wst->dev, wst->qid.type, | 1266 | wst->size, wst->type, wst->dev, wst->qid.type, |
| 1258 | wst->qid.path, wst->qid.version, wst->mode, | 1267 | (unsigned long long)wst->qid.path, wst->qid.version, wst->mode, |
| 1259 | wst->atime, wst->mtime, wst->length, wst->name, | 1268 | wst->atime, wst->mtime, (unsigned long long)wst->length, |
| 1260 | wst->uid, wst->gid, wst->muid, wst->extension, | 1269 | wst->name, wst->uid, wst->gid, wst->muid, wst->extension, |
| 1261 | wst->n_uid, wst->n_gid, wst->n_muid); | 1270 | wst->n_uid, wst->n_gid, wst->n_muid); |
| 1262 | err = 0; | 1271 | err = 0; |
| 1263 | clnt = fid->clnt; | 1272 | clnt = fid->clnt; |
diff --git a/net/core/dev.c b/net/core/dev.c index d9038e328cc1..9174c77d3112 100644 --- a/net/core/dev.c +++ b/net/core/dev.c | |||
| @@ -2218,6 +2218,9 @@ int netif_receive_skb(struct sk_buff *skb) | |||
| 2218 | int ret = NET_RX_DROP; | 2218 | int ret = NET_RX_DROP; |
| 2219 | __be16 type; | 2219 | __be16 type; |
| 2220 | 2220 | ||
| 2221 | if (skb->vlan_tci && vlan_hwaccel_do_receive(skb)) | ||
| 2222 | return NET_RX_SUCCESS; | ||
| 2223 | |||
| 2221 | /* if we've gotten here through NAPI, check netpoll */ | 2224 | /* if we've gotten here through NAPI, check netpoll */ |
| 2222 | if (netpoll_receive_skb(skb)) | 2225 | if (netpoll_receive_skb(skb)) |
| 2223 | return NET_RX_DROP; | 2226 | return NET_RX_DROP; |
diff --git a/net/core/scm.c b/net/core/scm.c index 10f5c65f6a47..ab242cc1acca 100644 --- a/net/core/scm.c +++ b/net/core/scm.c | |||
| @@ -75,6 +75,7 @@ static int scm_fp_copy(struct cmsghdr *cmsg, struct scm_fp_list **fplp) | |||
| 75 | if (!fpl) | 75 | if (!fpl) |
| 76 | return -ENOMEM; | 76 | return -ENOMEM; |
| 77 | *fplp = fpl; | 77 | *fplp = fpl; |
| 78 | INIT_LIST_HEAD(&fpl->list); | ||
| 78 | fpl->count = 0; | 79 | fpl->count = 0; |
| 79 | } | 80 | } |
| 80 | fpp = &fpl->fp[fpl->count]; | 81 | fpp = &fpl->fp[fpl->count]; |
| @@ -106,9 +107,25 @@ void __scm_destroy(struct scm_cookie *scm) | |||
| 106 | 107 | ||
| 107 | if (fpl) { | 108 | if (fpl) { |
| 108 | scm->fp = NULL; | 109 | scm->fp = NULL; |
| 109 | for (i=fpl->count-1; i>=0; i--) | 110 | if (current->scm_work_list) { |
| 110 | fput(fpl->fp[i]); | 111 | list_add_tail(&fpl->list, current->scm_work_list); |
| 111 | kfree(fpl); | 112 | } else { |
| 113 | LIST_HEAD(work_list); | ||
| 114 | |||
| 115 | current->scm_work_list = &work_list; | ||
| 116 | |||
| 117 | list_add(&fpl->list, &work_list); | ||
| 118 | while (!list_empty(&work_list)) { | ||
| 119 | fpl = list_first_entry(&work_list, struct scm_fp_list, list); | ||
| 120 | |||
| 121 | list_del(&fpl->list); | ||
| 122 | for (i=fpl->count-1; i>=0; i--) | ||
| 123 | fput(fpl->fp[i]); | ||
| 124 | kfree(fpl); | ||
| 125 | } | ||
| 126 | |||
| 127 | current->scm_work_list = NULL; | ||
| 128 | } | ||
| 112 | } | 129 | } |
| 113 | } | 130 | } |
| 114 | 131 | ||
| @@ -284,6 +301,7 @@ struct scm_fp_list *scm_fp_dup(struct scm_fp_list *fpl) | |||
| 284 | 301 | ||
| 285 | new_fpl = kmalloc(sizeof(*fpl), GFP_KERNEL); | 302 | new_fpl = kmalloc(sizeof(*fpl), GFP_KERNEL); |
| 286 | if (new_fpl) { | 303 | if (new_fpl) { |
| 304 | INIT_LIST_HEAD(&new_fpl->list); | ||
| 287 | for (i=fpl->count-1; i>=0; i--) | 305 | for (i=fpl->count-1; i>=0; i--) |
| 288 | get_file(fpl->fp[i]); | 306 | get_file(fpl->fp[i]); |
| 289 | memcpy(new_fpl, fpl, sizeof(*fpl)); | 307 | memcpy(new_fpl, fpl, sizeof(*fpl)); |
diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c index eccb7165a80c..c5aca0bb116a 100644 --- a/net/ipv4/tcp.c +++ b/net/ipv4/tcp.c | |||
| @@ -1374,8 +1374,7 @@ int tcp_recvmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg, | |||
| 1374 | sk->sk_state == TCP_CLOSE || | 1374 | sk->sk_state == TCP_CLOSE || |
| 1375 | (sk->sk_shutdown & RCV_SHUTDOWN) || | 1375 | (sk->sk_shutdown & RCV_SHUTDOWN) || |
| 1376 | !timeo || | 1376 | !timeo || |
| 1377 | signal_pending(current) || | 1377 | signal_pending(current)) |
| 1378 | (flags & MSG_PEEK)) | ||
| 1379 | break; | 1378 | break; |
| 1380 | } else { | 1379 | } else { |
| 1381 | if (sock_flag(sk, SOCK_DONE)) | 1380 | if (sock_flag(sk, SOCK_DONE)) |
diff --git a/net/ipv4/xfrm4_state.c b/net/ipv4/xfrm4_state.c index 07735ed280d7..55dc6beab9aa 100644 --- a/net/ipv4/xfrm4_state.c +++ b/net/ipv4/xfrm4_state.c | |||
| @@ -33,6 +33,7 @@ __xfrm4_init_tempsel(struct xfrm_state *x, struct flowi *fl, | |||
| 33 | x->sel.dport_mask = htons(0xffff); | 33 | x->sel.dport_mask = htons(0xffff); |
| 34 | x->sel.sport = xfrm_flowi_sport(fl); | 34 | x->sel.sport = xfrm_flowi_sport(fl); |
| 35 | x->sel.sport_mask = htons(0xffff); | 35 | x->sel.sport_mask = htons(0xffff); |
| 36 | x->sel.family = AF_INET; | ||
| 36 | x->sel.prefixlen_d = 32; | 37 | x->sel.prefixlen_d = 32; |
| 37 | x->sel.prefixlen_s = 32; | 38 | x->sel.prefixlen_s = 32; |
| 38 | x->sel.proto = fl->proto; | 39 | x->sel.proto = fl->proto; |
diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c index eea9542728ca..d9da5eb9dcb2 100644 --- a/net/ipv6/addrconf.c +++ b/net/ipv6/addrconf.c | |||
| @@ -2483,8 +2483,10 @@ static int addrconf_notify(struct notifier_block *this, unsigned long event, | |||
| 2483 | if (!idev && dev->mtu >= IPV6_MIN_MTU) | 2483 | if (!idev && dev->mtu >= IPV6_MIN_MTU) |
| 2484 | idev = ipv6_add_dev(dev); | 2484 | idev = ipv6_add_dev(dev); |
| 2485 | 2485 | ||
| 2486 | if (idev) | 2486 | if (idev) { |
| 2487 | idev->if_flags |= IF_READY; | 2487 | idev->if_flags |= IF_READY; |
| 2488 | run_pending = 1; | ||
| 2489 | } | ||
| 2488 | } else { | 2490 | } else { |
| 2489 | if (!addrconf_qdisc_ok(dev)) { | 2491 | if (!addrconf_qdisc_ok(dev)) { |
| 2490 | /* device is still not ready. */ | 2492 | /* device is still not ready. */ |
diff --git a/net/ipv6/xfrm6_state.c b/net/ipv6/xfrm6_state.c index 89884a4f23aa..60c78cfc2737 100644 --- a/net/ipv6/xfrm6_state.c +++ b/net/ipv6/xfrm6_state.c | |||
| @@ -34,6 +34,7 @@ __xfrm6_init_tempsel(struct xfrm_state *x, struct flowi *fl, | |||
| 34 | x->sel.dport_mask = htons(0xffff); | 34 | x->sel.dport_mask = htons(0xffff); |
| 35 | x->sel.sport = xfrm_flowi_sport(fl); | 35 | x->sel.sport = xfrm_flowi_sport(fl); |
| 36 | x->sel.sport_mask = htons(0xffff); | 36 | x->sel.sport_mask = htons(0xffff); |
| 37 | x->sel.family = AF_INET6; | ||
| 37 | x->sel.prefixlen_d = 128; | 38 | x->sel.prefixlen_d = 128; |
| 38 | x->sel.prefixlen_s = 128; | 39 | x->sel.prefixlen_s = 128; |
| 39 | x->sel.proto = fl->proto; | 40 | x->sel.proto = fl->proto; |
diff --git a/net/netfilter/nf_conntrack_helper.c b/net/netfilter/nf_conntrack_helper.c index 9c06b9f86ad4..c39b6a994133 100644 --- a/net/netfilter/nf_conntrack_helper.c +++ b/net/netfilter/nf_conntrack_helper.c | |||
| @@ -21,6 +21,7 @@ | |||
| 21 | #include <linux/kernel.h> | 21 | #include <linux/kernel.h> |
| 22 | #include <linux/netdevice.h> | 22 | #include <linux/netdevice.h> |
| 23 | #include <linux/rculist.h> | 23 | #include <linux/rculist.h> |
| 24 | #include <linux/rtnetlink.h> | ||
| 24 | 25 | ||
| 25 | #include <net/netfilter/nf_conntrack.h> | 26 | #include <net/netfilter/nf_conntrack.h> |
| 26 | #include <net/netfilter/nf_conntrack_l3proto.h> | 27 | #include <net/netfilter/nf_conntrack_l3proto.h> |
| @@ -167,10 +168,12 @@ void nf_conntrack_helper_unregister(struct nf_conntrack_helper *me) | |||
| 167 | */ | 168 | */ |
| 168 | synchronize_rcu(); | 169 | synchronize_rcu(); |
| 169 | 170 | ||
| 171 | rtnl_lock(); | ||
| 170 | spin_lock_bh(&nf_conntrack_lock); | 172 | spin_lock_bh(&nf_conntrack_lock); |
| 171 | for_each_net(net) | 173 | for_each_net(net) |
| 172 | __nf_conntrack_helper_unregister(me, net); | 174 | __nf_conntrack_helper_unregister(me, net); |
| 173 | spin_unlock_bh(&nf_conntrack_lock); | 175 | spin_unlock_bh(&nf_conntrack_lock); |
| 176 | rtnl_unlock(); | ||
| 174 | } | 177 | } |
| 175 | EXPORT_SYMBOL_GPL(nf_conntrack_helper_unregister); | 178 | EXPORT_SYMBOL_GPL(nf_conntrack_helper_unregister); |
| 176 | 179 | ||
diff --git a/net/netfilter/nf_conntrack_proto.c b/net/netfilter/nf_conntrack_proto.c index a59a307e685d..592d73344d46 100644 --- a/net/netfilter/nf_conntrack_proto.c +++ b/net/netfilter/nf_conntrack_proto.c | |||
| @@ -22,6 +22,7 @@ | |||
| 22 | #include <linux/notifier.h> | 22 | #include <linux/notifier.h> |
| 23 | #include <linux/kernel.h> | 23 | #include <linux/kernel.h> |
| 24 | #include <linux/netdevice.h> | 24 | #include <linux/netdevice.h> |
| 25 | #include <linux/rtnetlink.h> | ||
| 25 | 26 | ||
| 26 | #include <net/netfilter/nf_conntrack.h> | 27 | #include <net/netfilter/nf_conntrack.h> |
| 27 | #include <net/netfilter/nf_conntrack_l3proto.h> | 28 | #include <net/netfilter/nf_conntrack_l3proto.h> |
| @@ -221,8 +222,10 @@ void nf_conntrack_l3proto_unregister(struct nf_conntrack_l3proto *proto) | |||
| 221 | synchronize_rcu(); | 222 | synchronize_rcu(); |
| 222 | 223 | ||
| 223 | /* Remove all contrack entries for this protocol */ | 224 | /* Remove all contrack entries for this protocol */ |
| 225 | rtnl_lock(); | ||
| 224 | for_each_net(net) | 226 | for_each_net(net) |
| 225 | nf_ct_iterate_cleanup(net, kill_l3proto, proto); | 227 | nf_ct_iterate_cleanup(net, kill_l3proto, proto); |
| 228 | rtnl_unlock(); | ||
| 226 | } | 229 | } |
| 227 | EXPORT_SYMBOL_GPL(nf_conntrack_l3proto_unregister); | 230 | EXPORT_SYMBOL_GPL(nf_conntrack_l3proto_unregister); |
| 228 | 231 | ||
| @@ -333,8 +336,10 @@ void nf_conntrack_l4proto_unregister(struct nf_conntrack_l4proto *l4proto) | |||
| 333 | synchronize_rcu(); | 336 | synchronize_rcu(); |
| 334 | 337 | ||
| 335 | /* Remove all contrack entries for this protocol */ | 338 | /* Remove all contrack entries for this protocol */ |
| 339 | rtnl_lock(); | ||
| 336 | for_each_net(net) | 340 | for_each_net(net) |
| 337 | nf_ct_iterate_cleanup(net, kill_l4proto, l4proto); | 341 | nf_ct_iterate_cleanup(net, kill_l4proto, l4proto); |
| 342 | rtnl_unlock(); | ||
| 338 | } | 343 | } |
| 339 | EXPORT_SYMBOL_GPL(nf_conntrack_l4proto_unregister); | 344 | EXPORT_SYMBOL_GPL(nf_conntrack_l4proto_unregister); |
| 340 | 345 | ||
