@@ -98,14 +98,15 @@ static int uinput_request_reserve_slot(struct uinput_device *udev,
98
98
uinput_request_alloc_id (udev , request ));
99
99
}
100
100
101
- static void uinput_request_done (struct uinput_device * udev ,
102
- struct uinput_request * request )
101
+ static void uinput_request_release_slot (struct uinput_device * udev ,
102
+ unsigned int id )
103
103
{
104
104
/* Mark slot as available */
105
- udev -> requests [request -> id ] = NULL ;
106
- wake_up (& udev -> requests_waitq );
105
+ spin_lock (& udev -> requests_lock );
106
+ udev -> requests [id ] = NULL ;
107
+ spin_unlock (& udev -> requests_lock );
107
108
108
- complete ( & request -> done );
109
+ wake_up ( & udev -> requests_waitq );
109
110
}
110
111
111
112
static int uinput_request_send (struct uinput_device * udev ,
@@ -138,20 +139,22 @@ static int uinput_request_send(struct uinput_device *udev,
138
139
static int uinput_request_submit (struct uinput_device * udev ,
139
140
struct uinput_request * request )
140
141
{
141
- int error ;
142
+ int retval ;
142
143
143
- error = uinput_request_reserve_slot (udev , request );
144
- if (error )
145
- return error ;
144
+ retval = uinput_request_reserve_slot (udev , request );
145
+ if (retval )
146
+ return retval ;
146
147
147
- error = uinput_request_send (udev , request );
148
- if (error ) {
149
- uinput_request_done (udev , request );
150
- return error ;
151
- }
148
+ retval = uinput_request_send (udev , request );
149
+ if (retval )
150
+ goto out ;
152
151
153
152
wait_for_completion (& request -> done );
154
- return request -> retval ;
153
+ retval = request -> retval ;
154
+
155
+ out :
156
+ uinput_request_release_slot (udev , request -> id );
157
+ return retval ;
155
158
}
156
159
157
160
/*
@@ -169,7 +172,7 @@ static void uinput_flush_requests(struct uinput_device *udev)
169
172
request = udev -> requests [i ];
170
173
if (request ) {
171
174
request -> retval = - ENODEV ;
172
- uinput_request_done ( udev , request );
175
+ complete ( & request -> done );
173
176
}
174
177
}
175
178
@@ -957,7 +960,7 @@ static long uinput_ioctl_handler(struct file *file, unsigned int cmd,
957
960
}
958
961
959
962
req -> retval = ff_up .retval ;
960
- uinput_request_done ( udev , req );
963
+ complete ( & req -> done );
961
964
goto out ;
962
965
963
966
case UI_END_FF_ERASE :
@@ -973,7 +976,7 @@ static long uinput_ioctl_handler(struct file *file, unsigned int cmd,
973
976
}
974
977
975
978
req -> retval = ff_erase .retval ;
976
- uinput_request_done ( udev , req );
979
+ complete ( & req -> done );
977
980
goto out ;
978
981
}
979
982
0 commit comments