Hm, this patch is linewrapped or something, and can't be applied. Can you try to send it again so that it doesn't get mangled?
Sorry about that.
I'm sending it attached this time to avoid the mess :)
-- Paulo Marques - www.grupopie.com
"In a world without walls and fences who needs windows and gates?"
--- drivers/usb/class/usblp.ori Tue Dec 30 18:52:19 2003 +++ drivers/usb/class/usblp.c Tue Dec 30 18:53:31 2003 @@ -603,14 +603,14 @@ { DECLARE_WAITQUEUE(wait, current); struct usblp *usblp = file->private_data; - int timeout, err = 0; + int timeout, err = 0, transfer_length; size_t writecount = 0; while (writecount < count) { if (!usblp->wcomplete) { barrier(); if (file->f_flags & O_NONBLOCK) - return -EAGAIN; + return writecount ? writecount : -EAGAIN; timeout = USBLP_WRITE_TIMEOUT; add_wait_queue(&usblp->wait, &wait); @@ -654,31 +654,26 @@ continue; } - writecount += usblp->writeurb->transfer_buffer_length; - usblp->writeurb->transfer_buffer_length = 0; + transfer_length = (count - writecount) < USBLP_BUF_SIZE ? + (count - writecount) : USBLP_BUF_SIZE; - if (writecount == count) { - up (&usblp->sem); - break; - } + usblp->writeurb->transfer_buffer_length = transfer_length; - usblp->writeurb->transfer_buffer_length = (count - writecount) < USBLP_BUF_SIZE ? - (count - writecount) : USBLP_BUF_SIZE; - - if (copy_from_user(usblp->writeurb->transfer_buffer, buffer + writecount, - usblp->writeurb->transfer_buffer_length)) { + if (copy_from_user(usblp->writeurb->transfer_buffer, buffer + writecount, transfer_length)) { up(&usblp->sem); return writecount ? writecount : -EFAULT; } usblp->writeurb->dev = usblp->dev; usblp->wcomplete = 0; - if (usb_submit_urb(usblp->writeurb, GFP_KERNEL)) { - count = -EIO; + if ((err = usb_submit_urb(usblp->writeurb, GFP_KERNEL))) { + count = err != -ENOMEM ? -EIO : (writecount ? writecount : -ENOMEM); up (&usblp->sem); break; } up (&usblp->sem); + + writecount += transfer_length; } return count;