]> asedeno.scripts.mit.edu Git - linux.git/blobdiff - net/ipv4/inet_fragment.c
Merge tag 'for-linus-20180906' of git://git.kernel.dk/linux-block
[linux.git] / net / ipv4 / inet_fragment.c
index 0d70608cc2e18bfa0df35f331e12fbe9b45b168b..bcb11f3a27c0c34115af05034a5a20f57842eb0a 100644 (file)
@@ -20,6 +20,7 @@
 #include <linux/skbuff.h>
 #include <linux/rtnetlink.h>
 #include <linux/slab.h>
+#include <linux/rhashtable.h>
 
 #include <net/sock.h>
 #include <net/inet_frag.h>
@@ -136,12 +137,16 @@ void inet_frag_destroy(struct inet_frag_queue *q)
        fp = q->fragments;
        nf = q->net;
        f = nf->f;
-       while (fp) {
-               struct sk_buff *xp = fp->next;
-
-               sum_truesize += fp->truesize;
-               kfree_skb(fp);
-               fp = xp;
+       if (fp) {
+               do {
+                       struct sk_buff *xp = fp->next;
+
+                       sum_truesize += fp->truesize;
+                       kfree_skb(fp);
+                       fp = xp;
+               } while (fp);
+       } else {
+               sum_truesize = inet_frag_rbtree_purge(&q->rb_fragments);
        }
        sum = sum_truesize + f->qsize;