On Sat, 2013-01-05 at 17:34 +0800, Jason Wang wrote: > Currently, tun_chr_poll() returns POLLERR after waitqueue adding during device > unregistration. This would confuse some of its user such as vhost which assume > when POLLERR is returned, it wasn't added to the waitqueue. Fix this by > returning POLLERR before adding to waitqueue. > > Signed-off-by: Jason Wang <jasow...@redhat.com> > --- > drivers/net/tun.c | 5 +---- > 1 files changed, 1 insertions(+), 4 deletions(-) > > diff --git a/drivers/net/tun.c b/drivers/net/tun.c > index fbd106e..f9c0049 100644 > --- a/drivers/net/tun.c > +++ b/drivers/net/tun.c > @@ -886,7 +886,7 @@ static unsigned int tun_chr_poll(struct file *file, > poll_table *wait) > struct sock *sk; > unsigned int mask = 0; > > - if (!tun) > + if (!tun || tun->dev->reg_state != NETREG_REGISTERED) > return POLLERR; > > sk = tfile->socket.sk; > @@ -903,9 +903,6 @@ static unsigned int tun_chr_poll(struct file *file, > poll_table *wait) > sock_writeable(sk))) > mask |= POLLOUT | POLLWRNORM; > > - if (tun->dev->reg_state != NETREG_REGISTERED) > - mask = POLLERR; > - > tun_put(tun); > return mask; > }
This patch is buggy. First, the caller assuming POLLERR means poll_wait() was not called is wrong. Secondly, you add a ref leak. -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/