summaryrefslogtreecommitdiff
path: root/drivers/net/tap.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/tap.c')
-rw-r--r--drivers/net/tap.c8
1 files changed, 7 insertions, 1 deletions
diff --git a/drivers/net/tap.c b/drivers/net/tap.c
index ff67d99deb39..2f19fb07bb2d 100644
--- a/drivers/net/tap.c
+++ b/drivers/net/tap.c
@@ -278,9 +278,10 @@ rx_handler_result_t tap_handle_frame(struct sk_buff **pskb)
if (q->flags & IFF_VNET_HDR)
features |= tap->tap_features;
if (netif_needs_gso(skb, features)) {
- struct sk_buff *segs = __skb_gso_segment(skb, features, false);
+ struct sk_buff *segs;
struct sk_buff *next;
+ segs = __skb_gso_segment(skb, features, false, 0);
if (IS_ERR(segs)) {
drop_reason = SKB_DROP_REASON_SKB_GSO_SEG;
goto drop;
@@ -932,6 +933,9 @@ static long tap_ioctl(struct file *file, unsigned int cmd,
if (get_user(u, &ifr->ifr_flags))
return -EFAULT;
+ /* TUNGETIFF may report IFF_DETACH_QUEUE, ignore it here */
+ u &= ~IFF_DETACH_QUEUE;
+
ret = 0;
if ((u & ~TAP_IFFEATURES) != (IFF_NO_PI | IFF_TAP))
ret = -EINVAL;
@@ -950,6 +954,8 @@ static long tap_ioctl(struct file *file, unsigned int cmd,
ret = 0;
u = q->flags;
+ if (!q->enabled)
+ u |= IFF_DETACH_QUEUE;
if (copy_to_user(&ifr->ifr_name, tap->dev->name, IFNAMSIZ) ||
put_user(u, &ifr->ifr_flags))
ret = -EFAULT;