lkml.org 
[lkml]   [2013]   [Aug]   [2]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[ 11/23] staging: comedi: COMEDI_CANCEL ioctl should wake up read/write
    Date
    3.0-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Ian Abbott <abbotti@mev.co.uk>

    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>

    ---
    drivers/staging/comedi/comedi_fops.c | 7 ++++++-
    1 file changed, 6 insertions(+), 1 deletion(-)

    --- a/drivers/staging/comedi/comedi_fops.c
    +++ b/drivers/staging/comedi/comedi_fops.c
    @@ -1370,6 +1370,7 @@ static int do_cancel_ioctl(struct comedi
    void *file)
    {
    struct comedi_subdevice *s;
    + int ret;

    if (arg >= dev->n_subdevices)
    return -EINVAL;
    @@ -1386,7 +1387,11 @@ static int do_cancel_ioctl(struct comedi
    if (s->busy != file)
    return -EBUSY;

    - return do_cancel(dev, s);
    + ret = do_cancel(dev, s);
    + if (comedi_get_subdevice_runflags(s) & SRF_USER)
    + wake_up_interruptible(&s->async->wait_head);
    +
    + return ret;
    }

    /*



    \
     
     \ /
      Last update: 2013-08-02 14:01    [W:5.604 / U:0.136 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site