]> git.karo-electronics.de Git - linux-beck.git/blobdiff - sound/oss/vwsnd.c
Merge tag 'md/3.14' of git://neil.brown.name/md
[linux-beck.git] / 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);