From: Stefan Achatz Date: Sat, 29 Jan 2011 01:17:30 +0000 (+0100) Subject: HID: hidraw: fix hidraw_disconnect() X-Git-Tag: v2.6.39-rc1~429^2^7~6 X-Git-Url: https://git.karo-electronics.de/?a=commitdiff_plain;h=3a22ebe9cc76acac2511b1d3979a35609924ce42;p=karo-tx-linux.git HID: hidraw: fix hidraw_disconnect() hidraw_disconnect() first sets an entry in hidraw_table to NULL and calls device_destroy() afterwards. The thereby called hidraw_release() tries to read this already cleared value resulting in never removing any device from the list. This got fixed by changing the order of events. Signed-off-by: Stefan Achatz Signed-off-by: Jiri Kosina --- diff --git a/drivers/hid/hidraw.c b/drivers/hid/hidraw.c index 468e87b53ed2..5516ea45ce80 100644 --- a/drivers/hid/hidraw.c +++ b/drivers/hid/hidraw.c @@ -428,12 +428,12 @@ void hidraw_disconnect(struct hid_device *hid) hidraw->exist = 0; + device_destroy(hidraw_class, MKDEV(hidraw_major, hidraw->minor)); + mutex_lock(&minors_lock); hidraw_table[hidraw->minor] = NULL; mutex_unlock(&minors_lock); - device_destroy(hidraw_class, MKDEV(hidraw_major, hidraw->minor)); - if (hidraw->open) { hid_hw_close(hid); wake_up_interruptible(&hidraw->wait);