diff options
-rw-r--r-- | include/net/inet_frag.h | 2 | ||||
-rw-r--r-- | net/ipv4/inet_fragment.c | 23 | ||||
-rw-r--r-- | net/ipv4/ip_fragment.c | 23 | ||||
-rw-r--r-- | net/ipv6/netfilter/nf_conntrack_reasm.c | 23 | ||||
-rw-r--r-- | net/ipv6/reassembly.c | 23 |
5 files changed, 28 insertions, 66 deletions
diff --git a/include/net/inet_frag.h b/include/net/inet_frag.h index ada03ba3b341..9902363f5bcc 100644 --- a/include/net/inet_frag.h +++ b/include/net/inet_frag.h | |||
@@ -41,4 +41,6 @@ struct inet_frags { | |||
41 | void inet_frags_init(struct inet_frags *); | 41 | void inet_frags_init(struct inet_frags *); |
42 | void inet_frags_fini(struct inet_frags *); | 42 | void inet_frags_fini(struct inet_frags *); |
43 | 43 | ||
44 | void inet_frag_kill(struct inet_frag_queue *q, struct inet_frags *f); | ||
45 | |||
44 | #endif | 46 | #endif |
diff --git a/net/ipv4/inet_fragment.c b/net/ipv4/inet_fragment.c index 69623ff4e4c6..534eaa8cdcf3 100644 --- a/net/ipv4/inet_fragment.c +++ b/net/ipv4/inet_fragment.c | |||
@@ -42,3 +42,26 @@ void inet_frags_fini(struct inet_frags *f) | |||
42 | { | 42 | { |
43 | } | 43 | } |
44 | EXPORT_SYMBOL(inet_frags_fini); | 44 | EXPORT_SYMBOL(inet_frags_fini); |
45 | |||
46 | static inline void fq_unlink(struct inet_frag_queue *fq, struct inet_frags *f) | ||
47 | { | ||
48 | write_lock(&f->lock); | ||
49 | hlist_del(&fq->list); | ||
50 | list_del(&fq->lru_list); | ||
51 | f->nqueues--; | ||
52 | write_unlock(&f->lock); | ||
53 | } | ||
54 | |||
55 | void inet_frag_kill(struct inet_frag_queue *fq, struct inet_frags *f) | ||
56 | { | ||
57 | if (del_timer(&fq->timer)) | ||
58 | atomic_dec(&fq->refcnt); | ||
59 | |||
60 | if (!(fq->last_in & COMPLETE)) { | ||
61 | fq_unlink(fq, f); | ||
62 | atomic_dec(&fq->refcnt); | ||
63 | fq->last_in |= COMPLETE; | ||
64 | } | ||
65 | } | ||
66 | |||
67 | EXPORT_SYMBOL(inet_frag_kill); | ||
diff --git a/net/ipv4/ip_fragment.c b/net/ipv4/ip_fragment.c index 0dd9a31df212..7416c05dd334 100644 --- a/net/ipv4/ip_fragment.c +++ b/net/ipv4/ip_fragment.c | |||
@@ -108,20 +108,6 @@ int ip_frag_mem(void) | |||
108 | static int ip_frag_reasm(struct ipq *qp, struct sk_buff *prev, | 108 | static int ip_frag_reasm(struct ipq *qp, struct sk_buff *prev, |
109 | struct net_device *dev); | 109 | struct net_device *dev); |
110 | 110 | ||
111 | static __inline__ void __ipq_unlink(struct ipq *qp) | ||
112 | { | ||
113 | hlist_del(&qp->q.list); | ||
114 | list_del(&qp->q.lru_list); | ||
115 | ip4_frags.nqueues--; | ||
116 | } | ||
117 | |||
118 | static __inline__ void ipq_unlink(struct ipq *ipq) | ||
119 | { | ||
120 | write_lock(&ip4_frags.lock); | ||
121 | __ipq_unlink(ipq); | ||
122 | write_unlock(&ip4_frags.lock); | ||
123 | } | ||
124 | |||
125 | static unsigned int ipqhashfn(__be16 id, __be32 saddr, __be32 daddr, u8 prot) | 111 | static unsigned int ipqhashfn(__be16 id, __be32 saddr, __be32 daddr, u8 prot) |
126 | { | 112 | { |
127 | return jhash_3words((__force u32)id << 16 | prot, | 113 | return jhash_3words((__force u32)id << 16 | prot, |
@@ -222,14 +208,7 @@ static __inline__ void ipq_put(struct ipq *ipq, int *work) | |||
222 | */ | 208 | */ |
223 | static void ipq_kill(struct ipq *ipq) | 209 | static void ipq_kill(struct ipq *ipq) |
224 | { | 210 | { |
225 | if (del_timer(&ipq->q.timer)) | 211 | inet_frag_kill(&ipq->q, &ip4_frags); |
226 | atomic_dec(&ipq->q.refcnt); | ||
227 | |||
228 | if (!(ipq->q.last_in & COMPLETE)) { | ||
229 | ipq_unlink(ipq); | ||
230 | atomic_dec(&ipq->q.refcnt); | ||
231 | ipq->q.last_in |= COMPLETE; | ||
232 | } | ||
233 | } | 212 | } |
234 | 213 | ||
235 | /* Memory limiting on fragments. Evictor trashes the oldest | 214 | /* Memory limiting on fragments. Evictor trashes the oldest |
diff --git a/net/ipv6/netfilter/nf_conntrack_reasm.c b/net/ipv6/netfilter/nf_conntrack_reasm.c index 966a88848406..2ebe515d914e 100644 --- a/net/ipv6/netfilter/nf_conntrack_reasm.c +++ b/net/ipv6/netfilter/nf_conntrack_reasm.c | |||
@@ -79,20 +79,6 @@ struct inet_frags_ctl nf_frags_ctl __read_mostly = { | |||
79 | 79 | ||
80 | static struct inet_frags nf_frags; | 80 | static struct inet_frags nf_frags; |
81 | 81 | ||
82 | static __inline__ void __fq_unlink(struct nf_ct_frag6_queue *fq) | ||
83 | { | ||
84 | hlist_del(&fq->q.list); | ||
85 | list_del(&fq->q.lru_list); | ||
86 | nf_frags.nqueues--; | ||
87 | } | ||
88 | |||
89 | static __inline__ void fq_unlink(struct nf_ct_frag6_queue *fq) | ||
90 | { | ||
91 | write_lock(&nf_frags.lock); | ||
92 | __fq_unlink(fq); | ||
93 | write_unlock(&nf_frags.lock); | ||
94 | } | ||
95 | |||
96 | static unsigned int ip6qhashfn(__be32 id, struct in6_addr *saddr, | 82 | static unsigned int ip6qhashfn(__be32 id, struct in6_addr *saddr, |
97 | struct in6_addr *daddr) | 83 | struct in6_addr *daddr) |
98 | { | 84 | { |
@@ -213,14 +199,7 @@ static __inline__ void fq_put(struct nf_ct_frag6_queue *fq, unsigned int *work) | |||
213 | */ | 199 | */ |
214 | static __inline__ void fq_kill(struct nf_ct_frag6_queue *fq) | 200 | static __inline__ void fq_kill(struct nf_ct_frag6_queue *fq) |
215 | { | 201 | { |
216 | if (del_timer(&fq->q.timer)) | 202 | inet_frag_kill(&fq->q, &nf_frags); |
217 | atomic_dec(&fq->q.refcnt); | ||
218 | |||
219 | if (!(fq->q.last_in & COMPLETE)) { | ||
220 | fq_unlink(fq); | ||
221 | atomic_dec(&fq->q.refcnt); | ||
222 | fq->q.last_in |= COMPLETE; | ||
223 | } | ||
224 | } | 203 | } |
225 | 204 | ||
226 | static void nf_ct_frag6_evictor(void) | 205 | static void nf_ct_frag6_evictor(void) |
diff --git a/net/ipv6/reassembly.c b/net/ipv6/reassembly.c index ced1a5f5b776..db129a7a6192 100644 --- a/net/ipv6/reassembly.c +++ b/net/ipv6/reassembly.c | |||
@@ -104,20 +104,6 @@ int ip6_frag_mem(void) | |||
104 | static int ip6_frag_reasm(struct frag_queue *fq, struct sk_buff *prev, | 104 | static int ip6_frag_reasm(struct frag_queue *fq, struct sk_buff *prev, |
105 | struct net_device *dev); | 105 | struct net_device *dev); |
106 | 106 | ||
107 | static __inline__ void __fq_unlink(struct frag_queue *fq) | ||
108 | { | ||
109 | hlist_del(&fq->q.list); | ||
110 | list_del(&fq->q.lru_list); | ||
111 | ip6_frags.nqueues--; | ||
112 | } | ||
113 | |||
114 | static __inline__ void fq_unlink(struct frag_queue *fq) | ||
115 | { | ||
116 | write_lock(&ip6_frags.lock); | ||
117 | __fq_unlink(fq); | ||
118 | write_unlock(&ip6_frags.lock); | ||
119 | } | ||
120 | |||
121 | /* | 107 | /* |
122 | * callers should be careful not to use the hash value outside the ipfrag_lock | 108 | * callers should be careful not to use the hash value outside the ipfrag_lock |
123 | * as doing so could race with ipfrag_hash_rnd being recalculated. | 109 | * as doing so could race with ipfrag_hash_rnd being recalculated. |
@@ -240,14 +226,7 @@ static __inline__ void fq_put(struct frag_queue *fq, int *work) | |||
240 | */ | 226 | */ |
241 | static __inline__ void fq_kill(struct frag_queue *fq) | 227 | static __inline__ void fq_kill(struct frag_queue *fq) |
242 | { | 228 | { |
243 | if (del_timer(&fq->q.timer)) | 229 | inet_frag_kill(&fq->q, &ip6_frags); |
244 | atomic_dec(&fq->q.refcnt); | ||
245 | |||
246 | if (!(fq->q.last_in & COMPLETE)) { | ||
247 | fq_unlink(fq); | ||
248 | atomic_dec(&fq->q.refcnt); | ||
249 | fq->q.last_in |= COMPLETE; | ||
250 | } | ||
251 | } | 230 | } |
252 | 231 | ||
253 | static void ip6_evictor(struct inet6_dev *idev) | 232 | static void ip6_evictor(struct inet6_dev *idev) |