lkml.org 
[lkml]   [2012]   [May]   [27]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[ 057/117] USB: cdc-wdm: cannot use dev_printk when device is gone
    3.2-stable review patch.  If anyone has any objections, please let me know.

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

    From: Bjørn Mork <bjorn@mork.no>

    commit 6b0b79d38806481c1c8fffa7c5842f3c83679a42 upstream.

    We cannot dereference a removed USB interface for
    dev_printk. Use pr_debug instead where necessary.

    Flush errors are expected if device is unplugged and are
    therefore best ingored at this point.

    Move the kill_urbs() call in wdm_release with dev_dbg()
    for the non disconnect, as we know it has already been
    called if WDM_DISCONNECTING is set. This does not
    actually fix anything, but keeps the code more consistent.

    Cc: Oliver Neukum <oliver@neukum.org>
    Signed-off-by: Bjørn Mork <bjorn@mork.no>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    [bwh: Backported to 3.2: adjust context]
    Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
    ---
    drivers/usb/class/cdc-wdm.c | 11 +++++++----
    1 file changed, 7 insertions(+), 4 deletions(-)

    --- a/drivers/usb/class/cdc-wdm.c
    +++ b/drivers/usb/class/cdc-wdm.c
    @@ -496,7 +496,9 @@
    struct wdm_device *desc = file->private_data;

    wait_event(desc->wait, !test_bit(WDM_IN_USE, &desc->flags));
    - if (desc->werr < 0)
    +
    + /* cannot dereference desc->intf if WDM_DISCONNECTING */
    + if (desc->werr < 0 && !test_bit(WDM_DISCONNECTING, &desc->flags))
    dev_err(&desc->intf->dev, "Error in flush path: %d\n",
    desc->werr);

    @@ -586,12 +588,13 @@
    mutex_unlock(&desc->wlock);

    if (!desc->count) {
    - dev_dbg(&desc->intf->dev, "wdm_release: cleanup");
    - kill_urbs(desc);
    if (!test_bit(WDM_DISCONNECTING, &desc->flags)) {
    + dev_dbg(&desc->intf->dev, "wdm_release: cleanup");
    + kill_urbs(desc);
    desc->intf->needs_remote_wakeup = 0;
    } else {
    - dev_dbg(&desc->intf->dev, "%s: device gone - cleaning up\n", __func__);
    + /* must avoid dev_printk here as desc->intf is invalid */
    + pr_debug(KBUILD_MODNAME " %s: device gone - cleaning up\n", __func__);
    cleanup(desc);
    }
    }

    --
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

    \
     
     \ /
      Last update: 2012-05-28 08:21    [W:0.031 / U:0.240 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site