]> Pileus Git - ~andy/linux/blobdiff - net/ipv6/netfilter/nf_conntrack_reasm.c
net: Add skb_unclone() helper function.
[~andy/linux] / net / ipv6 / netfilter / nf_conntrack_reasm.c
index 3dacecc9906597e3f44fa9475dda0afb8f4981c2..b89a8c3186cd893c641b7813832e22ecafdf45b4 100644 (file)
@@ -319,7 +319,7 @@ found:
        fq->q.meat += skb->len;
        if (payload_len > fq->q.max_size)
                fq->q.max_size = payload_len;
-       atomic_add(skb->truesize, &fq->q.net->mem);
+       add_frag_mem_limit(&fq->q, skb->truesize);
 
        /* The first fragment.
         * nhoffset is obtained from the first fragment, of course.
@@ -328,9 +328,8 @@ found:
                fq->nhoffset = nhoff;
                fq->q.last_in |= INET_FRAG_FIRST_IN;
        }
-       write_lock(&nf_frags.lock);
-       list_move_tail(&fq->q.lru_list, &fq->q.net->lru_list);
-       write_unlock(&nf_frags.lock);
+
+       inet_frag_lru_move(&fq->q);
        return 0;
 
 discard_fq:
@@ -369,7 +368,7 @@ nf_ct_frag6_reasm(struct frag_queue *fq, struct net_device *dev)
        }
 
        /* Head of list must not be cloned. */
-       if (skb_cloned(head) && pskb_expand_head(head, 0, 0, GFP_ATOMIC)) {
+       if (skb_unclone(head, GFP_ATOMIC)) {
                pr_debug("skb is cloned but can't expand head");
                goto out_oom;
        }
@@ -398,7 +397,7 @@ nf_ct_frag6_reasm(struct frag_queue *fq, struct net_device *dev)
                clone->ip_summed = head->ip_summed;
 
                NFCT_FRAG6_CB(clone)->orig = NULL;
-               atomic_add(clone->truesize, &fq->q.net->mem);
+               add_frag_mem_limit(&fq->q, clone->truesize);
        }
 
        /* We have to remove fragment header from datagram and to relocate
@@ -422,7 +421,7 @@ nf_ct_frag6_reasm(struct frag_queue *fq, struct net_device *dev)
                        head->csum = csum_add(head->csum, fp->csum);
                head->truesize += fp->truesize;
        }
-       atomic_sub(head->truesize, &fq->q.net->mem);
+       sub_frag_mem_limit(&fq->q, head->truesize);
 
        head->local_df = 1;
        head->next = NULL;