staging: comedi: COMEDI_CANCEL ioctl should wake up read/write
authorIan Abbott <abbotti@mev.co.uk>
Mon, 8 Jul 2013 12:36:19 +0000 (13:36 +0100)
committerBen Hutchings <ben@decadent.org.uk>
Fri, 2 Aug 2013 20:15:06 +0000 (22:15 +0200)
commitf6c4c6bd5b80ee078db936a4b40c072a17dcfa1d
tree3d598c7cfa0251417365e72c9e33cca522dd627f
parent281e4f20bb5e0ff3a0aa888911250654a2e87494
staging: comedi: COMEDI_CANCEL ioctl should wake up read/write

commit 69acbaac303e8cb948801a9ddd0ac24e86cc4a1b upstream.

Comedi devices can do blocking read() or write() (or poll()) if an
asynchronous command has been set up, blocking for data (for read()) or
buffer space (for write()).  Various events associated with the
asynchronous command will wake up the blocked reader or writer (or
poller).  It is also possible to force the asynchronous command to
terminate by issuing a `COMEDI_CANCEL` ioctl.  That shuts down the
asynchronous command, but does not currently wake up the blocked reader
or writer (or poller).  If the blocked task could be woken up, it would
see that the command is no longer active and return.  The caller of the
`COMEDI_CANCEL` ioctl could attempt to wake up the blocked task by
sending a signal, but that's a nasty workaround.

Change `do_cancel_ioctl()` to wake up the wait queue after it returns
from `do_cancel()`.  `do_cancel()` can propagate an error return value
from the low-level comedi driver's cancel routine, but it always shuts
the command down regardless, so `do_cancel_ioctl()` can wake up he wait
queue regardless of the return value from `do_cancel()`.

Signed-off-by: Ian Abbott <abbotti@mev.co.uk>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
drivers/staging/comedi/comedi_fops.c