|
@@ -712,6 +712,7 @@ static ssize_t macvtap_get_user(struct macvtap_queue *q, struct msghdr *m,
|
|
|
int vnet_hdr_len = 0;
|
|
|
int copylen = 0;
|
|
|
bool zerocopy = false;
|
|
|
+ size_t linear;
|
|
|
|
|
|
if (q->flags & IFF_VNET_HDR) {
|
|
|
vnet_hdr_len = q->vnet_hdr_sz;
|
|
@@ -766,11 +767,14 @@ static ssize_t macvtap_get_user(struct macvtap_queue *q, struct msghdr *m,
|
|
|
copylen = vnet_hdr.hdr_len;
|
|
|
if (!copylen)
|
|
|
copylen = GOODCOPY_LEN;
|
|
|
- } else
|
|
|
+ linear = copylen;
|
|
|
+ } else {
|
|
|
copylen = len;
|
|
|
+ linear = vnet_hdr.hdr_len;
|
|
|
+ }
|
|
|
|
|
|
skb = macvtap_alloc_skb(&q->sk, NET_IP_ALIGN, copylen,
|
|
|
- vnet_hdr.hdr_len, noblock, &err);
|
|
|
+ linear, noblock, &err);
|
|
|
if (!skb)
|
|
|
goto err;
|
|
|
|