[SCSI] aha152x: Fix oops on module removal
Reported-by: Frank de Jong <frapex@xs4all.nl>
> after trying to unload the module:
> BUG: unable to handle kernel paging request at
00100100
> IP: [<
fb9ff667>] :aha152x:aha152x_exit+0x47/0x6a
> *pde =
00000000
> Oops: 0000 [#1] PREEMPT SMP
> Modules linked in: aha152x(-) w83781d hwmon_vid tun ne 8390 bonding
> usb_storage snd_usb_audio snd_usb_lib snd_rawmidi pwc snd_seq_device
> compat_ioctl32 snd_hwdep videodev v4l1_compat 3c59x mii intel_agp
> agpgart snd_pcm_oss snd_pcm snd_timer snd_page_alloc snd_mixer_oss snd
>
> Pid: 2837, comm: rmmod Not tainted (2.6.25.3 #1)
> EIP: 0060:[<
fb9ff667>] EFLAGS:
00210212 CPU: 0
> EIP is at aha152x_exit+0x47/0x6a [aha152x]
> EAX:
00000001 EBX:
000ffdc4 ECX:
f7c517a8 EDX:
00000001
> ESI:
00000000 EDI:
00000003 EBP:
e7880000 ESP:
e7881f58
> DS: 007b ES: 007b FS: 00d8 GS: 0033 SS: 0068
> Process rmmod (pid: 2837, ti=
e7880000 task=
f27eb580 task.ti=
e7880000)
> Stack:
fba03700 c01419d2 31616861 00783235 e795ee70 c0157709 b7f24000 e79ae000
>
c0158271 ffffffff b7f25000 e79ae004 e795e370 b7f25000 e795e37c e795e370
>
009ae000 fba03700 00000880 e7881fa8 00000000 bf93ec20 bf93ec20 c0102faa
> Call Trace:
> [<
c01419d2>] sys_delete_module+0x112/0x1a0
> [<
c0157709>] remove_vma+0x39/0x50
> [<
c0158271>] do_munmap+0x181/0x1f0
> [<
c0102faa>] sysenter_past_esp+0x5f/0x85
> [<
c0490000>] rsc_parse+0x0/0x3c0
The problem is that the driver calls aha152x_release() under a
list_for_each_entry(). Unfortunately, aha152x_release() deletes from
the list in question. Fix this by using list_for_each_entry_safe().
Cc: Stable Tree <stable@kernel.org>
Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com>