[media] lirc: might sleep error in lirc_dev_fop_read
authorSean Young <sean@mess.org>
Mon, 31 Oct 2016 17:52:25 +0000 (15:52 -0200)
committerMauro Carvalho Chehab <mchehab@s-opensource.com>
Mon, 21 Nov 2016 15:19:08 +0000 (13:19 -0200)
[  101.457944] ------------[ cut here ]------------
[  101.457954] WARNING: CPU: 3 PID: 1819 at kernel/sched/core.c:7708 __might_sleep+0x7e/0x80
[  101.457960] do not call blocking ops when !TASK_RUNNING; state=1 set at [<ffffffffc0364bc2>] lirc_dev_fop_read+0x292/0x4e0 [lirc_dev]

Signed-off-by: Sean Young <sean@mess.org>
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
drivers/media/rc/lirc_dev.c

index 809a8671e3d6c12092c1772469ff103d0fa4b67b..bb2f47a21d682c0c0c6ea20b16c9c59af03cdde7 100644 (file)
@@ -681,7 +681,6 @@ ssize_t lirc_dev_fop_read(struct file *file,
         * between while condition checking and scheduling)
         */
        add_wait_queue(&ir->buf->wait_poll, &wait);
-       set_current_state(TASK_INTERRUPTIBLE);
 
        /*
         * while we didn't provide 'length' bytes, device is opened in blocking
@@ -706,13 +705,13 @@ ssize_t lirc_dev_fop_read(struct file *file,
                        }
 
                        mutex_unlock(&ir->irctl_lock);
-                       schedule();
                        set_current_state(TASK_INTERRUPTIBLE);
+                       schedule();
+                       set_current_state(TASK_RUNNING);
 
                        if (mutex_lock_interruptible(&ir->irctl_lock)) {
                                ret = -ERESTARTSYS;
                                remove_wait_queue(&ir->buf->wait_poll, &wait);
-                               set_current_state(TASK_RUNNING);
                                goto out_unlocked;
                        }
 
@@ -732,7 +731,6 @@ ssize_t lirc_dev_fop_read(struct file *file,
        }
 
        remove_wait_queue(&ir->buf->wait_poll, &wait);
-       set_current_state(TASK_RUNNING);
 
 out_locked:
        mutex_unlock(&ir->irctl_lock);