diff options
Diffstat (limited to 'include/net/sock.h')
-rw-r--r-- | include/net/sock.h | 10 |
1 files changed, 6 insertions, 4 deletions
diff --git a/include/net/sock.h b/include/net/sock.h index 5504fb9fa88a..567e468d7492 100644 --- a/include/net/sock.h +++ b/include/net/sock.h | |||
@@ -1235,14 +1235,16 @@ static inline struct sk_buff *sk_stream_alloc_pskb(struct sock *sk, | |||
1235 | gfp_t gfp) | 1235 | gfp_t gfp) |
1236 | { | 1236 | { |
1237 | struct sk_buff *skb; | 1237 | struct sk_buff *skb; |
1238 | int hdr_len; | ||
1239 | 1238 | ||
1240 | hdr_len = SKB_DATA_ALIGN(sk->sk_prot->max_header); | 1239 | skb = alloc_skb_fclone(size + sk->sk_prot->max_header, gfp); |
1241 | skb = alloc_skb_fclone(size + hdr_len, gfp); | ||
1242 | if (skb) { | 1240 | if (skb) { |
1243 | skb->truesize += mem; | 1241 | skb->truesize += mem; |
1244 | if (sk_stream_wmem_schedule(sk, skb->truesize)) { | 1242 | if (sk_stream_wmem_schedule(sk, skb->truesize)) { |
1245 | skb_reserve(skb, hdr_len); | 1243 | /* |
1244 | * Make sure that we have exactly size bytes | ||
1245 | * available to the caller, no more, no less. | ||
1246 | */ | ||
1247 | skb_reserve(skb, skb_tailroom(skb) - size); | ||
1246 | return skb; | 1248 | return skb; |
1247 | } | 1249 | } |
1248 | __kfree_skb(skb); | 1250 | __kfree_skb(skb); |