static int snd_mixer_oss_open(struct inode *inode, struct file *file) { struct snd_card *card; struct snd_mixer_oss_file *fmixer; int err; err = nonseekable_open(inode, file); if (err < 0) return err; card = snd_lookup_oss_minor_data(iminor(inode), SNDRV_OSS_DEVICE_TYPE_MIXER); if (card == NULL) return -ENODEV; if (card->mixer_oss == NULL) return -ENODEV; err = snd_card_file_add(card, file); if (err < 0) return err; fmixer = kzalloc(sizeof(*fmixer), GFP_KERNEL); if (fmixer == NULL) { snd_card_file_remove(card, file); return -ENOMEM; } fmixer->card = card; fmixer->mixer = card->mixer_oss; file->private_data = fmixer; if (!try_module_get(card->module)) { kfree(fmixer); snd_card_file_remove(card, file); return -EFAULT; } return 0; }
static int snd_hwdep_release(struct inode *inode, struct file * file) { int err = -ENXIO; snd_hwdep_t *hw = file->private_data; down(&hw->open_mutex); if (hw->ops.release) { err = hw->ops.release(hw, file); wake_up(&hw->open_wait); } if (hw->used > 0) hw->used--; snd_card_file_remove(hw->card, file); up(&hw->open_mutex); module_put(hw->card->module); return err; }
static int snd_hwdep_release(struct inode *inode, struct file * file) { int err = 0; struct snd_hwdep *hw = file->private_data; struct module *mod = hw->card->module; mutex_lock(&hw->open_mutex); if (hw->ops.release) err = hw->ops.release(hw, file); if (hw->used > 0) hw->used--; mutex_unlock(&hw->open_mutex); wake_up(&hw->open_wait); snd_card_file_remove(hw->card, file); module_put(mod); return err; }