From: Andy Lutomirski <luto@myrealbox.com>
To: linux-usb-devel@lists.sourceforge.net, linux-kernel@vger.kernel.org
Subject: [BUG] usblp_write spins forever after an error
Date: Sun, 15 Feb 2004 13:55:32 -0800 [thread overview]
Message-ID: <402FEAD4.8020602@myrealbox.com> (raw)
I recently cancelled a print job with the printer's cancel function, and the
CUPS backend got stuck in usblp_write (using 100% CPU and not responding to
signals).
The printer is a Kyocera Mita FS-1900 (which has some other problems with the
linux USB code: usblp_check_status often times out, even though the printer is
bidirectional -- but that's a whole different issue).
It looks like the problem is that the write failed, so wcomplete got set
to 1 and the status is nonzero. This case appears to be mishandled in usblp.c:
while (writecount < count) {
if (!usblp->wcomplete) {
[... not reaching this code]
}
down (&usblp->sem);
if (!usblp->present) {
up (&usblp->sem);
return -ENODEV;
}
if (usblp->writeurb->status != 0) {
[ check status? ]
schedule ();
continue; <-- problem
}
After the write fails, the current code keeps checking the same status, and
never checks for signals or fails. I'm not sure what the right fix is, but it
might be something like this:
--- ./usblp.c.orig 2004-02-15 06:27:29.176169752 -0800
+++ ./usblp.c 2004-02-15 06:29:40.137260640 -0800
@@ -645,13 +645,11 @@
err = usblp->writeurb->status;
} else
err = usblp_check_status(usblp, err);
- up (&usblp->sem);
- /* if the fault was due to disconnect, let khubd's
- * call to usblp_disconnect() grab usblp->sem ...
- */
- schedule ();
- continue;
+ writecount += usblp->writeurb->transfer_buffer_length;
+ up (&usblp->sem);
+ count = writecount ? writecount : err;
+ break;
}
writecount += usblp->writeurb->transfer_buffer_length;
--Andy
Please CC me -- I'm not subscribed.
next reply other threads:[~2004-02-15 21:53 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2004-02-15 21:55 Andy Lutomirski [this message]
2004-02-16 3:58 ` [BUG] usblp_write spins forever after an error Greg KH
2004-02-16 15:16 ` [linux-usb-devel] " Paulo Marques
2004-03-04 11:25 ` David Woodhouse
2004-03-04 12:33 ` Paulo Marques
2004-03-05 9:41 ` David Woodhouse
2004-03-05 14:27 ` Paulo Marques
2004-03-05 18:11 ` [PATCH] usblp.c (Was: usblp_write spins forever after an error) Paulo Marques
2004-03-11 1:33 ` Greg KH
2004-05-10 11:34 ` David Woodhouse
2004-02-17 4:40 ` [BUG] usblp_write spins forever after an error Andy Lutomirski
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=402FEAD4.8020602@myrealbox.com \
--to=luto@myrealbox.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-usb-devel@lists.sourceforge.net \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox