| From 07d316a22e119fa301fd7dba7f1e1adfd4f72c05 Mon Sep 17 00:00:00 2001 |
| From: Alan Stern <stern@rowland.harvard.edu> |
| Date: Fri, 5 Aug 2016 11:51:30 -0400 |
| Subject: USB: hub: change the locking in hub_activate |
| |
| From: Alan Stern <stern@rowland.harvard.edu> |
| |
| commit 07d316a22e119fa301fd7dba7f1e1adfd4f72c05 upstream. |
| |
| The locking in hub_activate() is not adequate to provide full mutual |
| exclusion with hub_quiesce(). The subroutine locks the hub's |
| usb_interface, but the callers of hub_quiesce() (such as |
| hub_pre_reset() and hub_event()) hold the lock to the hub's |
| usb_device. |
| |
| This patch changes hub_activate() to make it acquire the same lock as |
| those other routines. |
| |
| Signed-off-by: Alan Stern <stern@rowland.harvard.edu> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/usb/core/hub.c | 6 +++--- |
| 1 file changed, 3 insertions(+), 3 deletions(-) |
| |
| --- a/drivers/usb/core/hub.c |
| +++ b/drivers/usb/core/hub.c |
| @@ -1052,7 +1052,7 @@ static void hub_activate(struct usb_hub |
| |
| /* Continue a partial initialization */ |
| if (type == HUB_INIT2 || type == HUB_INIT3) { |
| - device_lock(hub->intfdev); |
| + device_lock(&hdev->dev); |
| |
| /* Was the hub disconnected while we were waiting? */ |
| if (hub->disconnected) |
| @@ -1259,7 +1259,7 @@ static void hub_activate(struct usb_hub |
| queue_delayed_work(system_power_efficient_wq, |
| &hub->init_work, |
| msecs_to_jiffies(delay)); |
| - device_unlock(hub->intfdev); |
| + device_unlock(&hdev->dev); |
| return; /* Continues at init3: below */ |
| } else { |
| msleep(delay); |
| @@ -1282,7 +1282,7 @@ static void hub_activate(struct usb_hub |
| /* Allow autosuspend if it was suppressed */ |
| disconnected: |
| usb_autopm_put_interface_async(to_usb_interface(hub->intfdev)); |
| - device_unlock(hub->intfdev); |
| + device_unlock(&hdev->dev); |
| } |
| |
| kref_put(&hub->kref, hub_release); |