ALSA: core - Define llseek fops
Set no_llseek to llseek file ops of each sound component (but for hwdep). This avoids the implicit BKL invocation via generic_file_llseek() used as default when fops.llseek is NULL. Also call nonseekable_open() at each open ops to ensure the file flags have no seek bit. Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
parent
73029e0ff1
commit
02f4865fa4
|
@ -50,6 +50,10 @@ static int snd_ctl_open(struct inode *inode, struct file *file)
|
|||
struct snd_ctl_file *ctl;
|
||||
int err;
|
||||
|
||||
err = nonseekable_open(inode, file);
|
||||
if (err < 0)
|
||||
return err;
|
||||
|
||||
card = snd_lookup_minor_data(iminor(inode), SNDRV_DEVICE_TYPE_CONTROL);
|
||||
if (!card) {
|
||||
err = -ENODEV;
|
||||
|
@ -1388,6 +1392,7 @@ static const struct file_operations snd_ctl_f_ops =
|
|||
.read = snd_ctl_read,
|
||||
.open = snd_ctl_open,
|
||||
.release = snd_ctl_release,
|
||||
.llseek = no_llseek,
|
||||
.poll = snd_ctl_poll,
|
||||
.unlocked_ioctl = snd_ctl_ioctl,
|
||||
.compat_ioctl = snd_ctl_ioctl_compat,
|
||||
|
|
|
@ -43,6 +43,10 @@ static int snd_mixer_oss_open(struct inode *inode, struct file *file)
|
|||
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)
|
||||
|
@ -397,6 +401,7 @@ static const struct file_operations snd_mixer_oss_f_ops =
|
|||
.owner = THIS_MODULE,
|
||||
.open = snd_mixer_oss_open,
|
||||
.release = snd_mixer_oss_release,
|
||||
.llseek = no_llseek,
|
||||
.unlocked_ioctl = snd_mixer_oss_ioctl,
|
||||
.compat_ioctl = snd_mixer_oss_ioctl_compat,
|
||||
};
|
||||
|
|
|
@ -2379,6 +2379,10 @@ static int snd_pcm_oss_open(struct inode *inode, struct file *file)
|
|||
int nonblock;
|
||||
wait_queue_t wait;
|
||||
|
||||
err = nonseekable_open(inode, file);
|
||||
if (err < 0)
|
||||
return err;
|
||||
|
||||
pcm = snd_lookup_oss_minor_data(iminor(inode),
|
||||
SNDRV_OSS_DEVICE_TYPE_PCM);
|
||||
if (pcm == NULL) {
|
||||
|
@ -2977,6 +2981,7 @@ static const struct file_operations snd_pcm_oss_f_reg =
|
|||
.write = snd_pcm_oss_write,
|
||||
.open = snd_pcm_oss_open,
|
||||
.release = snd_pcm_oss_release,
|
||||
.llseek = no_llseek,
|
||||
.poll = snd_pcm_oss_poll,
|
||||
.unlocked_ioctl = snd_pcm_oss_ioctl,
|
||||
.compat_ioctl = snd_pcm_oss_ioctl_compat,
|
||||
|
|
|
@ -2107,7 +2107,9 @@ static int snd_pcm_open_file(struct file *file,
|
|||
static int snd_pcm_playback_open(struct inode *inode, struct file *file)
|
||||
{
|
||||
struct snd_pcm *pcm;
|
||||
|
||||
int err = nonseekable_open(inode, file);
|
||||
if (err < 0)
|
||||
return err;
|
||||
pcm = snd_lookup_minor_data(iminor(inode),
|
||||
SNDRV_DEVICE_TYPE_PCM_PLAYBACK);
|
||||
return snd_pcm_open(file, pcm, SNDRV_PCM_STREAM_PLAYBACK);
|
||||
|
@ -2116,7 +2118,9 @@ static int snd_pcm_playback_open(struct inode *inode, struct file *file)
|
|||
static int snd_pcm_capture_open(struct inode *inode, struct file *file)
|
||||
{
|
||||
struct snd_pcm *pcm;
|
||||
|
||||
int err = nonseekable_open(inode, file);
|
||||
if (err < 0)
|
||||
return err;
|
||||
pcm = snd_lookup_minor_data(iminor(inode),
|
||||
SNDRV_DEVICE_TYPE_PCM_CAPTURE);
|
||||
return snd_pcm_open(file, pcm, SNDRV_PCM_STREAM_CAPTURE);
|
||||
|
@ -3450,6 +3454,7 @@ const struct file_operations snd_pcm_f_ops[2] = {
|
|||
.aio_write = snd_pcm_aio_write,
|
||||
.open = snd_pcm_playback_open,
|
||||
.release = snd_pcm_release,
|
||||
.llseek = no_llseek,
|
||||
.poll = snd_pcm_playback_poll,
|
||||
.unlocked_ioctl = snd_pcm_playback_ioctl,
|
||||
.compat_ioctl = snd_pcm_ioctl_compat,
|
||||
|
@ -3463,6 +3468,7 @@ const struct file_operations snd_pcm_f_ops[2] = {
|
|||
.aio_read = snd_pcm_aio_read,
|
||||
.open = snd_pcm_capture_open,
|
||||
.release = snd_pcm_release,
|
||||
.llseek = no_llseek,
|
||||
.poll = snd_pcm_capture_poll,
|
||||
.unlocked_ioctl = snd_pcm_capture_ioctl,
|
||||
.compat_ioctl = snd_pcm_ioctl_compat,
|
||||
|
|
|
@ -376,6 +376,10 @@ static int snd_rawmidi_open(struct inode *inode, struct file *file)
|
|||
if ((file->f_flags & O_APPEND) && !(file->f_flags & O_NONBLOCK))
|
||||
return -EINVAL; /* invalid combination */
|
||||
|
||||
err = nonseekable_open(inode, file);
|
||||
if (err < 0)
|
||||
return err;
|
||||
|
||||
if (maj == snd_major) {
|
||||
rmidi = snd_lookup_minor_data(iminor(inode),
|
||||
SNDRV_DEVICE_TYPE_RAWMIDI);
|
||||
|
@ -1391,6 +1395,7 @@ static const struct file_operations snd_rawmidi_f_ops =
|
|||
.write = snd_rawmidi_write,
|
||||
.open = snd_rawmidi_open,
|
||||
.release = snd_rawmidi_release,
|
||||
.llseek = no_llseek,
|
||||
.poll = snd_rawmidi_poll,
|
||||
.unlocked_ioctl = snd_rawmidi_ioctl,
|
||||
.compat_ioctl = snd_rawmidi_ioctl_compat,
|
||||
|
|
|
@ -318,6 +318,11 @@ static int snd_seq_open(struct inode *inode, struct file *file)
|
|||
int c, mode; /* client id */
|
||||
struct snd_seq_client *client;
|
||||
struct snd_seq_user_client *user;
|
||||
int err;
|
||||
|
||||
err = nonseekable_open(inode, file);
|
||||
if (err < 0)
|
||||
return err;
|
||||
|
||||
if (mutex_lock_interruptible(®ister_mutex))
|
||||
return -ERESTARTSYS;
|
||||
|
@ -2550,6 +2555,7 @@ static const struct file_operations snd_seq_f_ops =
|
|||
.write = snd_seq_write,
|
||||
.open = snd_seq_open,
|
||||
.release = snd_seq_release,
|
||||
.llseek = no_llseek,
|
||||
.poll = snd_seq_poll,
|
||||
.unlocked_ioctl = snd_seq_ioctl,
|
||||
.compat_ioctl = snd_seq_ioctl_compat,
|
||||
|
|
|
@ -1237,6 +1237,11 @@ static void snd_timer_user_tinterrupt(struct snd_timer_instance *timeri,
|
|||
static int snd_timer_user_open(struct inode *inode, struct file *file)
|
||||
{
|
||||
struct snd_timer_user *tu;
|
||||
int err;
|
||||
|
||||
err = nonseekable_open(inode, file);
|
||||
if (err < 0)
|
||||
return err;
|
||||
|
||||
tu = kzalloc(sizeof(*tu), GFP_KERNEL);
|
||||
if (tu == NULL)
|
||||
|
@ -1921,6 +1926,7 @@ static const struct file_operations snd_timer_f_ops =
|
|||
.read = snd_timer_user_read,
|
||||
.open = snd_timer_user_open,
|
||||
.release = snd_timer_user_release,
|
||||
.llseek = no_llseek,
|
||||
.poll = snd_timer_user_poll,
|
||||
.unlocked_ioctl = snd_timer_user_ioctl,
|
||||
.compat_ioctl = snd_timer_user_ioctl_compat,
|
||||
|
|
Loading…
Reference in a new issue