diff options
Diffstat (limited to 'drivers/usb/class/usblp.c')
| -rw-r--r-- | drivers/usb/class/usblp.c | 16 | 
1 files changed, 12 insertions, 4 deletions
diff --git a/drivers/usb/class/usblp.c b/drivers/usb/class/usblp.c index c9f6e9758288..f27b4aecff3d 100644 --- a/drivers/usb/class/usblp.c +++ b/drivers/usb/class/usblp.c @@ -494,16 +494,24 @@ static int usblp_release(struct inode *inode, struct file *file)  /* No kernel lock - fine */  static __poll_t usblp_poll(struct file *file, struct poll_table_struct *wait)  { -	__poll_t ret; +	struct usblp *usblp = file->private_data; +	__poll_t ret = 0;  	unsigned long flags; -	struct usblp *usblp = file->private_data;  	/* Should we check file->f_mode & FMODE_WRITE before poll_wait()? */  	poll_wait(file, &usblp->rwait, wait);  	poll_wait(file, &usblp->wwait, wait); + +	mutex_lock(&usblp->mut); +	if (!usblp->present) +		ret |= EPOLLHUP; +	mutex_unlock(&usblp->mut); +  	spin_lock_irqsave(&usblp->lock, flags); -	ret = ((usblp->bidir && usblp->rcomplete) ? EPOLLIN  | EPOLLRDNORM : 0) | -	   ((usblp->no_paper || usblp->wcomplete) ? EPOLLOUT | EPOLLWRNORM : 0); +	if (usblp->bidir && usblp->rcomplete) +		ret |= EPOLLIN  | EPOLLRDNORM; +	if (usblp->no_paper || usblp->wcomplete) +		ret |= EPOLLOUT | EPOLLWRNORM;  	spin_unlock_irqrestore(&usblp->lock, flags);  	return ret;  }  | 
