On Fri, May 18, 2018 at 09:00:43PM +0800, Jason Wang wrote:
We return -EIO on device down but can not raise EPOLLOUT after it wasIsn't this racy? What if flag is cleared at this point?
up. This may confuse user like vhost which expects tuntap to raise
EPOLLOUT to re-enable its TX routine after tuntap is down. This could
be easily reproduced by transmitting packets from VM while down and up
the tap device. Fixing this by set SOCKWQ_ASYNC_NOSPACE on -EIO.
Cc: Hannes Frederic Sowa <hannes@xxxxxxxxxxxxxxxxxxx>
Cc: Eric Dumazet <edumazet@xxxxxxxxxx>
Fixes: 1bd4978a88ac2 ("tun: honor IFF_UP in tun_get_user()")
Signed-off-by: Jason Wang <jasowang@xxxxxxxxxx>
---
drivers/net/tun.c | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/drivers/net/tun.c b/drivers/net/tun.c
index d45ac37..1b29761 100644
--- a/drivers/net/tun.c
+++ b/drivers/net/tun.c
@@ -1734,8 +1734,10 @@ static ssize_t tun_get_user(struct tun_struct *tun, struct tun_file *tfile,
int skb_xdp = 1;
bool frags = tun_napi_frags_enabled(tun);
- if (!(tun->dev->flags & IFF_UP))
+ if (!(tun->dev->flags & IFF_UP)) {
+ set_bit(SOCKWQ_ASYNC_NOSPACE, &tfile->socket.flags);
return -EIO;
+ }
if (!(tun->flags & IFF_NO_PI)) {
if (len < sizeof(pi))
--
2.7.4