Matt and Andre:

It looks like the latest change introduced a problem.  The attached patch
should fix things up.

Alan

On 17 Dec 2002, Andr� Cruz wrote:

>
>
> ksymoops 2.4.5 on i686 2.5.52.  Options used
>      -V (default)
>      -k /proc/ksyms (default)
>      -l /proc/modules (default)
>      -o /lib/modules/2.5.52/ (default)
>      -m /boot/System.map-2.5.52 (default)
>
> Warning: You did not tell me where to find symbol information.  I will
> assume that the log matches the kernel and modules that are running
> right now and I'll use the default options above for symbol resolution.
> If the current kernel and/or modules do not match the log, you can get
> more accurate output by telling me the kernel version and where to find
> map, modules, ksyms etc.  ksymoops -h explains the options.
>
> Error (regular_file): read_ksyms stat /proc/ksyms failed
> No modules in ksyms, skipping objects
> No ksyms, skipping lsmod
> Unable to handle kernel NULL pointer dereference at virtual address
> 00000002
> c02aaede
> *pde = 00000000
> Oops: 0000
> CPU:    0
> EIP:    0060:[<c02aaede>]    Not tainted
> Using defaults from ksymoops -t elf32-i386 -a i386
> EFLAGS: 00010202
> eax: 00000001   ebx: 00000020   ecx: ef283ee0   edx: 00000000
> esi: 00000000   edi: ef283ef4   ebp: ef280600   esp: efc5bd4c
> ds: 0068   es: 0068   ss: 0068
> Stack: ef280600 00000000 00000174 0001a003 00000000 0002dabe 0000000f
> ef280604
>        c174b2d8 c03d624c c0137541 c174b2d8 00000000 c17aec40 00000000
> 00000246
>        c03d624c 000001ff effe83d0 00000000 eeadfea0 eeadf098 c01623d0
> eeadfea0
> Call Trace: [<c0137541>]  [<c01623d0>]  [<c013a38e>]  [<c028ff07>]
> [<c0200c65>]  [<c0200cff>]  [<c0200ed4>]  [<c01fff70>]  [<c029119c>]
> [<c0293546>]  [<c02939be>]  [<c0122265>]  [<c0293a65>]  [<c011e4c0>]
> [<c0293a30>]  [<c0109249>]
> Code: 0f b6 46 02 24 0f 88 85 9e 00 00 00 0f b6 46 06 8d 75 30 88
>
>
> >>EIP; c02aaede <storage_probe+5fe/de0>   <=====
>
> >>ecx; ef283ee0 <END_OF_CODE+2ed513b4/????>
> >>edi; ef283ef4 <END_OF_CODE+2ed513c8/????>
> >>ebp; ef280600 <END_OF_CODE+2ed4dad4/????>
> >>esp; efc5bd4c <END_OF_CODE+2f729220/????>
>
> Trace; c0137541 <buffered_rmqueue+91/100>
> Trace; c01623d0 <inode_init_once+20/100>
> Trace; c013a38e <cache_grow+12e/1e0>
> Trace; c028ff07 <usb_device_probe+a7/d0>
> Trace; c0200c65 <bus_match+45/80>
> Trace; c0200cff <device_attach+5f/80>
> Trace; c0200ed4 <bus_add_device+64/b0>
> Trace; c01fff70 <device_add+d0/120>
> Trace; c029119c <usb_new_device+38c/4c0>
> Trace; c0293546 <usb_hub_port_connect_change+1f6/310>
> Trace; c02939be <usb_hub_events+35e/3d0>
> Trace; c0122265 <reparent_to_init+d5/160>
> Trace; c0293a65 <usb_hub_thread+35/110>
> Trace; c011e4c0 <default_wake_function+0/40>
> Trace; c0293a30 <usb_hub_thread+0/110>
> Trace; c0109249 <kernel_thread_helper+5/c>
>
> Code;  c02aaede <storage_probe+5fe/de0>
> 00000000 <_EIP>:
> Code;  c02aaede <storage_probe+5fe/de0>   <=====
>    0:   0f b6 46 02               movzbl 0x2(%esi),%eax   <=====
> Code;  c02aaee2 <storage_probe+602/de0>
>    4:   24 0f                     and    $0xf,%al
> Code;  c02aaee4 <storage_probe+604/de0>
>    6:   88 85 9e 00 00 00         mov    %al,0x9e(%ebp)
> Code;  c02aaeea <storage_probe+60a/de0>
>    c:   0f b6 46 06               movzbl 0x6(%esi),%eax
> Code;  c02aaeee <storage_probe+60e/de0>
>   10:   8d 75 30                  lea    0x30(%ebp),%esi
> Code;  c02aaef1 <storage_probe+611/de0>
>   13:   88 00                     mov    %al,(%eax)

