Skip to content

Commit

Permalink
Input: serio - remove pending events when unregistering driver
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Dmitry Torokhov committed Jun 2, 2008
1 parent f6d6561 commit e8ef434
Showing 1 changed file with 6 additions and 3 deletions.
9 changes: 6 additions & 3 deletions drivers/input/serio/serio.c
Original file line number Diff line number Diff line change
Expand Up @@ -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 serio_event *event;
Expand All @@ -343,7 +344,7 @@ static void serio_remove_pending_events(struct serio *serio)

list_for_each_safe(node, next, &serio_event_list) {
event = list_entry(node, struct serio_event, node);
if (event->object == serio) {
if (event->object == object) {
list_del_init(node);
serio_free_event(event);
}
Expand Down Expand Up @@ -837,7 +838,9 @@ void serio_unregister_driver(struct serio_driver *drv)
struct serio *serio;

mutex_lock(&serio_mutex);

drv->manual_bind = 1; /* so serio_find_driver ignores it */
serio_remove_pending_events(drv);

start_over:
list_for_each_entry(serio, &serio_list, node) {
Expand Down

0 comments on commit e8ef434

Please sign in to comment.