View | Details | Raw Unified | Return to bug 973 | Differences between
and this patch

Collapse All | Expand All

(-)2.6.0-test4/drivers/input/serio/serio.c (-3 / +16 lines)
Lines 85-90 Link Here
85
static DECLARE_WAIT_QUEUE_HEAD(serio_wait);
85
static DECLARE_WAIT_QUEUE_HEAD(serio_wait);
86
static DECLARE_COMPLETION(serio_exited);
86
static DECLARE_COMPLETION(serio_exited);
87
87
88
static int is_known_serio(struct serio *serio)
89
{
90
	struct serio *s;
91
	
92
	list_for_each_entry(s, &serio_list, node)
93
		if (s == serio)
94
			return 1;
95
	return 0;
96
}
97
88
void serio_handle_events(void)
98
void serio_handle_events(void)
89
{
99
{
90
	struct list_head *node, *next;
100
	struct list_head *node, *next;
Lines 93-109 Link Here
93
	list_for_each_safe(node, next, &serio_event_list) {
103
	list_for_each_safe(node, next, &serio_event_list) {
94
		event = container_of(node, struct serio_event, node);	
104
		event = container_of(node, struct serio_event, node);	
95
105
106
		down(&serio_sem);
107
		if (!is_known_serio(event->serio))
108
			goto event_done;
109
		
96
		switch (event->type) {
110
		switch (event->type) {
97
			case SERIO_RESCAN :
111
			case SERIO_RESCAN :
98
				down(&serio_sem);
99
				if (event->serio->dev && event->serio->dev->disconnect)
112
				if (event->serio->dev && event->serio->dev->disconnect)
100
					event->serio->dev->disconnect(event->serio);
113
					event->serio->dev->disconnect(event->serio);
101
				serio_find_dev(event->serio);
114
				serio_find_dev(event->serio);
102
				up(&serio_sem);
103
				break;
115
				break;
104
			default:
116
			default:
105
				break;
117
				break;
106
		}
118
		}
119
event_done:	
120
		up(&serio_sem);
107
		list_del_init(node);
121
		list_del_init(node);
108
		kfree(event);
122
		kfree(event);
109
	}
123
	}
110

Return to bug 973