This is the section of code in storage_probe that reads:

                ss->ep_int = ep_int->bEndpointAddress &
                        USB_ENDPOINT_NUMBER_MASK;

The problem is that ep_int is a null pointer (unless the protocol is CBI,
which apparently this one wasn't).

>
>
> 1 warning and 1 error issued.  Results may not be reliable.
>
> Also, can anyone tell me which usb-storage driver this is?:
>
>   Vendor:           Model: USB Storage-CFC   Rev: 0212
>   Type:   Direct-Access                      ANSI SCSI revision: 02
>
> It only shows this with 2.5 kernels but mount fails.
> Thanks.
>

That's not a driver, it's an identification string created by the vendor
of the device.  You could learn more about it by checking in
/proc/bus/usb/devices (unless that file has moved since the last time I
looked), or by turning on the flag for usb-storage debugging and looking
in your kernel log.

Alan Stern
# This is a BitKeeper generated patch for the following project:
# Project Name: greg k-h's linux 2.5 USB kernel tree
# This patch format is intended for GNU patch command version 2.5 or higher.
# This patch includes the following deltas:
#                  ChangeSet    1.993   -> 1.994  
#       drivers/usb/storage/usb.c       1.58    -> 1.59   
#
# The following is the BitKeeper ChangeSet Log
# --------------------------------------------
# 02/12/17      [EMAIL PROTECTED]   1.994
# Don't try to dereference the interrupt endpoint if it doesn't exist.
# --------------------------------------------
#
diff -Nru a/drivers/usb/storage/usb.c b/drivers/usb/storage/usb.c
--- a/drivers/usb/storage/usb.c Tue Dec 17 11:01:00 2002
+++ b/drivers/usb/storage/usb.c Tue Dec 17 11:01:00 2002
@@ -728,9 +728,13 @@
                        USB_ENDPOINT_NUMBER_MASK;
                ss->ep_out = ep_out->bEndpointAddress & 
                        USB_ENDPOINT_NUMBER_MASK;
-               ss->ep_int = ep_int->bEndpointAddress & 
-                       USB_ENDPOINT_NUMBER_MASK;
-               ss->ep_bInterval = ep_int->bInterval;
+               if (ep_int) {
+                       ss->ep_int = ep_int->bEndpointAddress & 
+                               USB_ENDPOINT_NUMBER_MASK;
+                       ss->ep_bInterval = ep_int->bInterval;
+               }
+               else
+                       ss->ep_int = ss->ep_bInterval = 0;
 
                /* allocate the URB, the usb_ctrlrequest, and the IRQ URB */
                if (usb_stor_allocate_urbs(ss))
@@ -771,9 +775,13 @@
                        USB_ENDPOINT_NUMBER_MASK;
                ss->ep_out = ep_out->bEndpointAddress & 
                        USB_ENDPOINT_NUMBER_MASK;
-               ss->ep_int = ep_int->bEndpointAddress & 
-                       USB_ENDPOINT_NUMBER_MASK;
-               ss->ep_bInterval = ep_int->bInterval;
+               if (ep_int) {
+                       ss->ep_int = ep_int->bEndpointAddress & 
+                               USB_ENDPOINT_NUMBER_MASK;
+                       ss->ep_bInterval = ep_int->bInterval;
+               }
+               else
+                       ss->ep_int = ss->ep_bInterval = 0;
 
                /* establish the connection to the new device */
                ss->ifnum = ifnum;

Reply via email to