USB: make usb-skeleton honor O_NONBLOCK in write path
authorOliver Neukum <oliver@neukum.org>
Wed, 9 Sep 2009 08:23:35 +0000 (10:23 +0200)
committerGreg Kroah-Hartman <gregkh@suse.de>
Wed, 23 Sep 2009 13:46:40 +0000 (06:46 -0700)
usb:usb-skeleton: honor O_NONBLOCK in write path

nonblocking writes are allowed by using down_trylock if necessary
to reserve an URB

Signed-off-by: Oliver Neukum <oliver@neukum.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
drivers/usb/usb-skeleton.c

index 5ffa3e2..768fda9 100644 (file)
@@ -399,9 +399,16 @@ static ssize_t skel_write(struct file *file, const char *user_buffer, size_t cou
                goto exit;
 
        /* limit the number of URBs in flight to stop a user from using up all RAM */
-       if (down_interruptible(&dev->limit_sem)) {
-               retval = -ERESTARTSYS;
-               goto exit;
+       if (!file->f_flags & O_NONBLOCK) {
+               if (down_interruptible(&dev->limit_sem)) {
+                       retval = -ERESTARTSYS;
+                       goto exit;
+               }
+       } else {
+               if (down_trylock(&dev->limit_sem)) {
+                       retval = -EAGAIN;
+                       goto exit;
+               }
        }
 
        spin_lock_irq(&dev->err_lock);