| From 531fc2f9a8e67276c7888542d60581f15124b02d Mon Sep 17 00:00:00 2001 |
| From: Max Vozeler <max@vozeler.com> |
| Date: Wed, 12 Jan 2011 15:02:05 +0200 |
| Subject: [PATCH] staging: usbip: vhci: use urb->dev->portnum to find port |
| |
| commit 01446ef5af4e8802369bf4d257806e24345a9371 upstream. |
| |
| The access to pending_port was racy when two devices |
| were being attached at the same time. |
| |
| 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> |
| |
| diff --git a/drivers/staging/usbip/vhci.h b/drivers/staging/usbip/vhci.h |
| index ad3a19d..57f7946 100644 |
| --- a/drivers/staging/usbip/vhci.h |
| +++ b/drivers/staging/usbip/vhci.h |
| @@ -100,9 +100,6 @@ struct vhci_hcd { |
| * But, the index of this array begins from 0. |
| */ |
| struct vhci_device vdev[VHCI_NPORTS]; |
| - |
| - /* vhci_device which has not been assiged its address yet */ |
| - int pending_port; |
| }; |
| |
| |
| diff --git a/drivers/staging/usbip/vhci_hcd.c b/drivers/staging/usbip/vhci_hcd.c |
| index 006d5f7..fd4cc48 100644 |
| --- a/drivers/staging/usbip/vhci_hcd.c |
| +++ b/drivers/staging/usbip/vhci_hcd.c |
| @@ -138,8 +138,6 @@ void rh_port_connect(int rhport, enum usb_device_speed speed) |
| * the_controller->vdev[rhport].ud.status = VDEV_CONNECT; |
| * spin_unlock(&the_controller->vdev[rhport].ud.lock); */ |
| |
| - the_controller->pending_port = rhport; |
| - |
| spin_unlock_irqrestore(&the_controller->lock, flags); |
| |
| usb_hcd_poll_rh_status(vhci_to_hcd(the_controller)); |
| @@ -575,7 +573,7 @@ static int vhci_urb_enqueue(struct usb_hcd *hcd, struct urb *urb, |
| return urb->status; |
| } |
| |
| - vdev = port_to_vdev(the_controller->pending_port); |
| + vdev = port_to_vdev(urb->dev->portnum-1); |
| |
| /* refuse enqueue for dead connection */ |
| spin_lock(&vdev->ud.lock); |
| -- |
| 1.7.4.4 |
| |