diff options
Diffstat (limited to 'sound/oss/msnd_pinnacle.c')
-rw-r--r-- | sound/oss/msnd_pinnacle.c | 35 |
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 | ||
642 | static int dev_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg) | 642 | static 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 | ||
659 | static void dsp_write_flush(void) | 664 | static 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 | 793 | out: | |
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; |