summaryrefslogtreecommitdiffstats
path: root/drivers/net/macvtap.c
diff options
context:
space:
mode:
authorDavid S. Miller <davem@davemloft.net>2013-12-10 22:10:21 -0500
committerDavid S. Miller <davem@davemloft.net>2013-12-10 22:10:21 -0500
commitbbd37626e6be9500e74aa244a3be1a69b6645ea0 (patch)
treee1979b61467a70f0c58e47d3a3f14d99602db526 /drivers/net/macvtap.c
parent730054da3868c35809fd31a4018044ab10b0e215 (diff)
net: Revert macvtap/tun truncation signalling changes.
Jason Wang and Michael S. Tsirkin are still discussing how to properly fix this. Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/macvtap.c')
-rw-r--r--drivers/net/macvtap.c27
1 files changed, 13 insertions, 14 deletions
diff --git a/drivers/net/macvtap.c b/drivers/net/macvtap.c
index 7544a0c686b4..957cc5c3653d 100644
--- a/drivers/net/macvtap.c
+++ b/drivers/net/macvtap.c
@@ -767,14 +767,10 @@ static ssize_t macvtap_put_user(struct macvtap_queue *q,
767 const struct sk_buff *skb, 767 const struct sk_buff *skb,
768 const struct iovec *iv, int len) 768 const struct iovec *iv, int len)
769{ 769{
770 int ret, off; 770 int ret;
771 int vnet_hdr_len = 0; 771 int vnet_hdr_len = 0;
772 int vlan_offset = 0; 772 int vlan_offset = 0;
773 int copied; 773 int copied;
774 struct {
775 __be16 h_vlan_proto;
776 __be16 h_vlan_TCI;
777 } veth;
778 774
779 if (q->flags & IFF_VNET_HDR) { 775 if (q->flags & IFF_VNET_HDR) {
780 struct virtio_net_hdr vnet_hdr; 776 struct virtio_net_hdr vnet_hdr;
@@ -789,13 +785,16 @@ static ssize_t macvtap_put_user(struct macvtap_queue *q,
789 if (memcpy_toiovecend(iv, (void *)&vnet_hdr, 0, sizeof(vnet_hdr))) 785 if (memcpy_toiovecend(iv, (void *)&vnet_hdr, 0, sizeof(vnet_hdr)))
790 return -EFAULT; 786 return -EFAULT;
791 } 787 }
792 off = copied = vnet_hdr_len; 788 copied = vnet_hdr_len;
793 789
794 if (!vlan_tx_tag_present(skb)) 790 if (!vlan_tx_tag_present(skb))
795 len = min_t(int, skb->len, len); 791 len = min_t(int, skb->len, len);
796 else { 792 else {
797 int copy; 793 int copy;
798 794 struct {
795 __be16 h_vlan_proto;
796 __be16 h_vlan_TCI;
797 } veth;
799 veth.h_vlan_proto = skb->vlan_proto; 798 veth.h_vlan_proto = skb->vlan_proto;
800 veth.h_vlan_TCI = htons(vlan_tx_tag_get(skb)); 799 veth.h_vlan_TCI = htons(vlan_tx_tag_get(skb));
801 800
@@ -803,22 +802,22 @@ static ssize_t macvtap_put_user(struct macvtap_queue *q,
803 len = min_t(int, skb->len + VLAN_HLEN, len); 802 len = min_t(int, skb->len + VLAN_HLEN, len);
804 803
805 copy = min_t(int, vlan_offset, len); 804 copy = min_t(int, vlan_offset, len);
806 ret = skb_copy_datagram_const_iovec(skb, 0, iv, off, copy); 805 ret = skb_copy_datagram_const_iovec(skb, 0, iv, copied, copy);
807 len -= copy; 806 len -= copy;
808 off += copy; 807 copied += copy;
809 if (ret || !len) 808 if (ret || !len)
810 goto done; 809 goto done;
811 810
812 copy = min_t(int, sizeof(veth), len); 811 copy = min_t(int, sizeof(veth), len);
813 ret = memcpy_toiovecend(iv, (void *)&veth, off, copy); 812 ret = memcpy_toiovecend(iv, (void *)&veth, copied, copy);
814 len -= copy; 813 len -= copy;
815 off += copy; 814 copied += copy;
816 if (ret || !len) 815 if (ret || !len)
817 goto done; 816 goto done;
818 } 817 }
819 818
820 ret = skb_copy_datagram_const_iovec(skb, vlan_offset, iv, off, len); 819 ret = skb_copy_datagram_const_iovec(skb, vlan_offset, iv, copied, len);
821 copied += skb->len + (vlan_offset ? sizeof(veth) : 0); 820 copied += len;
822 821
823done: 822done:
824 return ret ? ret : copied; 823 return ret ? ret : copied;
@@ -876,7 +875,7 @@ static ssize_t macvtap_aio_read(struct kiocb *iocb, const struct iovec *iv,
876 } 875 }
877 876
878 ret = macvtap_do_read(q, iocb, iv, len, file->f_flags & O_NONBLOCK); 877 ret = macvtap_do_read(q, iocb, iv, len, file->f_flags & O_NONBLOCK);
879 ret = min_t(ssize_t, ret, len); 878 ret = min_t(ssize_t, ret, len); /* XXX copied from tun.c. Why? */
880 if (ret > 0) 879 if (ret > 0)
881 iocb->ki_pos = ret; 880 iocb->ki_pos = ret;
882out: 881out: