diff options
author | pyu <pyu@nvidia.com> | 2012-06-07 22:55:39 +0800 |
---|---|---|
committer | Varun Colbert <vcolbert@nvidia.com> | 2012-06-15 11:12:34 -0700 |
commit | 23a7238b83e549e511decba6816d25d6bda80bb8 (patch) | |
tree | 50559ac37215a9525d24d74a39bf514416e39844 /drivers | |
parent | c986dcfd3bfae55fbab9d27c2be57464011f7b28 (diff) |
usb: serial: baseband_usb_chr kernel panic
Two threads race for two resources when baseband_usb_close()
get called from a user process
Bug 988188
Change-Id: Ic962640b6414e576d34b7ff6870b21b644837434
Signed-off-by: pyu <pyu@nvidia.com>
Reviewed-on: http://git-master/r/107088
GVS: Gerrit_Virtual_Submit
Reviewed-by: Vinayak Pane <vpane@nvidia.com>
Reviewed-by: Steve Lin <stlin@nvidia.com>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/usb/serial/baseband_usb_chr.c | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/drivers/usb/serial/baseband_usb_chr.c b/drivers/usb/serial/baseband_usb_chr.c index cad33d5b6f49..e6d67243dcfd 100644 --- a/drivers/usb/serial/baseband_usb_chr.c +++ b/drivers/usb/serial/baseband_usb_chr.c @@ -649,10 +649,15 @@ static void baseband_usb_chr_rx_urb_comp(struct urb *urb) } switch (urb->status) { + case 0: + /* success */ + break; case -ENOENT: case -ESHUTDOWN: case -EPROTO: pr_info("%s: link down\n", __func__); + default: + pr_err("%s: urb error status %d\n", __func__, urb->status); return; } @@ -924,6 +929,9 @@ static void baseband_usb_close(struct baseband_usb *usb) if (!usb) return; + /* we need proper lock, maybe...*/ + usb_device_connection = false; + /* free re-usable rx urb + rx urb transfer buffer */ if (usb->usb.rx_urb) { pr_debug("%s: free rx urb\n", __func__); @@ -936,7 +944,6 @@ static void baseband_usb_close(struct baseband_usb *usb) } if (usb->ipc) { - usb_device_connection = false; flush_work_sync(&usb->ipc->work); flush_work_sync(&usb->ipc->rx_work); } |