lkml.org 
[lkml]   [2011]   [Jun]   [23]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[34-longterm 127/247] staging: usbip: vhci: refuse to enqueue for dead connections
    Date
    From: Max Vozeler <max@vozeler.com>

    -------------------
    This is a commit scheduled for the next v2.6.34 longterm release.
    If you see a problem with using this for longterm, please comment.
    -------------------

    commit 6d212153a838354078cc7d96f9bb23b7d1fd3d1b upstream.

    There can be requests to enqueue URBs while we are shutting
    down a connection.

    Signed-off-by: Max Vozeler <max@vozeler.com>
    Tested-by: Mark Wehby <MWehby@luxotticaRetail.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
    Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com>
    ---
    drivers/staging/usbip/vhci_hcd.c | 15 +++++++++++++--
    1 files changed, 13 insertions(+), 2 deletions(-)

    diff --git a/drivers/staging/usbip/vhci_hcd.c b/drivers/staging/usbip/vhci_hcd.c
    index 9878e5d..006d5f7 100644
    --- a/drivers/staging/usbip/vhci_hcd.c
    +++ b/drivers/staging/usbip/vhci_hcd.c
    @@ -559,6 +559,7 @@ static int vhci_urb_enqueue(struct usb_hcd *hcd, struct urb *urb,
    struct device *dev = &urb->dev->dev;
    int ret = 0;
    unsigned long flags;
    + struct vhci_device *vdev;

    usbip_dbg_vhci_hc("enter, usb_hcd %p urb %p mem_flags %d\n",
    hcd, urb, mem_flags);
    @@ -574,6 +575,18 @@ static int vhci_urb_enqueue(struct usb_hcd *hcd, struct urb *urb,
    return urb->status;
    }

    + vdev = port_to_vdev(the_controller->pending_port);
    +
    + /* refuse enqueue for dead connection */
    + spin_lock(&vdev->ud.lock);
    + if (vdev->ud.status == VDEV_ST_NULL || vdev->ud.status == VDEV_ST_ERROR) {
    + usbip_uerr("enqueue for inactive port %d\n", vdev->rhport);
    + spin_unlock(&vdev->ud.lock);
    + spin_unlock_irqrestore(&the_controller->lock, flags);
    + return -ENODEV;
    + }
    + spin_unlock(&vdev->ud.lock);
    +
    ret = usb_hcd_link_urb_to_ep(hcd, urb);
    if (ret)
    goto no_need_unlink;
    @@ -592,8 +605,6 @@ static int vhci_urb_enqueue(struct usb_hcd *hcd, struct urb *urb,
    __u8 type = usb_pipetype(urb->pipe);
    struct usb_ctrlrequest *ctrlreq =
    (struct usb_ctrlrequest *) urb->setup_packet;
    - struct vhci_device *vdev =
    - port_to_vdev(the_controller->pending_port);

    if (type != PIPE_CONTROL || !ctrlreq) {
    dev_err(dev, "invalid request to devnum 0\n");
    --
    1.7.4.4


    \
     
     \ /
      Last update: 2011-06-23 20:13    [W:4.078 / U:0.060 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site