Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 193199
b: refs/heads/master
c: 4cf19b8
h: refs/heads/master
i:
  193197: 620a486
  193195: b7bee76
  193191: c370e49
  193183: 48c72f2
v: v3
  • Loading branch information
Takashi Iwai committed Apr 9, 2010
1 parent d2d4644 commit 1274a44
Show file tree
Hide file tree
Showing 2 changed files with 39 additions and 36 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 5b5cd553e3ac49e6a9bac148f07ab94d3d96dae5
refs/heads/master: 4cf19b848f92641eeb2585949a09eedec57fb53a
73 changes: 38 additions & 35 deletions trunk/sound/core/sound.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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,
Expand Down

0 comments on commit 1274a44

Please sign in to comment.