From 30b074342e7fabe0e398e892ead75b366c5ab034 Mon Sep 17 00:00:00 2001 From: Herbert Xu Date: Mon, 28 Jan 2008 20:45:20 -0800 Subject: [PATCH] --- yaml --- r: 81855 b: refs/heads/master c: 29ffe1a5c52dae13b6efead97aab9b058f38fce4 h: refs/heads/master i: 81853: 95b789790bb4191af7792fb4221327c42bc9048f 81851: 3baa78f16325ffb4513202f22be19b237a9e4d28 81847: 9cf2f53d14f573cd6c1523a37d5787dea6fa276f 81839: 160d88109f3d5673051cecdcb0090cc3220938a2 81823: bcfc5a6bca479473bd07f0d6c817f1f2a1bb72bc 81791: 3c489d3d0d77f4f86dfc7820e68af0765e02a8d1 v: v3 --- [refs] | 2 +- trunk/net/ipv4/ip_output.c | 4 +++- trunk/net/ipv6/ip6_output.c | 4 +++- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/[refs] b/[refs] index b5f841b341c6..826162ca4a99 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 1987e7b4855fcb6a866d3279ee9f2890491bc34d +refs/heads/master: 29ffe1a5c52dae13b6efead97aab9b058f38fce4 diff --git a/trunk/net/ipv4/ip_output.c b/trunk/net/ipv4/ip_output.c index 18070ca65771..6e4d5f493bf9 100644 --- a/trunk/net/ipv4/ip_output.c +++ b/trunk/net/ipv4/ip_output.c @@ -476,6 +476,7 @@ int ip_fragment(struct sk_buff *skb, int (*output)(struct sk_buff*)) if (skb_shinfo(skb)->frag_list) { struct sk_buff *frag; int first_len = skb_pagelen(skb); + int truesizes = 0; if (first_len - hlen > mtu || ((first_len - hlen) & 7) || @@ -499,7 +500,7 @@ int ip_fragment(struct sk_buff *skb, int (*output)(struct sk_buff*)) sock_hold(skb->sk); frag->sk = skb->sk; frag->destructor = sock_wfree; - skb->truesize -= frag->truesize; + truesizes += frag->truesize; } } @@ -510,6 +511,7 @@ int ip_fragment(struct sk_buff *skb, int (*output)(struct sk_buff*)) frag = skb_shinfo(skb)->frag_list; skb_shinfo(skb)->frag_list = NULL; skb->data_len = first_len - skb_headlen(skb); + skb->truesize -= truesizes; skb->len = first_len; iph->tot_len = htons(first_len); iph->frag_off = htons(IP_MF); diff --git a/trunk/net/ipv6/ip6_output.c b/trunk/net/ipv6/ip6_output.c index 15c4f6cee3e6..cfe9e707883c 100644 --- a/trunk/net/ipv6/ip6_output.c +++ b/trunk/net/ipv6/ip6_output.c @@ -636,6 +636,7 @@ static int ip6_fragment(struct sk_buff *skb, int (*output)(struct sk_buff *)) if (skb_shinfo(skb)->frag_list) { int first_len = skb_pagelen(skb); + int truesizes = 0; if (first_len - hlen > mtu || ((first_len - hlen) & 7) || @@ -658,7 +659,7 @@ static int ip6_fragment(struct sk_buff *skb, int (*output)(struct sk_buff *)) sock_hold(skb->sk); frag->sk = skb->sk; frag->destructor = sock_wfree; - skb->truesize -= frag->truesize; + truesizes += frag->truesize; } } @@ -689,6 +690,7 @@ static int ip6_fragment(struct sk_buff *skb, int (*output)(struct sk_buff *)) first_len = skb_pagelen(skb); skb->data_len = first_len - skb_headlen(skb); + skb->truesize -= truesizes; skb->len = first_len; ipv6_hdr(skb)->payload_len = htons(first_len - sizeof(struct ipv6hdr));