.. | .. |
---|
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 | |
---|
.. | .. |
---|
171 | 172 | mdev->flags = pinfo->capability; |
---|
172 | 173 | mdev->opened = 0; |
---|
173 | 174 | snd_use_lock_init(&mdev->use_lock); |
---|
| 175 | + mutex_init(&mdev->open_mutex); |
---|
174 | 176 | |
---|
175 | 177 | /* copy and truncate the name of synth device */ |
---|
176 | 178 | strlcpy(mdev->name, pinfo->name, sizeof(mdev->name)); |
---|
.. | .. |
---|
319 | 321 | int perm; |
---|
320 | 322 | struct seq_oss_midi *mdev; |
---|
321 | 323 | struct snd_seq_port_subscribe subs; |
---|
| 324 | + int err; |
---|
322 | 325 | |
---|
323 | 326 | if ((mdev = get_mididev(dp, dev)) == NULL) |
---|
324 | 327 | return -ENODEV; |
---|
325 | 328 | |
---|
| 329 | + mutex_lock(&mdev->open_mutex); |
---|
326 | 330 | /* already used? */ |
---|
327 | 331 | if (mdev->opened && mdev->devinfo != dp) { |
---|
328 | | - snd_use_lock_free(&mdev->use_lock); |
---|
329 | | - return -EBUSY; |
---|
| 332 | + err = -EBUSY; |
---|
| 333 | + goto unlock; |
---|
330 | 334 | } |
---|
331 | 335 | |
---|
332 | 336 | perm = 0; |
---|
.. | .. |
---|
336 | 340 | perm |= PERM_READ; |
---|
337 | 341 | perm &= mdev->flags; |
---|
338 | 342 | if (perm == 0) { |
---|
339 | | - snd_use_lock_free(&mdev->use_lock); |
---|
340 | | - return -ENXIO; |
---|
| 343 | + err = -ENXIO; |
---|
| 344 | + goto unlock; |
---|
341 | 345 | } |
---|
342 | 346 | |
---|
343 | 347 | /* already opened? */ |
---|
344 | 348 | if ((mdev->opened & perm) == perm) { |
---|
345 | | - snd_use_lock_free(&mdev->use_lock); |
---|
346 | | - return 0; |
---|
| 349 | + err = 0; |
---|
| 350 | + goto unlock; |
---|
347 | 351 | } |
---|
348 | 352 | |
---|
349 | 353 | perm &= ~mdev->opened; |
---|
.. | .. |
---|
368 | 372 | } |
---|
369 | 373 | |
---|
370 | 374 | if (! mdev->opened) { |
---|
371 | | - snd_use_lock_free(&mdev->use_lock); |
---|
372 | | - return -ENXIO; |
---|
| 375 | + err = -ENXIO; |
---|
| 376 | + goto unlock; |
---|
373 | 377 | } |
---|
374 | 378 | |
---|
375 | 379 | mdev->devinfo = dp; |
---|
| 380 | + err = 0; |
---|
| 381 | + |
---|
| 382 | + unlock: |
---|
| 383 | + mutex_unlock(&mdev->open_mutex); |
---|
376 | 384 | snd_use_lock_free(&mdev->use_lock); |
---|
377 | | - return 0; |
---|
| 385 | + return err; |
---|
378 | 386 | } |
---|
379 | 387 | |
---|
380 | 388 | /* |
---|
.. | .. |
---|
388 | 396 | |
---|
389 | 397 | if ((mdev = get_mididev(dp, dev)) == NULL) |
---|
390 | 398 | 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; |
---|
395 | 402 | |
---|
396 | 403 | memset(&subs, 0, sizeof(subs)); |
---|
397 | 404 | if (mdev->opened & PERM_WRITE) { |
---|
.. | .. |
---|
410 | 417 | mdev->opened = 0; |
---|
411 | 418 | mdev->devinfo = NULL; |
---|
412 | 419 | |
---|
| 420 | + unlock: |
---|
| 421 | + mutex_unlock(&mdev->open_mutex); |
---|
413 | 422 | snd_use_lock_free(&mdev->use_lock); |
---|
414 | 423 | return 0; |
---|
415 | 424 | } |
---|