aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/usb/class/usblp.c
diff options
context:
space:
mode:
authorPete Zaitcev <zaitcev@redhat.com>2007-07-10 23:09:58 -0400
committerGreg Kroah-Hartman <gregkh@suse.de>2007-07-19 20:46:03 -0400
commit10e485221edd2799dc495e4cde98fe74aeb292b1 (patch)
tree44998327db21c9b1afa1166358e697244ad7a96c /drivers/usb/class/usblp.c
parent9454c46a89c13fe82a28c91706b86f612fd19462 (diff)
USB: usblp: "Big cleanup" breaks O_NONBLOCK
I found the first regresson in the rewritten ("all dynamic" and "no races") driver. If application uses O_NONBLOCK, I return -EAGAIN despite the URB being submitted successfuly. This causes the application to resubmit the same data erroneously. The fix is to pretend that the transfer has succeeded even if URB was merely queued. It is the same behaviour as with the old version. Signed-off-by: Pete Zaitcev <zaitcev@redhat.com> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers/usb/class/usblp.c')
-rw-r--r--drivers/usb/class/usblp.c9
1 files changed, 5 insertions, 4 deletions
diff --git a/drivers/usb/class/usblp.c b/drivers/usb/class/usblp.c
index 9a1478972bf5..80ec1039d670 100644
--- a/drivers/usb/class/usblp.c
+++ b/drivers/usb/class/usblp.c
@@ -741,10 +741,11 @@ static ssize_t usblp_write(struct file *file, const char __user *buffer, size_t
741 */ 741 */
742 rv = usblp_wwait(usblp, !!(file->f_flags&O_NONBLOCK)); 742 rv = usblp_wwait(usblp, !!(file->f_flags&O_NONBLOCK));
743 if (rv < 0) { 743 if (rv < 0) {
744 /* 744 if (rv == -EAGAIN) {
745 * If interrupted, we simply leave the URB to dangle, 745 /* Presume that it's going to complete well. */
746 * so the ->release will call usb_kill_urb(). 746 writecount += transfer_length;
747 */ 747 }
748 /* Leave URB dangling, to be cleaned on close. */
748 goto collect_error; 749 goto collect_error;
749 } 750 }
750 751