summaryrefslogtreecommitdiffstats
path: root/drivers/staging/comedi/comedi_fops.c
diff options
context:
space:
mode:
authorIan Abbott2013-11-08 16:03:27 +0100
committerGreg Kroah-Hartman2013-11-12 01:16:44 +0100
commit8da8c86f52e5487adfa2e3bae4d539e46f2714dd (patch)
tree8cbb6d03b707d51632644d57246aa47ebcd84449 /drivers/staging/comedi/comedi_fops.c
parentstaging: comedi: cleanup_device() -> comedi_device_detach_cleanup() (diff)
downloadkernel-qcow2-linux-8da8c86f52e5487adfa2e3bae4d539e46f2714dd.tar.gz
kernel-qcow2-linux-8da8c86f52e5487adfa2e3bae4d539e46f2714dd.tar.xz
kernel-qcow2-linux-8da8c86f52e5487adfa2e3bae4d539e46f2714dd.zip
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.c6
1 files changed, 3 insertions, 3 deletions
diff --git a/drivers/staging/comedi/comedi_fops.c b/drivers/staging/comedi/comedi_fops.c
index a1705ed0b844..9c85f01e847b 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;
}