diff options
| -rw-r--r-- | sound/oss/soundcard.c | 35 |
1 files changed, 22 insertions, 13 deletions
diff --git a/sound/oss/soundcard.c b/sound/oss/soundcard.c index 61aaedae6b7e..6c3267bf05d0 100644 --- a/sound/oss/soundcard.c +++ b/sound/oss/soundcard.c | |||
| @@ -328,11 +328,11 @@ static int sound_mixer_ioctl(int mixdev, unsigned int cmd, void __user *arg) | |||
| 328 | return mixer_devs[mixdev]->ioctl(mixdev, cmd, arg); | 328 | return mixer_devs[mixdev]->ioctl(mixdev, cmd, arg); |
| 329 | } | 329 | } |
| 330 | 330 | ||
| 331 | static int sound_ioctl(struct inode *inode, struct file *file, | 331 | static long sound_ioctl(struct file *file, unsigned int cmd, unsigned long arg) |
| 332 | unsigned int cmd, unsigned long arg) | ||
| 333 | { | 332 | { |
| 334 | int len = 0, dtype; | 333 | int len = 0, dtype; |
| 335 | int dev = iminor(inode); | 334 | int dev = iminor(file->f_dentry->d_inode); |
| 335 | long ret = -EINVAL; | ||
| 336 | void __user *p = (void __user *)arg; | 336 | void __user *p = (void __user *)arg; |
| 337 | 337 | ||
| 338 | if (_SIOC_DIR(cmd) != _SIOC_NONE && _SIOC_DIR(cmd) != 0) { | 338 | if (_SIOC_DIR(cmd) != _SIOC_NONE && _SIOC_DIR(cmd) != 0) { |
| @@ -353,6 +353,7 @@ static int sound_ioctl(struct inode *inode, struct file *file, | |||
| 353 | if (cmd == OSS_GETVERSION) | 353 | if (cmd == OSS_GETVERSION) |
| 354 | return __put_user(SOUND_VERSION, (int __user *)p); | 354 | return __put_user(SOUND_VERSION, (int __user *)p); |
| 355 | 355 | ||
| 356 | lock_kernel(); | ||
| 356 | if (_IOC_TYPE(cmd) == 'M' && num_mixers > 0 && /* Mixer ioctl */ | 357 | if (_IOC_TYPE(cmd) == 'M' && num_mixers > 0 && /* Mixer ioctl */ |
| 357 | (dev & 0x0f) != SND_DEV_CTL) { | 358 | (dev & 0x0f) != SND_DEV_CTL) { |
| 358 | dtype = dev & 0x0f; | 359 | dtype = dev & 0x0f; |
| @@ -360,24 +361,31 @@ static int sound_ioctl(struct inode *inode, struct file *file, | |||
| 360 | case SND_DEV_DSP: | 361 | case SND_DEV_DSP: |
| 361 | case SND_DEV_DSP16: | 362 | case SND_DEV_DSP16: |
| 362 | case SND_DEV_AUDIO: | 363 | case SND_DEV_AUDIO: |
| 363 | return sound_mixer_ioctl(audio_devs[dev >> 4]->mixer_dev, | 364 | ret = sound_mixer_ioctl(audio_devs[dev >> 4]->mixer_dev, |
| 364 | cmd, p); | 365 | cmd, p); |
| 365 | 366 | break; | |
| 366 | default: | 367 | default: |
| 367 | return sound_mixer_ioctl(dev >> 4, cmd, p); | 368 | ret = sound_mixer_ioctl(dev >> 4, cmd, p); |
| 369 | break; | ||
| 368 | } | 370 | } |
| 371 | unlock_kernel(); | ||
| 372 | return ret; | ||
| 369 | } | 373 | } |
| 374 | |||
| 370 | switch (dev & 0x0f) { | 375 | switch (dev & 0x0f) { |
| 371 | case SND_DEV_CTL: | 376 | case SND_DEV_CTL: |
| 372 | if (cmd == SOUND_MIXER_GETLEVELS) | 377 | if (cmd == SOUND_MIXER_GETLEVELS) |
| 373 | return get_mixer_levels(p); | 378 | ret = get_mixer_levels(p); |
| 374 | if (cmd == SOUND_MIXER_SETLEVELS) | 379 | else if (cmd == SOUND_MIXER_SETLEVELS) |
| 375 | return set_mixer_levels(p); | 380 | ret = set_mixer_levels(p); |
| 376 | return sound_mixer_ioctl(dev >> 4, cmd, p); | 381 | else |
| 382 | ret = sound_mixer_ioctl(dev >> 4, cmd, p); | ||
| 383 | break; | ||
| 377 | 384 | ||
| 378 | case SND_DEV_SEQ: | 385 | case SND_DEV_SEQ: |
| 379 | case SND_DEV_SEQ2: | 386 | case SND_DEV_SEQ2: |
| 380 | return sequencer_ioctl(dev, file, cmd, p); | 387 | ret = sequencer_ioctl(dev, file, cmd, p); |
| 388 | break; | ||
| 381 | 389 | ||
| 382 | case SND_DEV_DSP: | 390 | case SND_DEV_DSP: |
| 383 | case SND_DEV_DSP16: | 391 | case SND_DEV_DSP16: |
| @@ -390,7 +398,8 @@ static int sound_ioctl(struct inode *inode, struct file *file, | |||
| 390 | break; | 398 | break; |
| 391 | 399 | ||
| 392 | } | 400 | } |
| 393 | return -EINVAL; | 401 | unlock_kernel(); |
| 402 | return ret; | ||
| 394 | } | 403 | } |
| 395 | 404 | ||
| 396 | static unsigned int sound_poll(struct file *file, poll_table * wait) | 405 | static unsigned int sound_poll(struct file *file, poll_table * wait) |
| @@ -490,7 +499,7 @@ const struct file_operations oss_sound_fops = { | |||
| 490 | .read = sound_read, | 499 | .read = sound_read, |
| 491 | .write = sound_write, | 500 | .write = sound_write, |
| 492 | .poll = sound_poll, | 501 | .poll = sound_poll, |
| 493 | .ioctl = sound_ioctl, | 502 | .unlocked_ioctl = sound_ioctl, |
| 494 | .mmap = sound_mmap, | 503 | .mmap = sound_mmap, |
| 495 | .open = sound_open, | 504 | .open = sound_open, |
| 496 | .release = sound_release, | 505 | .release = sound_release, |
