@@ -166,8 +166,10 @@ int input_ff_upload(struct input_dev *dev, struct ff_effect *effect,
166
166
if (ret )
167
167
goto out ;
168
168
169
+ spin_lock_irq (& dev -> event_lock );
169
170
ff -> effects [id ] = * effect ;
170
171
ff -> effect_owners [id ] = file ;
172
+ spin_unlock_irq (& dev -> event_lock );
171
173
172
174
out :
173
175
mutex_unlock (& ff -> mutex );
@@ -189,16 +191,22 @@ static int erase_effect(struct input_dev *dev, int effect_id,
189
191
if (error )
190
192
return error ;
191
193
194
+ spin_lock_irq (& dev -> event_lock );
192
195
ff -> playback (dev , effect_id , 0 );
196
+ ff -> effect_owners [effect_id ] = NULL ;
197
+ spin_unlock_irq (& dev -> event_lock );
193
198
194
199
if (ff -> erase ) {
195
200
error = ff -> erase (dev , effect_id );
196
- if (error )
201
+ if (error ) {
202
+ spin_lock_irq (& dev -> event_lock );
203
+ ff -> effect_owners [effect_id ] = file ;
204
+ spin_unlock_irq (& dev -> event_lock );
205
+
197
206
return error ;
207
+ }
198
208
}
199
209
200
- ff -> effect_owners [effect_id ] = NULL ;
201
-
202
210
return 0 ;
203
211
}
204
212
@@ -263,8 +271,6 @@ int input_ff_event(struct input_dev *dev, unsigned int type,
263
271
if (type != EV_FF )
264
272
return 0 ;
265
273
266
- mutex_lock (& ff -> mutex );
267
-
268
274
switch (code ) {
269
275
case FF_GAIN :
270
276
if (!test_bit (FF_GAIN , dev -> ffbit ) || value > 0xffff )
@@ -286,7 +292,6 @@ int input_ff_event(struct input_dev *dev, unsigned int type,
286
292
break ;
287
293
}
288
294
289
- mutex_unlock (& ff -> mutex );
290
295
return 0 ;
291
296
}
292
297
EXPORT_SYMBOL_GPL (input_ff_event );
0 commit comments