diff options
author | Stefan Achatz <erazor_de@users.sourceforge.net> | 2011-01-29 02:17:30 +0100 |
---|---|---|
committer | Jiri Kosina <jkosina@suse.cz> | 2011-02-01 11:16:51 +0100 |
commit | 3a22ebe9cc76acac2511b1d3979a35609924ce42 (patch) | |
tree | e757b49cfcc9fa3fb5bc0652f1594a12281ce97b /drivers | |
parent | 581548db3b3c0f6e25b500329eb02e3c72e7acbe (diff) | |
download | linux-3a22ebe9cc76acac2511b1d3979a35609924ce42.tar.gz linux-3a22ebe9cc76acac2511b1d3979a35609924ce42.tar.bz2 linux-3a22ebe9cc76acac2511b1d3979a35609924ce42.zip |
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 <erazor_de@users.sourceforge.net>
Signed-off-by: Jiri Kosina <jkosina@suse.cz>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/hid/hidraw.c | 4 |
1 files changed, 2 insertions, 2 deletions
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); |