Input: serio - remove pending events when unregistering driver
That fixes an opps when driver is repeatedly loaded and unloaded in a tight loop. Tested-by: Roland Kletzing <devzero@web.de> Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
This commit is contained in:
parent
f6d65610df
commit
e8ef434709
|
@ -331,9 +331,10 @@ static void serio_handle_event(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Remove all events that have been submitted for a given serio port.
|
* Remove all events that have been submitted for a given
|
||||||
|
* object, be it serio port or driver.
|
||||||
*/
|
*/
|
||||||
static void serio_remove_pending_events(struct serio *serio)
|
static void serio_remove_pending_events(void *object)
|
||||||
{
|
{
|
||||||
struct list_head *node, *next;
|
struct list_head *node, *next;
|
||||||
struct serio_event *event;
|
struct serio_event *event;
|
||||||
|
@ -343,7 +344,7 @@ static void serio_remove_pending_events(struct serio *serio)
|
||||||
|
|
||||||
list_for_each_safe(node, next, &serio_event_list) {
|
list_for_each_safe(node, next, &serio_event_list) {
|
||||||
event = list_entry(node, struct serio_event, node);
|
event = list_entry(node, struct serio_event, node);
|
||||||
if (event->object == serio) {
|
if (event->object == object) {
|
||||||
list_del_init(node);
|
list_del_init(node);
|
||||||
serio_free_event(event);
|
serio_free_event(event);
|
||||||
}
|
}
|
||||||
|
@ -837,7 +838,9 @@ void serio_unregister_driver(struct serio_driver *drv)
|
||||||
struct serio *serio;
|
struct serio *serio;
|
||||||
|
|
||||||
mutex_lock(&serio_mutex);
|
mutex_lock(&serio_mutex);
|
||||||
|
|
||||||
drv->manual_bind = 1; /* so serio_find_driver ignores it */
|
drv->manual_bind = 1; /* so serio_find_driver ignores it */
|
||||||
|
serio_remove_pending_events(drv);
|
||||||
|
|
||||||
start_over:
|
start_over:
|
||||||
list_for_each_entry(serio, &serio_list, node) {
|
list_for_each_entry(serio, &serio_list, node) {
|
||||||
|
|
Loading…
Reference in New Issue