lkml.org 
[lkml]   [2011]   [Jan]   [12]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4/7] staging: usbip: vhci: refuse to enqueue for dead connections
    Date
    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>
    ---
    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 3a22f65..22b1ad9 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.2.3


    \
     
     \ /
      Last update: 2011-01-12 14:25    [W:0.039 / U:2.092 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site