diff options
author | Pavel Emelyanov <xemul@openvz.org> | 2007-10-15 05:37:18 -0400 |
---|---|---|
committer | David S. Miller <davem@sunset.davemloft.net> | 2007-10-15 15:26:41 -0400 |
commit | 277e650ddfc6944ef5f5466fd898b8da7f06cd82 (patch) | |
tree | 39afdd22384c402e08287a3911455a2bbce721b1 /net/ipv4 | |
parent | 04128f233f2b344f3438cde09723e9946463a573 (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>
Diffstat (limited to 'net/ipv4')
-rw-r--r-- | net/ipv4/inet_fragment.c | 23 | ||||
-rw-r--r-- | net/ipv4/ip_fragment.c | 23 |
2 files changed, 24 insertions, 22 deletions
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 |