Kaynağa Gözat

HID: fix possible deadlock in usbhid_close()

This patch switches usbhid_close() from flush_scheduled_work() to canceling
the outstanding work. This fixes a possible deadlock due to work taking
the mutex usbhid_close() holds. Lockdep reported the problem.

Signed-off-by: Oliver Neukum <oliver@neukum.org>

--
Signed-off-by: Jiri Kosina <jkosina@suse.cz>
Oliver Neukum 16 yıl önce
ebeveyn
işleme
89092ddd7a
1 değiştirilmiş dosya ile 1 ekleme ve 1 silme
  1. 1 1
      drivers/hid/usbhid/hid-core.c

+ 1 - 1
drivers/hid/usbhid/hid-core.c

@@ -662,8 +662,8 @@ void usbhid_close(struct hid_device *hid)
 	spin_lock_irq(&usbhid->lock);
 	if (!--hid->open) {
 		spin_unlock_irq(&usbhid->lock);
+		hid_cancel_delayed_stuff(usbhid);
 		usb_kill_urb(usbhid->urbin);
-		flush_scheduled_work();
 		usbhid->intf->needs_remote_wakeup = 0;
 	} else {
 		spin_unlock_irq(&usbhid->lock);