diff options
author | Jaroslav Kysela <perex@suse.cz> | 2004-12-21 16:49:25 +0100 |
---|---|---|
committer | Jaroslav Kysela <perex@suse.cz> | 2004-12-21 16:49:25 +0100 |
commit | 1efef61e8dc73a81356328651ae839fcf59dec86 (patch) | |
tree | 8548af52fbfadd9c10f4cd3a8eded82b2321210e /sound | |
parent | ce15ed41e87d853d19274cdd160f4b21b5e8a640 (diff) | |
download | history-1efef61e8dc73a81356328651ae839fcf59dec86.tar.gz |
[ALSA] Export functions for ioctl32 wrapper
Control Midlevel,PCM Midlevel,ALSA Core
Export some functions to access from ioctl32 wrapper.
This will reduce the memory footprint (doublly kmalloc's for the same
ioctl records).
Signed-off-by: Takashi Iwai <tiwai@suse.de>
Diffstat (limited to 'sound')
-rw-r--r-- | sound/core/control.c | 62 | ||||
-rw-r--r-- | sound/core/pcm_lib.c | 1 | ||||
-rw-r--r-- | sound/core/pcm_native.c | 4 | ||||
-rw-r--r-- | sound/core/sound.c | 4 |
4 files changed, 47 insertions, 24 deletions
diff --git a/sound/core/control.c b/sound/core/control.c index 9b000f7ec1a306..191a0ed67060e9 100644 --- a/sound/core/control.c +++ b/sound/core/control.c @@ -635,19 +635,13 @@ static int snd_ctl_elem_info(snd_ctl_file_t *ctl, snd_ctl_elem_info_t __user *_i return result; } -static int snd_ctl_elem_read(snd_card_t *card, snd_ctl_elem_value_t __user *_control) +int snd_ctl_elem_read(snd_card_t *card, snd_ctl_elem_value_t *control) { - snd_ctl_elem_value_t *control; snd_kcontrol_t *kctl; snd_kcontrol_volatile_t *vd; unsigned int index_offset; int result, indirect; - - control = kmalloc(sizeof(*control), GFP_KERNEL); - if (control == NULL) - return -ENOMEM; - if (copy_from_user(control, _control, sizeof(*control))) - return -EFAULT; + down_read(&card->controls_rwsem); kctl = snd_ctl_find_id(card, &control->id); if (kctl == NULL) { @@ -668,27 +662,37 @@ static int snd_ctl_elem_read(snd_card_t *card, snd_ctl_elem_value_t __user *_con } } up_read(&card->controls_rwsem); + return result; +} + +static int snd_ctl_elem_read_user(snd_card_t *card, snd_ctl_elem_value_t __user *_control) +{ + snd_ctl_elem_value_t *control; + int result; + + control = kmalloc(sizeof(*control), GFP_KERNEL); + if (control == NULL) + return -ENOMEM; + if (copy_from_user(control, _control, sizeof(*control))) { + kfree(control); + return -EFAULT; + } + result = snd_ctl_elem_read(card, control); if (result >= 0) if (copy_to_user(_control, control, sizeof(*control))) - return -EFAULT; + result = -EFAULT; kfree(control); return result; } -static int snd_ctl_elem_write(snd_ctl_file_t *file, snd_ctl_elem_value_t __user *_control) +int snd_ctl_elem_write(snd_ctl_file_t *file, snd_ctl_elem_value_t *control) { snd_card_t *card = file->card; - snd_ctl_elem_value_t *control; snd_kcontrol_t *kctl; snd_kcontrol_volatile_t *vd; unsigned int index_offset; int result, indirect; - control = kmalloc(sizeof(*control), GFP_KERNEL); - if (control == NULL) - return -ENOMEM; - if (copy_from_user(control, _control, sizeof(*control))) - return -EFAULT; down_read(&card->controls_rwsem); kctl = snd_ctl_find_id(card, &control->id); if (kctl == NULL) { @@ -711,16 +715,30 @@ static int snd_ctl_elem_write(snd_ctl_file_t *file, snd_ctl_elem_value_t __user if (result > 0) { up_read(&card->controls_rwsem); snd_ctl_notify(card, SNDRV_CTL_EVENT_MASK_VALUE, &control->id); - result = 0; - goto __unlocked; + return 0; } } } up_read(&card->controls_rwsem); - __unlocked: + return result; +} + +static int snd_ctl_elem_write_user(snd_ctl_file_t *file, snd_ctl_elem_value_t __user *_control) +{ + snd_ctl_elem_value_t *control; + int result; + + control = kmalloc(sizeof(*control), GFP_KERNEL); + if (control == NULL) + return -ENOMEM; + if (copy_from_user(control, _control, sizeof(*control))) { + kfree(control); + return -EFAULT; + } + result = snd_ctl_elem_write(file, control); if (result >= 0) if (copy_to_user(_control, control, sizeof(*control))) - return -EFAULT; + result = -EFAULT; kfree(control); return result; } @@ -1045,9 +1063,9 @@ static inline int _snd_ctl_ioctl(struct inode *inode, struct file *file, case SNDRV_CTL_IOCTL_ELEM_INFO: return snd_ctl_elem_info(ctl, argp); case SNDRV_CTL_IOCTL_ELEM_READ: - return snd_ctl_elem_read(ctl->card, argp); + return snd_ctl_elem_read_user(ctl->card, argp); case SNDRV_CTL_IOCTL_ELEM_WRITE: - return snd_ctl_elem_write(ctl, argp); + return snd_ctl_elem_write_user(ctl, argp); case SNDRV_CTL_IOCTL_ELEM_LOCK: return snd_ctl_elem_lock(ctl, argp); case SNDRV_CTL_IOCTL_ELEM_UNLOCK: diff --git a/sound/core/pcm_lib.c b/sound/core/pcm_lib.c index 07ee3a9476f4a1..4d0b0f719721a2 100644 --- a/sound/core/pcm_lib.c +++ b/sound/core/pcm_lib.c @@ -2660,6 +2660,7 @@ EXPORT_SYMBOL(snd_pcm_hw_param_last); EXPORT_SYMBOL(snd_pcm_hw_param_near); EXPORT_SYMBOL(snd_pcm_hw_param_set); EXPORT_SYMBOL(snd_pcm_hw_refine); +EXPORT_SYMBOL(snd_pcm_hw_params); EXPORT_SYMBOL(snd_pcm_hw_constraints_init); EXPORT_SYMBOL(snd_pcm_hw_constraints_complete); EXPORT_SYMBOL(snd_pcm_hw_constraint_list); diff --git a/sound/core/pcm_native.c b/sound/core/pcm_native.c index b503741679d358..366e00facde48f 100644 --- a/sound/core/pcm_native.c +++ b/sound/core/pcm_native.c @@ -329,8 +329,8 @@ out: return err; } -static int snd_pcm_hw_params(snd_pcm_substream_t *substream, - snd_pcm_hw_params_t *params) +int snd_pcm_hw_params(snd_pcm_substream_t *substream, + snd_pcm_hw_params_t *params) { snd_pcm_runtime_t *runtime; int err; diff --git a/sound/core/sound.c b/sound/core/sound.c index 1fef4ed60a33b3..bf94a8d4a8b0b6 100644 --- a/sound/core/sound.c +++ b/sound/core/sound.c @@ -475,6 +475,10 @@ EXPORT_SYMBOL(snd_ctl_find_id); EXPORT_SYMBOL(snd_ctl_notify); EXPORT_SYMBOL(snd_ctl_register_ioctl); EXPORT_SYMBOL(snd_ctl_unregister_ioctl); +#ifdef CONFIG_COMPAT +EXPORT_SYMBOL(snd_ctl_elem_read); +EXPORT_SYMBOL(snd_ctl_elem_write); +#endif /* misc.c */ EXPORT_SYMBOL(snd_task_name); #ifdef CONFIG_SND_VERBOSE_PRINTK |