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
7 changed files with 40 additions and 2 deletions
|
@ -50,6 +50,10 @@ static int snd_ctl_open(struct inode *inode, struct file *file)
|
||||||
struct snd_ctl_file *ctl;
|
struct snd_ctl_file *ctl;
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
|
err = nonseekable_open(inode, file);
|
||||||
|
if (err < 0)
|
||||||
|
return err;
|
||||||
|
|
||||||
card = snd_lookup_minor_data(iminor(inode), SNDRV_DEVICE_TYPE_CONTROL);
|
card = snd_lookup_minor_data(iminor(inode), SNDRV_DEVICE_TYPE_CONTROL);
|
||||||
if (!card) {
|
if (!card) {
|
||||||
err = -ENODEV;
|
err = -ENODEV;
|
||||||
|
@ -1388,6 +1392,7 @@ static const struct file_operations snd_ctl_f_ops =
|
||||||
.read = snd_ctl_read,
|
.read = snd_ctl_read,
|
||||||
.open = snd_ctl_open,
|
.open = snd_ctl_open,
|
||||||
.release = snd_ctl_release,
|
.release = snd_ctl_release,
|
||||||
|
.llseek = no_llseek,
|
||||||
.poll = snd_ctl_poll,
|
.poll = snd_ctl_poll,
|
||||||
.unlocked_ioctl = snd_ctl_ioctl,
|
.unlocked_ioctl = snd_ctl_ioctl,
|
||||||
.compat_ioctl = snd_ctl_ioctl_compat,
|
.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;
|
struct snd_mixer_oss_file *fmixer;
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
|
err = nonseekable_open(inode, file);
|
||||||
|
if (err < 0)
|
||||||
|
return err;
|
||||||
|
|
||||||
card = snd_lookup_oss_minor_data(iminor(inode),
|
card = snd_lookup_oss_minor_data(iminor(inode),
|
||||||
SNDRV_OSS_DEVICE_TYPE_MIXER);
|
SNDRV_OSS_DEVICE_TYPE_MIXER);
|
||||||
if (card == NULL)
|
if (card == NULL)
|
||||||
|
@ -397,6 +401,7 @@ static const struct file_operations snd_mixer_oss_f_ops =
|
||||||
.owner = THIS_MODULE,
|
.owner = THIS_MODULE,
|
||||||
.open = snd_mixer_oss_open,
|
.open = snd_mixer_oss_open,
|
||||||
.release = snd_mixer_oss_release,
|
.release = snd_mixer_oss_release,
|
||||||
|
.llseek = no_llseek,
|
||||||
.unlocked_ioctl = snd_mixer_oss_ioctl,
|
.unlocked_ioctl = snd_mixer_oss_ioctl,
|
||||||
.compat_ioctl = snd_mixer_oss_ioctl_compat,
|
.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;
|
int nonblock;
|
||||||
wait_queue_t wait;
|
wait_queue_t wait;
|
||||||
|
|
||||||
|
err = nonseekable_open(inode, file);
|
||||||
|
if (err < 0)
|
||||||
|
return err;
|
||||||
|
|
||||||
pcm = snd_lookup_oss_minor_data(iminor(inode),
|
pcm = snd_lookup_oss_minor_data(iminor(inode),
|
||||||
SNDRV_OSS_DEVICE_TYPE_PCM);
|
SNDRV_OSS_DEVICE_TYPE_PCM);
|
||||||
if (pcm == NULL) {
|
if (pcm == NULL) {
|
||||||
|
@ -2977,6 +2981,7 @@ static const struct file_operations snd_pcm_oss_f_reg =
|
||||||
.write = snd_pcm_oss_write,
|
.write = snd_pcm_oss_write,
|
||||||
.open = snd_pcm_oss_open,
|
.open = snd_pcm_oss_open,
|
||||||
.release = snd_pcm_oss_release,
|
.release = snd_pcm_oss_release,
|
||||||
|
.llseek = no_llseek,
|
||||||
.poll = snd_pcm_oss_poll,
|
.poll = snd_pcm_oss_poll,
|
||||||
.unlocked_ioctl = snd_pcm_oss_ioctl,
|
.unlocked_ioctl = snd_pcm_oss_ioctl,
|
||||||
.compat_ioctl = snd_pcm_oss_ioctl_compat,
|
.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)
|
static int snd_pcm_playback_open(struct inode *inode, struct file *file)
|
||||||
{
|
{
|
||||||
struct snd_pcm *pcm;
|
struct snd_pcm *pcm;
|
||||||
|
int err = nonseekable_open(inode, file);
|
||||||
|
if (err < 0)
|
||||||
|
return err;
|
||||||
pcm = snd_lookup_minor_data(iminor(inode),
|
pcm = snd_lookup_minor_data(iminor(inode),
|
||||||
SNDRV_DEVICE_TYPE_PCM_PLAYBACK);
|
SNDRV_DEVICE_TYPE_PCM_PLAYBACK);
|
||||||
return snd_pcm_open(file, pcm, SNDRV_PCM_STREAM_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)
|
static int snd_pcm_capture_open(struct inode *inode, struct file *file)
|
||||||
{
|
{
|
||||||
struct snd_pcm *pcm;
|
struct snd_pcm *pcm;
|
||||||
|
int err = nonseekable_open(inode, file);
|
||||||
|
if (err < 0)
|
||||||
|
return err;
|
||||||
pcm = snd_lookup_minor_data(iminor(inode),
|
pcm = snd_lookup_minor_data(iminor(inode),
|
||||||
SNDRV_DEVICE_TYPE_PCM_CAPTURE);
|
SNDRV_DEVICE_TYPE_PCM_CAPTURE);
|
||||||
return snd_pcm_open(file, pcm, SNDRV_PCM_STREAM_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,
|
.aio_write = snd_pcm_aio_write,
|
||||||
.open = snd_pcm_playback_open,
|
.open = snd_pcm_playback_open,
|
||||||
.release = snd_pcm_release,
|
.release = snd_pcm_release,
|
||||||
|
.llseek = no_llseek,
|
||||||
.poll = snd_pcm_playback_poll,
|
.poll = snd_pcm_playback_poll,
|
||||||
.unlocked_ioctl = snd_pcm_playback_ioctl,
|
.unlocked_ioctl = snd_pcm_playback_ioctl,
|
||||||
.compat_ioctl = snd_pcm_ioctl_compat,
|
.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,
|
.aio_read = snd_pcm_aio_read,
|
||||||
.open = snd_pcm_capture_open,
|
.open = snd_pcm_capture_open,
|
||||||
.release = snd_pcm_release,
|
.release = snd_pcm_release,
|
||||||
|
.llseek = no_llseek,
|
||||||
.poll = snd_pcm_capture_poll,
|
.poll = snd_pcm_capture_poll,
|
||||||
.unlocked_ioctl = snd_pcm_capture_ioctl,
|
.unlocked_ioctl = snd_pcm_capture_ioctl,
|
||||||
.compat_ioctl = snd_pcm_ioctl_compat,
|
.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))
|
if ((file->f_flags & O_APPEND) && !(file->f_flags & O_NONBLOCK))
|
||||||
return -EINVAL; /* invalid combination */
|
return -EINVAL; /* invalid combination */
|
||||||
|
|
||||||
|
err = nonseekable_open(inode, file);
|
||||||
|
if (err < 0)
|
||||||
|
return err;
|
||||||
|
|
||||||
if (maj == snd_major) {
|
if (maj == snd_major) {
|
||||||
rmidi = snd_lookup_minor_data(iminor(inode),
|
rmidi = snd_lookup_minor_data(iminor(inode),
|
||||||
SNDRV_DEVICE_TYPE_RAWMIDI);
|
SNDRV_DEVICE_TYPE_RAWMIDI);
|
||||||
|
@ -1391,6 +1395,7 @@ static const struct file_operations snd_rawmidi_f_ops =
|
||||||
.write = snd_rawmidi_write,
|
.write = snd_rawmidi_write,
|
||||||
.open = snd_rawmidi_open,
|
.open = snd_rawmidi_open,
|
||||||
.release = snd_rawmidi_release,
|
.release = snd_rawmidi_release,
|
||||||
|
.llseek = no_llseek,
|
||||||
.poll = snd_rawmidi_poll,
|
.poll = snd_rawmidi_poll,
|
||||||
.unlocked_ioctl = snd_rawmidi_ioctl,
|
.unlocked_ioctl = snd_rawmidi_ioctl,
|
||||||
.compat_ioctl = snd_rawmidi_ioctl_compat,
|
.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 */
|
int c, mode; /* client id */
|
||||||
struct snd_seq_client *client;
|
struct snd_seq_client *client;
|
||||||
struct snd_seq_user_client *user;
|
struct snd_seq_user_client *user;
|
||||||
|
int err;
|
||||||
|
|
||||||
|
err = nonseekable_open(inode, file);
|
||||||
|
if (err < 0)
|
||||||
|
return err;
|
||||||
|
|
||||||
if (mutex_lock_interruptible(®ister_mutex))
|
if (mutex_lock_interruptible(®ister_mutex))
|
||||||
return -ERESTARTSYS;
|
return -ERESTARTSYS;
|
||||||
|
@ -2550,6 +2555,7 @@ static const struct file_operations snd_seq_f_ops =
|
||||||
.write = snd_seq_write,
|
.write = snd_seq_write,
|
||||||
.open = snd_seq_open,
|
.open = snd_seq_open,
|
||||||
.release = snd_seq_release,
|
.release = snd_seq_release,
|
||||||
|
.llseek = no_llseek,
|
||||||
.poll = snd_seq_poll,
|
.poll = snd_seq_poll,
|
||||||
.unlocked_ioctl = snd_seq_ioctl,
|
.unlocked_ioctl = snd_seq_ioctl,
|
||||||
.compat_ioctl = snd_seq_ioctl_compat,
|
.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)
|
static int snd_timer_user_open(struct inode *inode, struct file *file)
|
||||||
{
|
{
|
||||||
struct snd_timer_user *tu;
|
struct snd_timer_user *tu;
|
||||||
|
int err;
|
||||||
|
|
||||||
|
err = nonseekable_open(inode, file);
|
||||||
|
if (err < 0)
|
||||||
|
return err;
|
||||||
|
|
||||||
tu = kzalloc(sizeof(*tu), GFP_KERNEL);
|
tu = kzalloc(sizeof(*tu), GFP_KERNEL);
|
||||||
if (tu == NULL)
|
if (tu == NULL)
|
||||||
|
@ -1921,6 +1926,7 @@ static const struct file_operations snd_timer_f_ops =
|
||||||
.read = snd_timer_user_read,
|
.read = snd_timer_user_read,
|
||||||
.open = snd_timer_user_open,
|
.open = snd_timer_user_open,
|
||||||
.release = snd_timer_user_release,
|
.release = snd_timer_user_release,
|
||||||
|
.llseek = no_llseek,
|
||||||
.poll = snd_timer_user_poll,
|
.poll = snd_timer_user_poll,
|
||||||
.unlocked_ioctl = snd_timer_user_ioctl,
|
.unlocked_ioctl = snd_timer_user_ioctl,
|
||||||
.compat_ioctl = snd_timer_user_ioctl_compat,
|
.compat_ioctl = snd_timer_user_ioctl_compat,
|
||||||
|
|
Loading…
Reference in a new issue