From: Bjørn Mork Date: Mon, 16 Jan 2012 14:11:57 +0000 (+0100) Subject: USB: cdc-wdm: call wake_up_all to allow driver to shutdown on device removal X-Git-Tag: v3.2.3~24 X-Git-Url: https://git.karo-electronics.de/?a=commitdiff_plain;h=4ac2b6d3cc5d685f8701a392bdea04a401333a11;p=karo-tx-linux.git USB: cdc-wdm: call wake_up_all to allow driver to shutdown on device removal commit 62aaf24dc125d7c55c93e313d15611f152b030c7 upstream. wdm_disconnect() waits for the mutex held by wdm_read() before calling wake_up_all(). This causes a deadlock, preventing device removal to complete. Do the wake_up_all() before we start waiting for the locks. Signed-off-by: Bjørn Mork Cc: Oliver Neukum Cc: stable Signed-off-by: Greg Kroah-Hartman --- diff --git a/drivers/usb/class/cdc-wdm.c b/drivers/usb/class/cdc-wdm.c index 4a29a8068946..d2cda2607bd5 100644 --- a/drivers/usb/class/cdc-wdm.c +++ b/drivers/usb/class/cdc-wdm.c @@ -786,13 +786,13 @@ static void wdm_disconnect(struct usb_interface *intf) /* to terminate pending flushes */ clear_bit(WDM_IN_USE, &desc->flags); spin_unlock_irqrestore(&desc->iuspin, flags); + wake_up_all(&desc->wait); mutex_lock(&desc->rlock); mutex_lock(&desc->wlock); kill_urbs(desc); cancel_work_sync(&desc->rxwork); mutex_unlock(&desc->wlock); mutex_unlock(&desc->rlock); - wake_up_all(&desc->wait); if (!desc->count) cleanup(desc); mutex_unlock(&wdm_mutex);