]> Git Repo - linux.git/commitdiff
sound: oss: vwsnd: avoid interruptible_sleep_on
authorArnd Bergmann <[email protected]>
Thu, 2 Jan 2014 12:07:49 +0000 (13:07 +0100)
committerTakashi Iwai <[email protected]>
Tue, 14 Jan 2014 15:01:27 +0000 (16:01 +0100)
Interruptible_sleep_on is racy and we want to remove it. This replaces
the use in the vwsnd driver with an open-coded prepare_to_wait
loop that fixes the race between concurrent open() and close() calls,
and also drops the global mutex while waiting here, which restores
the original behavior that was changed during the BKL removal.

Signed-off-by: Arnd Bergmann <[email protected]>
Signed-off-by: Takashi Iwai <[email protected]>
sound/oss/vwsnd.c

index 4bbcc0fcd4eb0d7c988c06e21cc76afb1236969e..a077e9c69a5ea95610256345f73fb8c5ebdadaa4 100644 (file)
@@ -2921,6 +2921,7 @@ static int vwsnd_audio_open(struct inode *inode, struct file *file)
        vwsnd_dev_t *devc;
        int minor = iminor(inode);
        int sw_samplefmt;
+       DEFINE_WAIT(wait);
 
        DBGE("(inode=0x%p, file=0x%p)\n", inode, file);
 
@@ -2937,21 +2938,26 @@ static int vwsnd_audio_open(struct inode *inode, struct file *file)
        }
 
        mutex_lock(&devc->open_mutex);
-       while (devc->open_mode & file->f_mode) {
+       while (1) {
+               prepare_to_wait(&devc->open_wait, &wait, TASK_INTERRUPTIBLE);
+               if (!(devc->open_mode & file->f_mode))
+                       break;
+
                mutex_unlock(&devc->open_mutex);
+               mutex_unlock(&vwsnd_mutex);
                if (file->f_flags & O_NONBLOCK) {
                        DEC_USE_COUNT;
-                       mutex_unlock(&vwsnd_mutex);
                        return -EBUSY;
                }
-               interruptible_sleep_on(&devc->open_wait);
+               schedule();
                if (signal_pending(current)) {
                        DEC_USE_COUNT;
-                       mutex_unlock(&vwsnd_mutex);
                        return -ERESTARTSYS;
                }
+               mutex_lock(&vwsnd_mutex);
                mutex_lock(&devc->open_mutex);
        }
+       finish_wait(&devc->open_wait, &wait);
        devc->open_mode |= file->f_mode & (FMODE_READ | FMODE_WRITE);
        mutex_unlock(&devc->open_mutex);
 
This page took 0.067645 seconds and 4 git commands to generate.