Merge branch 'topic/bkl' into topic/core-cleanup
This commit is contained in:
@@ -168,7 +168,7 @@ static loff_t snd_info_entry_llseek(struct file *file, loff_t offset, int orig)
|
||||
|
||||
data = file->private_data;
|
||||
entry = data->entry;
|
||||
lock_kernel();
|
||||
mutex_lock(&entry->access);
|
||||
switch (entry->content) {
|
||||
case SNDRV_INFO_CONTENT_TEXT:
|
||||
switch (orig) {
|
||||
@@ -197,7 +197,7 @@ static loff_t snd_info_entry_llseek(struct file *file, loff_t offset, int orig)
|
||||
}
|
||||
ret = -ENXIO;
|
||||
out:
|
||||
unlock_kernel();
|
||||
mutex_unlock(&entry->access);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@@ -3303,18 +3303,13 @@ static int snd_pcm_fasync(int fd, struct file * file, int on)
|
||||
struct snd_pcm_file * pcm_file;
|
||||
struct snd_pcm_substream *substream;
|
||||
struct snd_pcm_runtime *runtime;
|
||||
int err = -ENXIO;
|
||||
|
||||
lock_kernel();
|
||||
pcm_file = file->private_data;
|
||||
substream = pcm_file->substream;
|
||||
if (PCM_RUNTIME_CHECK(substream))
|
||||
goto out;
|
||||
return -ENXIO;
|
||||
runtime = substream->runtime;
|
||||
err = fasync_helper(fd, file, on, &runtime->fasync);
|
||||
out:
|
||||
unlock_kernel();
|
||||
return err;
|
||||
return fasync_helper(fd, file, on, &runtime->fasync);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@@ -120,7 +120,29 @@ void *snd_lookup_minor_data(unsigned int minor, int type)
|
||||
|
||||
EXPORT_SYMBOL(snd_lookup_minor_data);
|
||||
|
||||
static int __snd_open(struct inode *inode, struct file *file)
|
||||
#ifdef CONFIG_MODULES
|
||||
static struct snd_minor *autoload_device(unsigned int minor)
|
||||
{
|
||||
int dev;
|
||||
mutex_unlock(&sound_mutex); /* release lock temporarily */
|
||||
dev = SNDRV_MINOR_DEVICE(minor);
|
||||
if (dev == SNDRV_MINOR_CONTROL) {
|
||||
/* /dev/aloadC? */
|
||||
int card = SNDRV_MINOR_CARD(minor);
|
||||
if (snd_cards[card] == NULL)
|
||||
snd_request_card(card);
|
||||
} else if (dev == SNDRV_MINOR_GLOBAL) {
|
||||
/* /dev/aloadSEQ */
|
||||
snd_request_other(minor);
|
||||
}
|
||||
mutex_lock(&sound_mutex); /* reacuire lock */
|
||||
return snd_minors[minor];
|
||||
}
|
||||
#else /* !CONFIG_MODULES */
|
||||
#define autoload_device(minor) NULL
|
||||
#endif /* CONFIG_MODULES */
|
||||
|
||||
static int snd_open(struct inode *inode, struct file *file)
|
||||
{
|
||||
unsigned int minor = iminor(inode);
|
||||
struct snd_minor *mptr = NULL;
|
||||
@@ -129,55 +151,36 @@ static int __snd_open(struct inode *inode, struct file *file)
|
||||
|
||||
if (minor >= ARRAY_SIZE(snd_minors))
|
||||
return -ENODEV;
|
||||
mutex_lock(&sound_mutex);
|
||||
mptr = snd_minors[minor];
|
||||
if (mptr == NULL) {
|
||||
#ifdef CONFIG_MODULES
|
||||
int dev = SNDRV_MINOR_DEVICE(minor);
|
||||
if (dev == SNDRV_MINOR_CONTROL) {
|
||||
/* /dev/aloadC? */
|
||||
int card = SNDRV_MINOR_CARD(minor);
|
||||
if (snd_cards[card] == NULL)
|
||||
snd_request_card(card);
|
||||
} else if (dev == SNDRV_MINOR_GLOBAL) {
|
||||
/* /dev/aloadSEQ */
|
||||
snd_request_other(minor);
|
||||
}
|
||||
#ifndef CONFIG_SND_DYNAMIC_MINORS
|
||||
/* /dev/snd/{controlC?,seq} */
|
||||
mptr = snd_minors[minor];
|
||||
if (mptr == NULL)
|
||||
#endif
|
||||
#endif
|
||||
mptr = autoload_device(minor);
|
||||
if (!mptr) {
|
||||
mutex_unlock(&sound_mutex);
|
||||
return -ENODEV;
|
||||
}
|
||||
}
|
||||
old_fops = file->f_op;
|
||||
file->f_op = fops_get(mptr->f_ops);
|
||||
if (file->f_op == NULL) {
|
||||
file->f_op = old_fops;
|
||||
return -ENODEV;
|
||||
err = -ENODEV;
|
||||
}
|
||||
if (file->f_op->open)
|
||||
mutex_unlock(&sound_mutex);
|
||||
if (err < 0)
|
||||
return err;
|
||||
|
||||
if (file->f_op->open) {
|
||||
err = file->f_op->open(inode, file);
|
||||
if (err) {
|
||||
fops_put(file->f_op);
|
||||
file->f_op = fops_get(old_fops);
|
||||
if (err) {
|
||||
fops_put(file->f_op);
|
||||
file->f_op = fops_get(old_fops);
|
||||
}
|
||||
}
|
||||
fops_put(old_fops);
|
||||
return err;
|
||||
}
|
||||
|
||||
|
||||
/* BKL pushdown: nasty #ifdef avoidance wrapper */
|
||||
static int snd_open(struct inode *inode, struct file *file)
|
||||
{
|
||||
int ret;
|
||||
|
||||
lock_kernel();
|
||||
ret = __snd_open(inode, file);
|
||||
unlock_kernel();
|
||||
return ret;
|
||||
}
|
||||
|
||||
static const struct file_operations snd_fops =
|
||||
{
|
||||
.owner = THIS_MODULE,
|
||||
|
Reference in New Issue
Block a user