aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPavel Emelyanov <xemul@openvz.org>2007-10-15 05:37:18 -0400
committerDavid S. Miller <davem@sunset.davemloft.net>2007-10-15 15:26:41 -0400
commit277e650ddfc6944ef5f5466fd898b8da7f06cd82 (patch)
tree39afdd22384c402e08287a3911455a2bbce721b1
parent04128f233f2b344f3438cde09723e9946463a573 (diff)
[INET]: Consolidate the xxx_frag_kill
Since now all the xxx_frag_kill functions now work with the generic inet_frag_queue data type, this can be moved into a common place. The xxx_unlink() code is moved as well. Signed-off-by: Pavel Emelyanov <xemul@openvz.org> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--include/net/inet_frag.h2
-rw-r--r--net/ipv4/inet_fragment.c23
-rw-r--r--net/ipv4/ip_fragment.c23
-rw-r--r--net/ipv6/netfilter/nf_conntrack_reasm.c23
-rw-r--r--net/ipv6/reassembly.c23
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 {
41void inet_frags_init(struct inet_frags *); 41void inet_frags_init(struct inet_frags *);
42void inet_frags_fini(struct inet_frags *); 42void inet_frags_fini(struct inet_frags *);
43 43
44void 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}
44EXPORT_SYMBOL(inet_frags_fini); 44EXPORT_SYMBOL(inet_frags_fini);
45
46static 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
55void 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
67EXPORT_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)
108static int ip_frag_reasm(struct ipq *qp, struct sk_buff *prev, 108static int ip_frag_reasm(struct ipq *qp, struct sk_buff *prev,
109 struct net_device *dev); 109 struct net_device *dev);
110 110
111static __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
118static __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
125static unsigned int ipqhashfn(__be16 id, __be32 saddr, __be32 daddr, u8 prot) 111static 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 */
223static void ipq_kill(struct ipq *ipq) 209static 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
80static struct inet_frags nf_frags; 80static struct inet_frags nf_frags;
81 81
82static __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
89static __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
96static unsigned int ip6qhashfn(__be32 id, struct in6_addr *saddr, 82static 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 */
214static __inline__ void fq_kill(struct nf_ct_frag6_queue *fq) 200static __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
226static void nf_ct_frag6_evictor(void) 205static 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)
104static int ip6_frag_reasm(struct frag_queue *fq, struct sk_buff *prev, 104static int ip6_frag_reasm(struct frag_queue *fq, struct sk_buff *prev,
105 struct net_device *dev); 105 struct net_device *dev);
106 106
107static __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
114static __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 */
241static __inline__ void fq_kill(struct frag_queue *fq) 227static __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
253static void ip6_evictor(struct inet6_dev *idev) 232static void ip6_evictor(struct inet6_dev *idev)