sound: oss: midibuf: fix sleep_on races
authorArnd Bergmann <arnd@arndb.de>
Thu, 2 Jan 2014 12:07:48 +0000 (13:07 +0100)
committerTakashi Iwai <tiwai@suse.de>
Tue, 14 Jan 2014 15:11:44 +0000 (16:11 +0100)
sleep_on is known to be racy and going away because of this. All instances
of interruptible_sleep_on and interruptible_sleep_on_timeout in the midibuf
driver can trivially be replaced with wait_event_interruptible and
wait_event_interruptible_timeout.

[fixed coding style warnings by tiwai]

Signed-off-by: Arnd Bergmann <arnd@arndb.de>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/oss/midibuf.c

index 8cdb2cfe65c841a7f942a25fde54b9d04e0d3ea6..8f45cd999965cd7695236ae01a23542972a14fd2 100644 (file)
@@ -86,9 +86,8 @@ static void drain_midi_queue(int dev)
         */
 
        if (midi_devs[dev]->buffer_status != NULL)
-               while (!signal_pending(current) && midi_devs[dev]->buffer_status(dev)) 
-                       interruptible_sleep_on_timeout(&midi_sleeper[dev],
-                                                      HZ/10);
+               wait_event_interruptible_timeout(midi_sleeper[dev],
+                               !midi_devs[dev]->buffer_status(dev), HZ/10);
 }
 
 static void midi_input_intr(int dev, unsigned char data)
@@ -233,8 +232,8 @@ void MIDIbuf_release(int dev, struct file *file)
                                                           * devices
                                                         */
 
-               while (!signal_pending(current) && DATA_AVAIL(midi_out_buf[dev]))
-                         interruptible_sleep_on(&midi_sleeper[dev]);
+               wait_event_interruptible(midi_sleeper[dev],
+                                        !DATA_AVAIL(midi_out_buf[dev]));
                /*
                 *      Sync
                 */
@@ -282,8 +281,8 @@ int MIDIbuf_write(int dev, struct file *file, const char __user *buf, int count)
                                goto out;
                        }
 
-                       interruptible_sleep_on(&midi_sleeper[dev]);
-                       if (signal_pending(current)) 
+                       if (wait_event_interruptible(midi_sleeper[dev],
+                                               SPACE_AVAIL(midi_out_buf[dev])))
                        {
                                c = -EINTR;
                                goto out;
@@ -325,8 +324,9 @@ int MIDIbuf_read(int dev, struct file *file, char __user *buf, int count)
                        c = -EAGAIN;
                        goto out;
                }
-               interruptible_sleep_on_timeout(&input_sleeper[dev],
-                                              parms[dev].prech_timeout);
+               wait_event_interruptible_timeout(input_sleeper[dev],
+                                                DATA_AVAIL(midi_in_buf[dev]),
+                                                parms[dev].prech_timeout);
 
                if (signal_pending(current))
                        c = -EINTR;     /* The user is getting restless */