On Tue, 27 Jul 2004, Pete Zaitcev wrote:
> On Tue, 27 Jul 2004 00:52:52 -0500
> Dmitry Torokhov <[EMAIL PROTECTED]> wrote:
>
> > Got the following OOps when when turning off a all-in-one USB printer/scanner
> > after scanning an image with Xsane and leaving Xsane window open.
>
> > EIP is at usb_buffer_free+0x1a/0x50 [usbcore]
> > Process ptal-mlcd (pid: 2292, threadinfo=dd77c000 task=df8e80f0)
> > Call Trace:
> > [<c01054fa>] show_stack+0x7a/0x90
> > [<c010567a>] show_registers+0x14a/0x1b0
> > [<c010580d>] die+0x8d/0x100
> > [<c0114097>] do_page_fault+0x1f7/0x540
> > [<c0105195>] error_code+0x2d/0x38
> > [<e0f153de>] usblp_cleanup+0x3e/0x90 [usblp]
> > [<e0f154b7>] usblp_release+0x57/0x60 [usblp]
> > [<c014f437>] __fput+0x117/0x130
> > [<c014dcdf>] filp_close+0x4f/0x80
> > [<c0104feb>] syscall_call+0x7/0xb
>
> This looks awfully familiar. In fact I'm sure I have fixed this for 2.4.
>
> Is this reproducible? If yes, pleas try the appended patch and let us
> know if it fixes the problem (it's a forward port of my fix from the
> Marcelo tree).
>
> -- Pete
I suspect Pete's patch doesn't really address this problem. The oops is
caused by the fact that usblp_release() calls usblp_cleanup() which in
turn calls usb_buffer_free() _after_ usblp_disconnect() has returned and
the device is gone. That's not a good thing to do.
The patch below (which can be used independently of Pete's patch) should
fix this problem. It moves the call to usb_buffer_free() out of the
cleanup routine and into the disconnect routine. Be warned that I haven't
tested it!
Alan Stern
Signed-off-by: Alan Stern <[EMAIL PROTECTED]>
--- 2.6/drivers/usb/class/usblp.c Tue Jul 27 10:23:12 2004
+++ 2.6/drivers/usb/class/usblp.c Tue Jul 27 10:26:55 2004
@@ -398,10 +398,6 @@
{
info("usblp%d: removed", usblp->minor);
- usb_buffer_free (usblp->dev, USBLP_BUF_SIZE,
- usblp->writebuf, usblp->writeurb->transfer_dma);
- usb_buffer_free (usblp->dev, USBLP_BUF_SIZE,
- usblp->readbuf, usblp->readurb->transfer_dma);
kfree (usblp->device_id_string);
kfree (usblp->statusbuf);
usb_free_urb(usblp->writeurb);
@@ -1160,6 +1156,10 @@
usb_set_intfdata (intf, NULL);
usblp_unlink_urbs(usblp);
+ usb_buffer_free (usblp->dev, USBLP_BUF_SIZE,
+ usblp->writebuf, usblp->writeurb->transfer_dma);
+ usb_buffer_free (usblp->dev, USBLP_BUF_SIZE,
+ usblp->readbuf, usblp->readurb->transfer_dma);
up (&usblp->sem);
if (!usblp->used)
-------------------------------------------------------
This SF.Net email is sponsored by BEA Weblogic Workshop
FREE Java Enterprise J2EE developer tools!
Get your free copy of BEA WebLogic Workshop 8.1 today.
http://ads.osdn.com/?ad_id=4721&alloc_id=10040&op=click
_______________________________________________
[EMAIL PROTECTED]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel