summaryrefslogtreecommitdiffstats
path: root/drivers/net/tun.c
diff options
context:
space:
mode:
authorKevin Hilman <khilman@linaro.org>2014-01-21 16:55:05 -0800
committerKevin Hilman <khilman@linaro.org>2014-01-21 16:55:17 -0800
commit935b0d622f16538d071af823388c21c2e6f66134 (patch)
treee076fb718a68241d21a73bb338c8e97175187a7e /drivers/net/tun.c
parent310c85476d5047f5ace4d1c527e1bbbc0c7ad672 (diff)
parent30d831156b3a7f249c08cbe457a0d728160db39b (diff)
downloadlinux-stable-935b0d622f16538d071af823388c21c2e6f66134.tar.gz
linux-stable-935b0d622f16538d071af823388c21c2e6f66134.tar.bz2
linux-stable-935b0d622f16538d071af823388c21c2e6f66134.zip
Merge tag 'bcm-for-3.14-dt' of git://github.com/broadcom/bcm11351 into next/dt
From Christian Daudt: Add i2c, usb and clock DT configuration to bcm mobile. * tag 'bcm-for-3.14-dt' of git://github.com/broadcom/bcm11351: (697 commits) clk: bcm281xx: define kona clock binding ARM: dts: add usb udc support to bcm281xx ARM: dts: Specify clocks for timer on bcm11351 Documentation: dt: kona-timer: Add clocks property ARM: dts: Specify clocks for SDHCIs on bcm11351 Documentation: dt: kona-sdhci: Add clocks property ARM: dts: Specify clocks for UARTs on bcm11351 ARM: dts: bcm281xx: Add i2c busses ARM: dts: Declare clocks as fixed on bcm11351 ARM: dts: bcm28155-ap: Enable all the i2c busses +Linux 3.13-rc5 ... Signed-off-by: Kevin Hilman <khilman@linaro.org>
Diffstat (limited to 'drivers/net/tun.c')
-rw-r--r--drivers/net/tun.c18
1 files changed, 11 insertions, 7 deletions
diff --git a/drivers/net/tun.c b/drivers/net/tun.c
index 782e38bfc1ee..7c8343a4f918 100644
--- a/drivers/net/tun.c
+++ b/drivers/net/tun.c
@@ -1184,7 +1184,7 @@ static ssize_t tun_put_user(struct tun_struct *tun,
{
struct tun_pi pi = { 0, skb->protocol };
ssize_t total = 0;
- int vlan_offset = 0;
+ int vlan_offset = 0, copied;
if (!(tun->flags & TUN_NO_PI)) {
if ((len -= sizeof(pi)) < 0)
@@ -1248,6 +1248,8 @@ static ssize_t tun_put_user(struct tun_struct *tun,
total += tun->vnet_hdr_sz;
}
+ copied = total;
+ total += skb->len;
if (!vlan_tx_tag_present(skb)) {
len = min_t(int, skb->len, len);
} else {
@@ -1262,24 +1264,24 @@ static ssize_t tun_put_user(struct tun_struct *tun,
vlan_offset = offsetof(struct vlan_ethhdr, h_vlan_proto);
len = min_t(int, skb->len + VLAN_HLEN, len);
+ total += VLAN_HLEN;
copy = min_t(int, vlan_offset, len);
- ret = skb_copy_datagram_const_iovec(skb, 0, iv, total, copy);
+ ret = skb_copy_datagram_const_iovec(skb, 0, iv, copied, copy);
len -= copy;
- total += copy;
+ copied += copy;
if (ret || !len)
goto done;
copy = min_t(int, sizeof(veth), len);
- ret = memcpy_toiovecend(iv, (void *)&veth, total, copy);
+ ret = memcpy_toiovecend(iv, (void *)&veth, copied, copy);
len -= copy;
- total += copy;
+ copied += copy;
if (ret || !len)
goto done;
}
- skb_copy_datagram_const_iovec(skb, vlan_offset, iv, total, len);
- total += len;
+ skb_copy_datagram_const_iovec(skb, vlan_offset, iv, copied, len);
done:
tun->dev->stats.tx_packets++;
@@ -1356,6 +1358,8 @@ static ssize_t tun_chr_aio_read(struct kiocb *iocb, const struct iovec *iv,
ret = tun_do_read(tun, tfile, iocb, iv, len,
file->f_flags & O_NONBLOCK);
ret = min_t(ssize_t, ret, len);
+ if (ret > 0)
+ iocb->ki_pos = ret;
out:
tun_put(tun);
return ret;