diff options
author | Ian Abbott <abbotti@mev.co.uk> | 2013-11-08 15:03:27 (GMT) |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2013-11-12 00:16:44 (GMT) |
commit | 8da8c86f52e5487adfa2e3bae4d539e46f2714dd (patch) | |
tree | 8cbb6d03b707d51632644d57246aa47ebcd84449 /drivers/staging/comedi/comedi_fops.c | |
parent | 3867e20db4823c733710f11b65606a9ed7d297c2 (diff) | |
download | linux-8da8c86f52e5487adfa2e3bae4d539e46f2714dd.tar.xz |
staging: comedi: wake up async waiters when become non-busy
Wake up all waiters on the comedi subdevice's async wait queue whenever
the subdevice is marked "non-busy". This happens when an asynchronous
command is cancelled or when a command is terminated and all data has
been read or written. Note: use `wake_up_interruptible_all()` as we
only use interruptible waits.
Remove the call to `wake_up_interruptible()` from `do_cancel_ioctl()` as
it will call `wake_up_interruptible_all()` indirectly via `do_cancel()`
and `do_become_nonbusy()`.
Signed-off-by: Ian Abbott <abbotti@mev.co.uk>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/staging/comedi/comedi_fops.c')
-rw-r--r-- | drivers/staging/comedi/comedi_fops.c | 6 |
1 files changed, 3 insertions, 3 deletions
diff --git a/drivers/staging/comedi/comedi_fops.c b/drivers/staging/comedi/comedi_fops.c index a1705ed..9c85f01 100644 --- a/drivers/staging/comedi/comedi_fops.c +++ b/drivers/staging/comedi/comedi_fops.c @@ -563,12 +563,13 @@ static void do_become_nonbusy(struct comedi_device *dev, async->inttrig = NULL; kfree(async->cmd.chanlist); async->cmd.chanlist = NULL; + s->busy = NULL; + wake_up_interruptible_all(&s->async->wait_head); } else { dev_err(dev->class_dev, "BUG: (?) do_become_nonbusy called with async=NULL\n"); + s->busy = NULL; } - - s->busy = NULL; } static int do_cancel(struct comedi_device *dev, struct comedi_subdevice *s) @@ -1700,7 +1701,6 @@ static int do_cancel_ioctl(struct comedi_device *dev, unsigned int arg, return -EBUSY; ret = do_cancel(dev, s); - wake_up_interruptible(&s->async->wait_head); return ret; } |