]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - sound/oss/soundcard.c
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6
[karo-tx-linux.git] / sound / oss / soundcard.c
index 2d9c51312622fe4a10ea0bf202f24fb092a895ac..92aa762ffb7e97c998db3ca1da3a5cddc2968139 100644 (file)
@@ -210,42 +210,44 @@ static int sound_open(struct inode *inode, struct file *file)
                printk(KERN_ERR "Invalid minor device %d\n", dev);
                return -ENXIO;
        }
+       lock_kernel();
        switch (dev & 0x0f) {
        case SND_DEV_CTL:
                dev >>= 4;
                if (dev >= 0 && dev < MAX_MIXER_DEV && mixer_devs[dev] == NULL) {
                        request_module("mixer%d", dev);
                }
+               retval = -ENXIO;
                if (dev && (dev >= num_mixers || mixer_devs[dev] == NULL))
-                       return -ENXIO;
+                       break;
        
                if (!try_module_get(mixer_devs[dev]->owner))
-                       return -ENXIO;
+                       break;
+
+               retval = 0;
                break;
 
        case SND_DEV_SEQ:
        case SND_DEV_SEQ2:
-               if ((retval = sequencer_open(dev, file)) < 0)
-                       return retval;
+               retval = sequencer_open(dev, file);
                break;
 
        case SND_DEV_MIDIN:
-               if ((retval = MIDIbuf_open(dev, file)) < 0)
-                       return retval;
+               retval = MIDIbuf_open(dev, file);
                break;
 
        case SND_DEV_DSP:
        case SND_DEV_DSP16:
        case SND_DEV_AUDIO:
-               if ((retval = audio_open(dev, file)) < 0)
-                       return retval;
+               retval = audio_open(dev, file);
                break;
 
        default:
                printk(KERN_ERR "Invalid minor device %d\n", dev);
-               return -ENXIO;
+               retval = -ENXIO;
        }
 
+       unlock_kernel();
        return 0;
 }