diff options
author | Oliver Neukum <oliver@neukum.org> | 2009-09-09 04:23:35 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2009-09-23 09:46:40 -0400 |
commit | 798199867385417ba6494472e39c016e3340758c (patch) | |
tree | 0be421533a966075130254d41ba0ae7ea0a25e71 | |
parent | e7389cc9a7ff7c6e760e741c81a751c834f7d145 (diff) |
USB: make usb-skeleton honor O_NONBLOCK in write path
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>
-rw-r--r-- | drivers/usb/usb-skeleton.c | 13 |
1 files changed, 10 insertions, 3 deletions
diff --git a/drivers/usb/usb-skeleton.c b/drivers/usb/usb-skeleton.c index 5ffa3e246856..768fda9064e9 100644 --- a/drivers/usb/usb-skeleton.c +++ b/drivers/usb/usb-skeleton.c | |||
@@ -399,9 +399,16 @@ static ssize_t skel_write(struct file *file, const char *user_buffer, size_t cou | |||
399 | goto exit; | 399 | goto exit; |
400 | 400 | ||
401 | /* limit the number of URBs in flight to stop a user from using up all RAM */ | 401 | /* limit the number of URBs in flight to stop a user from using up all RAM */ |
402 | if (down_interruptible(&dev->limit_sem)) { | 402 | if (!file->f_flags & O_NONBLOCK) { |
403 | retval = -ERESTARTSYS; | 403 | if (down_interruptible(&dev->limit_sem)) { |
404 | goto exit; | 404 | retval = -ERESTARTSYS; |
405 | goto exit; | ||
406 | } | ||
407 | } else { | ||
408 | if (down_trylock(&dev->limit_sem)) { | ||
409 | retval = -EAGAIN; | ||
410 | goto exit; | ||
411 | } | ||
405 | } | 412 | } |
406 | 413 | ||
407 | spin_lock_irq(&dev->err_lock); | 414 | spin_lock_irq(&dev->err_lock); |