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) |
