Commit b5570ca7 authored by Zhaolong Zhang's avatar Zhaolong Zhang Committed by Greg Kroah-Hartman
Browse files

uio: dismiss waiters on device unregistration



When the device is unregistered, it should wake up the blocking waiters.
Otherwise, they will sleep forever.

Signed-off-by: default avatarZhaolong Zhang <zhangzl2013@126.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 3b1ad360
Loading
Loading
Loading
Loading
+11 −8
Original line number Diff line number Diff line
@@ -569,20 +569,20 @@ static ssize_t uio_read(struct file *filep, char __user *buf,
	ssize_t retval = 0;
	s32 event_count;

	mutex_lock(&idev->info_lock);
	if (!idev->info || !idev->info->irq)
		retval = -EIO;
	mutex_unlock(&idev->info_lock);

	if (retval)
		return retval;

	if (count != sizeof(s32))
		return -EINVAL;

	add_wait_queue(&idev->wait, &wait);

	do {
		mutex_lock(&idev->info_lock);
		if (!idev->info || !idev->info->irq) {
			retval = -EIO;
			mutex_unlock(&idev->info_lock);
			break;
		}
		mutex_unlock(&idev->info_lock);

		set_current_state(TASK_INTERRUPTIBLE);

		event_count = atomic_read(&idev->event);
@@ -1017,6 +1017,9 @@ void uio_unregister_device(struct uio_info *info)
	idev->info = NULL;
	mutex_unlock(&idev->info_lock);

	wake_up_interruptible(&idev->wait);
	kill_fasync(&idev->async_queue, SIGIO, POLL_HUP);

	device_unregister(&idev->dev);

	return;