aboutsummaryrefslogtreecommitdiffstats
path: root/sound/oss/msnd_pinnacle.c
diff options
context:
space:
mode:
Diffstat (limited to 'sound/oss/msnd_pinnacle.c')
-rw-r--r--sound/oss/msnd_pinnacle.c35
1 files changed, 24 insertions, 11 deletions
diff --git a/sound/oss/msnd_pinnacle.c b/sound/oss/msnd_pinnacle.c
index a1e3f9671bea..2e48b17667d0 100644
--- a/sound/oss/msnd_pinnacle.c
+++ b/sound/oss/msnd_pinnacle.c
@@ -639,21 +639,26 @@ static int mixer_ioctl(unsigned int cmd, unsigned long arg)
639 return -EINVAL; 639 return -EINVAL;
640} 640}
641 641
642static int dev_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg) 642static long dev_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
643{ 643{
644 int minor = iminor(inode); 644 int minor = iminor(file->f_path.dentry->d_inode);
645 int ret;
645 646
646 if (cmd == OSS_GETVERSION) { 647 if (cmd == OSS_GETVERSION) {
647 int sound_version = SOUND_VERSION; 648 int sound_version = SOUND_VERSION;
648 return put_user(sound_version, (int __user *)arg); 649 return put_user(sound_version, (int __user *)arg);
649 } 650 }
650 651
652 ret = -EINVAL;
653
654 lock_kernel();
651 if (minor == dev.dsp_minor) 655 if (minor == dev.dsp_minor)
652 return dsp_ioctl(file, cmd, arg); 656 ret = dsp_ioctl(file, cmd, arg);
653 else if (minor == dev.mixer_minor) 657 else if (minor == dev.mixer_minor)
654 return mixer_ioctl(cmd, arg); 658 ret = mixer_ioctl(cmd, arg);
659 unlock_kernel();
655 660
656 return -EINVAL; 661 return ret;
657} 662}
658 663
659static void dsp_write_flush(void) 664static void dsp_write_flush(void)
@@ -756,12 +761,15 @@ static int dev_open(struct inode *inode, struct file *file)
756 int minor = iminor(inode); 761 int minor = iminor(inode);
757 int err = 0; 762 int err = 0;
758 763
764 lock_kernel();
759 if (minor == dev.dsp_minor) { 765 if (minor == dev.dsp_minor) {
760 if ((file->f_mode & FMODE_WRITE && 766 if ((file->f_mode & FMODE_WRITE &&
761 test_bit(F_AUDIO_WRITE_INUSE, &dev.flags)) || 767 test_bit(F_AUDIO_WRITE_INUSE, &dev.flags)) ||
762 (file->f_mode & FMODE_READ && 768 (file->f_mode & FMODE_READ &&
763 test_bit(F_AUDIO_READ_INUSE, &dev.flags))) 769 test_bit(F_AUDIO_READ_INUSE, &dev.flags))) {
764 return -EBUSY; 770 err = -EBUSY;
771 goto out;
772 }
765 773
766 if ((err = dsp_open(file)) >= 0) { 774 if ((err = dsp_open(file)) >= 0) {
767 dev.nresets = 0; 775 dev.nresets = 0;
@@ -782,7 +790,8 @@ static int dev_open(struct inode *inode, struct file *file)
782 /* nothing */ 790 /* nothing */
783 } else 791 } else
784 err = -EINVAL; 792 err = -EINVAL;
785 793out:
794 unlock_kernel();
786 return err; 795 return err;
787} 796}
788 797
@@ -1105,7 +1114,7 @@ static const struct file_operations dev_fileops = {
1105 .owner = THIS_MODULE, 1114 .owner = THIS_MODULE,
1106 .read = dev_read, 1115 .read = dev_read,
1107 .write = dev_write, 1116 .write = dev_write,
1108 .ioctl = dev_ioctl, 1117 .unlocked_ioctl = dev_ioctl,
1109 .open = dev_open, 1118 .open = dev_open,
1110 .release = dev_release, 1119 .release = dev_release,
1111}; 1120};
@@ -1391,9 +1400,13 @@ static int __init attach_multisound(void)
1391 printk(KERN_ERR LOGNAME ": Couldn't grab IRQ %d\n", dev.irq); 1400 printk(KERN_ERR LOGNAME ": Couldn't grab IRQ %d\n", dev.irq);
1392 return err; 1401 return err;
1393 } 1402 }
1394 request_region(dev.io, dev.numio, dev.name); 1403 if (request_region(dev.io, dev.numio, dev.name) == NULL) {
1404 free_irq(dev.irq, &dev);
1405 return -EBUSY;
1406 }
1395 1407
1396 if ((err = dsp_full_reset()) < 0) { 1408 err = dsp_full_reset();
1409 if (err < 0) {
1397 release_region(dev.io, dev.numio); 1410 release_region(dev.io, dev.numio);
1398 free_irq(dev.irq, &dev); 1411 free_irq(dev.irq, &dev);
1399 return err; 1412 return err;