diff options
author | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2016-02-20 17:19:34 -0500 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2016-02-20 17:19:34 -0500 |
commit | e5bdfd50d6f76077bf8441d130c606229e100d40 (patch) | |
tree | 21f50b8810fb5077c9fe5cf08f65ff7d4e1cfea9 | |
parent | f9a96d2e7e46ed1ece71cf5b34ad9fe2492bacc5 (diff) |
Revert "usb: hub: do not clear BOS field during reset device"
This reverts commit d8f00cd685f5c8e0def8593e520a7fef12c22407.
Tony writes:
This upstream commit is causing an oops:
d8f00cd685f5 ("usb: hub: do not clear BOS field during reset device")
This patch has already been included in several -stable kernels. Here
are the affected kernels:
4.5.0-rc4 (current git)
4.4.2
4.3.6 (currently in review)
4.1.18
3.18.27
3.14.61
How to reproduce the problem:
Boot kernel with slub debugging enabled (otherwise memory corruption
will cause random oopses later instead of immediately)
Plug in USB 3.0 disk to xhci USB 3.0 port
dd if=/dev/sdc of=/dev/null bs=65536
(where /dev/sdc is the USB 3.0 disk)
Unplug USB cable while dd is still going
Oops is immediate:
Reported-by: Tony Battersby <tonyb@cybernetics.com>
Cc: Du, Changbin <changbin.du@intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-rw-r--r-- | drivers/usb/core/hub.c | 8 |
1 files changed, 3 insertions, 5 deletions
diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c index 350dcd9af5d8..51b436918f78 100644 --- a/drivers/usb/core/hub.c +++ b/drivers/usb/core/hub.c | |||
@@ -5401,6 +5401,7 @@ static int usb_reset_and_verify_device(struct usb_device *udev) | |||
5401 | } | 5401 | } |
5402 | 5402 | ||
5403 | bos = udev->bos; | 5403 | bos = udev->bos; |
5404 | udev->bos = NULL; | ||
5404 | 5405 | ||
5405 | for (i = 0; i < SET_CONFIG_TRIES; ++i) { | 5406 | for (i = 0; i < SET_CONFIG_TRIES; ++i) { |
5406 | 5407 | ||
@@ -5493,11 +5494,8 @@ done: | |||
5493 | usb_set_usb2_hardware_lpm(udev, 1); | 5494 | usb_set_usb2_hardware_lpm(udev, 1); |
5494 | usb_unlocked_enable_lpm(udev); | 5495 | usb_unlocked_enable_lpm(udev); |
5495 | usb_enable_ltm(udev); | 5496 | usb_enable_ltm(udev); |
5496 | /* release the new BOS descriptor allocated by hub_port_init() */ | 5497 | usb_release_bos_descriptor(udev); |
5497 | if (udev->bos != bos) { | 5498 | udev->bos = bos; |
5498 | usb_release_bos_descriptor(udev); | ||
5499 | udev->bos = bos; | ||
5500 | } | ||
5501 | return 0; | 5499 | return 0; |
5502 | 5500 | ||
5503 | re_enumerate: | 5501 | re_enumerate: |