hc
2024-01-03 2f7c68cb55ecb7331f2381deb497c27155f32faf
kernel/sound/core/seq/oss/seq_oss_midi.c
....@@ -37,6 +37,7 @@
3737 struct snd_midi_event *coder; /* MIDI event coder */
3838 struct seq_oss_devinfo *devinfo; /* assigned OSSseq device */
3939 snd_use_lock_t use_lock;
40
+ struct mutex open_mutex;
4041 };
4142
4243
....@@ -171,6 +172,7 @@
171172 mdev->flags = pinfo->capability;
172173 mdev->opened = 0;
173174 snd_use_lock_init(&mdev->use_lock);
175
+ mutex_init(&mdev->open_mutex);
174176
175177 /* copy and truncate the name of synth device */
176178 strlcpy(mdev->name, pinfo->name, sizeof(mdev->name));
....@@ -319,14 +321,16 @@
319321 int perm;
320322 struct seq_oss_midi *mdev;
321323 struct snd_seq_port_subscribe subs;
324
+ int err;
322325
323326 if ((mdev = get_mididev(dp, dev)) == NULL)
324327 return -ENODEV;
325328
329
+ mutex_lock(&mdev->open_mutex);
326330 /* already used? */
327331 if (mdev->opened && mdev->devinfo != dp) {
328
- snd_use_lock_free(&mdev->use_lock);
329
- return -EBUSY;
332
+ err = -EBUSY;
333
+ goto unlock;
330334 }
331335
332336 perm = 0;
....@@ -336,14 +340,14 @@
336340 perm |= PERM_READ;
337341 perm &= mdev->flags;
338342 if (perm == 0) {
339
- snd_use_lock_free(&mdev->use_lock);
340
- return -ENXIO;
343
+ err = -ENXIO;
344
+ goto unlock;
341345 }
342346
343347 /* already opened? */
344348 if ((mdev->opened & perm) == perm) {
345
- snd_use_lock_free(&mdev->use_lock);
346
- return 0;
349
+ err = 0;
350
+ goto unlock;
347351 }
348352
349353 perm &= ~mdev->opened;
....@@ -368,13 +372,17 @@
368372 }
369373
370374 if (! mdev->opened) {
371
- snd_use_lock_free(&mdev->use_lock);
372
- return -ENXIO;
375
+ err = -ENXIO;
376
+ goto unlock;
373377 }
374378
375379 mdev->devinfo = dp;
380
+ err = 0;
381
+
382
+ unlock:
383
+ mutex_unlock(&mdev->open_mutex);
376384 snd_use_lock_free(&mdev->use_lock);
377
- return 0;
385
+ return err;
378386 }
379387
380388 /*
....@@ -388,10 +396,9 @@
388396
389397 if ((mdev = get_mididev(dp, dev)) == NULL)
390398 return -ENODEV;
391
- if (! mdev->opened || mdev->devinfo != dp) {
392
- snd_use_lock_free(&mdev->use_lock);
393
- return 0;
394
- }
399
+ mutex_lock(&mdev->open_mutex);
400
+ if (!mdev->opened || mdev->devinfo != dp)
401
+ goto unlock;
395402
396403 memset(&subs, 0, sizeof(subs));
397404 if (mdev->opened & PERM_WRITE) {
....@@ -410,6 +417,8 @@
410417 mdev->opened = 0;
411418 mdev->devinfo = NULL;
412419
420
+ unlock:
421
+ mutex_unlock(&mdev->open_mutex);
413422 snd_use_lock_free(&mdev->use_lock);
414423 return 0;
415424 }