@@ -37,6 +37,7 @@ struct seq_oss_midi {
37
37
struct snd_midi_event * coder ; /* MIDI event coder */
38
38
struct seq_oss_devinfo * devinfo ; /* assigned OSSseq device */
39
39
snd_use_lock_t use_lock ;
40
+ struct mutex open_mutex ;
40
41
};
41
42
42
43
@@ -172,6 +173,7 @@ snd_seq_oss_midi_check_new_port(struct snd_seq_port_info *pinfo)
172
173
mdev -> flags = pinfo -> capability ;
173
174
mdev -> opened = 0 ;
174
175
snd_use_lock_init (& mdev -> use_lock );
176
+ mutex_init (& mdev -> open_mutex );
175
177
176
178
/* copy and truncate the name of synth device */
177
179
strscpy (mdev -> name , pinfo -> name , sizeof (mdev -> name ));
@@ -322,15 +324,17 @@ snd_seq_oss_midi_open(struct seq_oss_devinfo *dp, int dev, int fmode)
322
324
int perm ;
323
325
struct seq_oss_midi * mdev ;
324
326
struct snd_seq_port_subscribe subs ;
327
+ int err ;
325
328
326
329
mdev = get_mididev (dp , dev );
327
330
if (!mdev )
328
331
return - ENODEV ;
329
332
333
+ mutex_lock (& mdev -> open_mutex );
330
334
/* already used? */
331
335
if (mdev -> opened && mdev -> devinfo != dp ) {
332
- snd_use_lock_free ( & mdev -> use_lock ) ;
333
- return - EBUSY ;
336
+ err = - EBUSY ;
337
+ goto unlock ;
334
338
}
335
339
336
340
perm = 0 ;
@@ -340,14 +344,14 @@ snd_seq_oss_midi_open(struct seq_oss_devinfo *dp, int dev, int fmode)
340
344
perm |= PERM_READ ;
341
345
perm &= mdev -> flags ;
342
346
if (perm == 0 ) {
343
- snd_use_lock_free ( & mdev -> use_lock ) ;
344
- return - ENXIO ;
347
+ err = - ENXIO ;
348
+ goto unlock ;
345
349
}
346
350
347
351
/* already opened? */
348
352
if ((mdev -> opened & perm ) == perm ) {
349
- snd_use_lock_free ( & mdev -> use_lock ) ;
350
- return 0 ;
353
+ err = 0 ;
354
+ goto unlock ;
351
355
}
352
356
353
357
perm &= ~mdev -> opened ;
@@ -372,13 +376,17 @@ snd_seq_oss_midi_open(struct seq_oss_devinfo *dp, int dev, int fmode)
372
376
}
373
377
374
378
if (! mdev -> opened ) {
375
- snd_use_lock_free ( & mdev -> use_lock ) ;
376
- return - ENXIO ;
379
+ err = - ENXIO ;
380
+ goto unlock ;
377
381
}
378
382
379
383
mdev -> devinfo = dp ;
384
+ err = 0 ;
385
+
386
+ unlock :
387
+ mutex_unlock (& mdev -> open_mutex );
380
388
snd_use_lock_free (& mdev -> use_lock );
381
- return 0 ;
389
+ return err ;
382
390
}
383
391
384
392
/*
@@ -393,10 +401,9 @@ snd_seq_oss_midi_close(struct seq_oss_devinfo *dp, int dev)
393
401
mdev = get_mididev (dp , dev );
394
402
if (!mdev )
395
403
return - ENODEV ;
396
- if (! mdev -> opened || mdev -> devinfo != dp ) {
397
- snd_use_lock_free (& mdev -> use_lock );
398
- return 0 ;
399
- }
404
+ mutex_lock (& mdev -> open_mutex );
405
+ if (!mdev -> opened || mdev -> devinfo != dp )
406
+ goto unlock ;
400
407
401
408
memset (& subs , 0 , sizeof (subs ));
402
409
if (mdev -> opened & PERM_WRITE ) {
@@ -415,6 +422,8 @@ snd_seq_oss_midi_close(struct seq_oss_devinfo *dp, int dev)
415
422
mdev -> opened = 0 ;
416
423
mdev -> devinfo = NULL ;
417
424
425
+ unlock :
426
+ mutex_unlock (& mdev -> open_mutex );
418
427
snd_use_lock_free (& mdev -> use_lock );
419
428
return 0 ;
420
429
}
0 commit comments