linux-ide.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* IDE problems in 2.6.12-rc1-bk1 onwards (was Re: 2.6.12-rc3-mm1)
@ 2005-05-01 17:59 Richard Purdie
  2005-05-01 18:41 ` Bartlomiej Zolnierkiewicz
  2005-05-02 17:47 ` Alan Cox
  0 siblings, 2 replies; 6+ messages in thread
From: Richard Purdie @ 2005-05-01 17:59 UTC (permalink / raw)
  To: Linux Kernel Mailing List, bzolnier
  Cc: Dominik Brodowski, Andrew Morton, linux-ide

I've switched back to 2.6.12-rc3-mm1 and added some debuging to all the ide 
functions to trace the order functions are getting called. I've shown the 
result below for two different oops. There is more than one problem. The 
first problem was introduced in 2.6.12-rc1-bk1 in the ide-disk changes. The 
second has been around for a while but is showing up again.

The problem is idedisk_cleanup() gets called twice from ide_unregister(). 
Once here:

 for (unit = 0; unit < MAX_DRIVES; ++unit) {
  drive = &hwif->drives[unit];
  if (!drive->present)
   continue;
  DRIVER(drive)->cleanup(drive);
 }

and secondly in ide_unregister indirectly via:

  blk_cleanup_queue(drive->queue);
  printk(KERN_ERR "ide_unregister4()\n");
  device_unregister(&drive->gendev);
  down(&drive->gendev_rel_sem);
  spin_lock_irq(&ide_lock);
  drive->queue = NULL;
  printk(KERN_ERR "ide_unregister5()\n");

device_unregister()  triggers ide_drive_remove() which calls 
DRIVER(drive)->cleanup(drive);

In the first call to idedisk_cleanup(), ide_disk_put(idkp) is called which 
decreases the reference counter to zero. This triggers ide_disk_release() 
which calls kfree(idkp). Hence the second call to idedisk_cleanup() calls 
what is now a null pointer (or worse).

The solution is that ide_drive_remove() should no longer be calling 
DRIVER(drive)->cleanup(drive) as the refcounting now takes care of 
everything (although I'm presuming refcounting has been added to all drive 
types). I removed the above call and it cures both this oops and the one 
below.

The second oops is for similar reasons but "cardctl eject" doesn't succeed 
highlighting a second issue. ide_unregister() is called but aborts leaving 
ide-cs thinking the call succeeded when it didn't. This leads to the io 
timeouts.

Solution: ide_unregister() should return failure and pass responsibility for 
handling it to ide-cs or it should always succeed. I'd favour the latter as 
the ide layer should really handle its own cleanup. Maybe a parameter should 
be added to ide_unregister() to select the behaviour if the drive is busy/in 
use? If the hardware is gone, we want it to happen regardless for example...

------------------- Opps #1 -------------------

root@c7x0:~# cardmgr
cardmgr[1900]: cannot access /lib/modules/2.6.12-rc3-mm1: No such file or 
directory
cardmgr[1900]: watching 1 socket
root@c7x0:~# ide_uregister_hw_with_fixup()
init_hwif_data()
init_hwif_default()
ide_hwif_request_regions()
hwif_request_region()
hwif_request_region()
hda: KODAK LM, CFA DISK drive
ide0 at 0xc2860000-0xc2860007,0xc286000e on irq 40
ide_add_generic_settings()
ide_add_generic_settings()
ata_attach()
idedisk_attach()
ide_register_subdriver()
idedisk_setup()
hda: max request size: 128KiB
init_idedisk_capacity()
lba_capacity_is_ok()
hda: 128512 sectors (65 MB) w/1KiB Cache, CHS=1004/4/32
hda: cache flushes not supported
ide_disk_open()
ide_disk_get()
idedisk_media_changed()
idedisk_revalidate_disk()
 hda:<3>ide_do_rw_disk()
 hda1
idedisk_release()
ide_cacheflush_p()
ide_disk_put()
ide-cs: hda: Vcc = 3.3, Vpp = 0.0
ide_disk_open()
ide_disk_get()
idedisk_media_changed()
idedisk_revalidate_disk()
idedisk_revalidate_disk()
 hda:<3>ide_do_rw_disk()
 hda1
root@c7x0:~# umount /dev/hda1
idedisk_release()
ide_cacheflush_p()
ide_disk_put()
root@c7x0:~# cardctl eject
ide_unregister()
ide_unregister1()
idedisk_cleanup()
ide_cacheflush_p()
ide_unregister_subdriver()
auto_remove_settings()
ide_disk_put()
ide_disk_release()
ide_unregister2()
ide_unregister3()
ide_hwif_release_regions()
ide_unregister4()
ide_drive_remove()
Unable to handle kernel NULL pointer dereference at virtual address 00000010
pgd = c10bc000
[00000010] *pgd=a119c031, *pte=00000000, *ppte=00000000
Internal error: Oops: 17 [#1]
Modules linked in:
CPU: 0
PC is at ide_drive_remove+0x28/0x38
LR is at ide_drive_remove+0x2c/0x38
pc : [<c0152190>]    lr : [<c0152194>]    Not tainted
sp : c15efcb4  ip : c15efbfc  fp : c15efcc4
r10: c03cb804  r9 : c0283088  r8 : 00000000
r7 : c0283260  r6 : c02832a8  r5 : c023ea10  r4 : c0283118
r3 : 00000000  r2 : 00000000  r1 : 00000000  r0 : c0283118
Flags: nZCv  IRQs on  FIQs on  Mode SVC_32  Segment user
Control: 397F  Table: A10BC000  DAC: 00000015
Process cardctl (pid: 2052, stack limit = 0xc15ee194)
Stack: (0xc15efcb4 to 0xc15f0000)
fca0:                                              c0283200 c15efce4 
c15efcc8
fcc0: c012de44 c0152174 c0283200 c0283630 c0283260 c023e590 c15efd04 
c15efce8
fce0: c012d6d8 c012dd94 c0283200 c0283630 c0283260 00000000 c15efd20 
c15efd08
 [stack snipped]
Backtrace:
[<c0152168>] (ide_drive_remove+0x0/0x38) from [<c012de44>] 
(device_release_driver+0xbc/0xc4)
 r4 = C0283200
[<c012dd88>] (device_release_driver+0x0/0xc4) from [<c012d6d8>] 
(bus_remove_device+0x5c/0xa8)
 r7 = C023E590  r6 = C0283260  r5 = C0283630  r4 = C0283200
[<c012d67c>] (bus_remove_device+0x0/0xa8) from [<c012c7d0>] 
(device_del+0x40/0x80)
 r7 = 00000000  r6 = C0283260  r5 = C0283630  r4 = C0283200
[<c012c790>] (device_del+0x0/0x80) from [<c012c824>] 
(device_unregister+0x14/0x20)
 r6 = 00000000  r5 = C03CA0A0  r4 = C0283200
[<c012c810>] (device_unregister+0x0/0x20) from [<c01503d4>] 
(ide_unregister+0x714/0x960)
 r4 = C0283118
[<c014fcc0>] (ide_unregister+0x0/0x960) from [<c015da24>] 
(ide_release+0x64/0x68)
[<c015d9c0>] (ide_release+0x0/0x68) from [<c015dca8>] (ide_event+0xd4/0x674)
 r5 = C15EFE0C  r4 = C03E8200
[<c015dbd4>] (ide_event+0x0/0x674) from [<c016e4cc>] 
(send_event_callback+0x64/0x6c)
[<c016e468>] (send_event_callback+0x0/0x6c) from [<c012d4d8>] 
(bus_for_each_dev+0x60/0x8c)
 r4 = 00000000
[<c012d478>] (bus_for_each_dev+0x0/0x8c) from [<c016e504>] 
(send_event+0x30/0x40)
 r7 = 00000001  r6 = 00000001  r5 = 00000001  r4 = 00000008
[<c016e4d4>] (send_event+0x0/0x40) from [<c016e8dc>] (ds_event+0xc0/0x210)
[<c016e81c>] (ds_event+0x0/0x210) from [<c0169218>] (send_event+0xd0/0x154)
[<c0169148>] (send_event+0x0/0x154) from [<c0169440>] 
(socket_shutdown+0x18/0xfc)
 r7 = 00000000  r6 = 00000000  r5 = C03CB804  r4 = C03CB804
[<c0169428>] (socket_shutdown+0x0/0xfc) from [<c0169bd8>] 
(socket_remove+0x14/0xa0)
 r6 = 00000000  r5 = C03CB804  r4 = C03CB804
[<c0169bc4>] (socket_remove+0x0/0xa0) from [<c016a278>] 
(pcmcia_eject_card+0x94/0x98)
 r5 = C03CB804  r4 = C03CB930
[<c016a1e4>] (pcmcia_eject_card+0x0/0x98) from [<c0171564>] 
(ds_ioctl+0xa30/0xc14)
 r6 = C03CB804  r5 = 0000640E  r4 = 00000000
[<c0170b34>] (ds_ioctl+0x0/0xc14) from [<c0095e30>] (do_ioctl+0x6c/0xa0)
[<c0095dc4>] (do_ioctl+0x0/0xa0) from [<c0095ef8>] (vfs_ioctl+0x94/0x328)
 r7 = 00000000  r6 = 00000000  r5 = 00000003  r4 = C18FC180
[<c0095e64>] (vfs_ioctl+0x0/0x328) from [<c00961cc>] (sys_ioctl+0x40/0x64)
 r8 = C001CFA4  r7 = 00000036  r6 = 0000640E  r5 = FFFFFFF7
 r4 = C18FC180
[<c009618c>] (sys_ioctl+0x0/0x64) from [<c001ce20>] 
(ret_fast_syscall+0x0/0x2c)
 r6 = BEEE5D90  r5 = 00000000  r4 = 00000000
Code: ebfb9b8b e1a00004 e594301c e1a0e00f (e593f010)
 Segmentation fault

------------------- Opps #2 -------------------

root@c7x0:~# cardmgr
cardmgr[1804]: watching 1 socket
root@c7x0:~# ide_uregister_hw_with_fixup()
init_hwif_data()
init_hwif_default()
ide_hwif_request_regions()
hwif_request_region()
hwif_request_region()
hda: KODAK LM, CFA DISK drive
ide0 at 0xc2860000-0xc2860007,0xc286000e on irq 40
ide_add_generic_settings()
ata_attach()
idedisk_attach()
ide_register_subdriver()
idedisk_setup()
hda: max request size: 128KiB
init_idedisk_capacity()
lba_capacity_is_ok()
hda: 128512 sectors (65 MB) w/1KiB Cache, CHS=1004/4/32
hda: cache flushes not supported
ide_disk_open()
ide_disk_get()
idedisk_media_changed()
idedisk_revalidate_disk()
 hda: hda1
idedisk_release()
ide_cacheflush_p()
ide_disk_put()
ide-cs: hda: Vcc = 3.3, Vpp = 0.0
ide_disk_open()
ide_disk_get()
idedisk_media_changed()
idedisk_revalidate_disk()
idedisk_revalidate_disk()
 hda: hda1

root@c7x0:~#
root@c7x0:~# cardctl eject
ide_unregister()
ide_unregister() abort
root@c7x0:~# hda: status timeout: status=0x88 { Busy }

ide: failed opcode was: 0xec
hda: drive not ready for command
hda: status timeout: status=0x88 { Busy }

ide: failed opcode was: 0xec
hda: drive not ready for command

root@c7x0:~# carhda: status timeout: status=0x88 { Busy }

ide: failed opcode was: 0xec
hda: drive not ready for command
didedisk_release()
ide_cacheflush_p()
ide_disk_put()
ctl eject
root@c7x0:~# root@c7x0:~# cardctl insert
root@c7x0:~# ide_uregister_hw_with_fixup()
ide_unregister()
ide_unregister1()
idedisk_cleanup()
ide_cacheflush_p()
ide_unregister_subdriver()
auto_remove_settings()
ide_disk_put()
ide_disk_release()
ide_unregister2()
ide_unregister3()
ide_hwif_release_regions()
ide_unregister4()
ide_drive_remove()
Unable to handle kernel NULL pointer dereference at virtual address 00000010
pgd = c17c8000
[00000010] *pgd=a1614031, *pte=00000000, *ppte=00000000
Internal error: Oops: 17 [#1]
Modules linked in:
CPU: 0
PC is at ide_drive_remove+0x28/0x38
LR is at ide_drive_remove+0x2c/0x38
pc : [<c0152190>]    lr : [<c0152194>]    Not tainted
sp : c125bbb0  ip : c125baf8  fp : c125bbc0
r10: 00000000  r9 : c0283088  r8 : c0283088
r7 : c0283260  r6 : c02832a8  r5 : c023ea10  r4 : c0283118
r3 : 00000000  r2 : 00000000  r1 : 00000000  r0 : c0283118
Flags: nZCv  IRQs on  FIQs on  Mode SVC_32  Segment user
Control: 397F  Table: A17C8000  DAC: 00000015
Process cardmgr (pid: 1805, stack limit = 0xc125a194)
Stack: (0xc125bbb0 to 0xc125c000)
bba0:                                     c0283200 c125bbe0 c125bbc4 
c012de44
bbc0: c0152174 c0283200 c0283630 c0283260 c023e590 c125bc00 c125bbe4 
c012d6d8
bbe0: c012dd94 c0283200 c0283630 c0283260 00000000 c125bc1c c125bc04 
c012c7d0
 [stack snipped]
Backtrace:
[<c0152168>] (ide_drive_remove+0x0/0x38) from [<c012de44>] 
(device_release_driver+0xbc/0xc4)
 r4 = C0283200
[<c012dd88>] (device_release_driver+0x0/0xc4) from [<c012d6d8>] 
(bus_remove_device+0x5c/0xa8)
 r7 = C023E590  r6 = C0283260  r5 = C0283630  r4 = C0283200
[<c012d67c>] (bus_remove_device+0x0/0xa8) from [<c012c7d0>] 
(device_del+0x40/0x80)
 r7 = 00000000  r6 = C0283260  r5 = C0283630  r4 = C0283200
[<c012c790>] (device_del+0x0/0x80) from [<c012c824>] 
(device_unregister+0x14/0x20)
 r6 = 00000000  r5 = C03CC0A0  r4 = C0283200
[<c012c810>] (device_unregister+0x0/0x20) from [<c01503d4>] 
(ide_unregister+0x714/0x960)
 r4 = C0283118
[<c014fcc0>] (ide_unregister+0x0/0x960) from [<c015086c>] 
(ide_register_hw_with_fixup+0x1c0/0x1f8)
[<c01506ac>] (ide_register_hw_with_fixup+0x0/0x1f8) from [<c015d9b4>] 
(idecs_register+0xa4/0xb0)
[<c015d910>] (idecs_register+0x0/0xb0) from [<c015e078>] 
(ide_event+0x4a4/0x674)
 r7 = C286000E  r6 = C03E6460  r5 = C03E8214  r4 = 00000000
[<c015dbd4>] (ide_event+0x0/0x674) from [<c016e774>] 
(pcmcia_register_client+0x260/0x308)
[<c016e514>] (pcmcia_register_client+0x0/0x308) from [<c015db90>] 
(ide_attach+0xb8/0xfc)
[<c015dad8>] (ide_attach+0x0/0xfc) from [<c016d564>] 
(pcmcia_device_probe+0xc0/0x18c)
 r6 = C03E8260  r5 = C023EB30  r4 = C03E8200
[<c016d4a4>] (pcmcia_device_probe+0x0/0x18c) from [<c012dbd0>] 
(driver_probe_device+0x4c/0xb0)
 r8 = 00000050  r7 = C012DC34  r6 = 00000000  r5 = C023EB40
 r4 = C03E8260
[<c012db84>] (driver_probe_device+0x0/0xb0) from [<c012d564>] 
(bus_for_each_drv+0x60/0x8c)
 r6 = C03E8260  r5 = C125BE60  r4 = 00000000
[<c012d504>] (bus_for_each_drv+0x0/0x8c) from [<c012dcd4>] 
(device_attach+0x8c/0x98)
 r7 = C012D8CC  r6 = C125BEE4  r5 = C03E8308  r4 = C03E8260
[<c012dc48>] (device_attach+0x0/0x98) from [<c012d8f4>] 
(bus_rescan_devices_helper+0x28/0x40)
 r5 = C125BEB8  r4 = C125BEE4
[<c012d8cc>] (bus_rescan_devices_helper+0x0/0x40) from [<c012d4d8>] 
(bus_for_each_dev+0x60/0x8c)
 r4 = 00000000
[<c012d478>] (bus_for_each_dev+0x0/0x8c) from [<c012d930>] 
(bus_rescan_devices+0x24/0x30)
 r7 = 00039300  r6 = C03E8200  r5 = C050643C  r4 = C03CD930
[<c012d90c>] (bus_rescan_devices+0x0/0x30) from [<c0171438>] 
(ds_ioctl+0x904/0xc14)
[<c0170b34>] (ds_ioctl+0x0/0xc14) from [<c0095e30>] (do_ioctl+0x6c/0xa0)
[<c0095dc4>] (do_ioctl+0x0/0xa0) from [<c0095ef8>] (vfs_ioctl+0x94/0x328)
 r7 = 00000000  r6 = 00039300  r5 = 00000004  r4 = C1441AC0
[<c0095e64>] (vfs_ioctl+0x0/0x328) from [<c00961cc>] (sys_ioctl+0x40/0x64)
 r8 = C001CFA4  r7 = 00000036  r6 = C050643C  r5 = FFFFFFF7
 r4 = C1441AC0
[<c009618c>] (sys_ioctl+0x0/0x64) from [<c001ce20>] 
(ret_fast_syscall+0x0/0x2c)
 r6 = 00034738  r5 = 00000001  r4 = 00000001
Code: ebfb9b8b e1a00004 e594301c e1a0e00f (e593f010)


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: IDE problems in 2.6.12-rc1-bk1 onwards (was Re: 2.6.12-rc3-mm1)
  2005-05-01 17:59 IDE problems in 2.6.12-rc1-bk1 onwards (was Re: 2.6.12-rc3-mm1) Richard Purdie
@ 2005-05-01 18:41 ` Bartlomiej Zolnierkiewicz
  2005-05-02 12:24   ` Richard Purdie
  2005-05-02 17:47 ` Alan Cox
  1 sibling, 1 reply; 6+ messages in thread
From: Bartlomiej Zolnierkiewicz @ 2005-05-01 18:41 UTC (permalink / raw)
  To: Richard Purdie
  Cc: Linux Kernel Mailing List, Dominik Brodowski, Andrew Morton,
	linux-ide

On 5/1/05, Richard Purdie <rpurdie@rpsys.net> wrote:
> I've switched back to 2.6.12-rc3-mm1 and added some debuging to all the ide
> functions to trace the order functions are getting called. I've shown the
> result below for two different oops. There is more than one problem. The
> first problem was introduced in 2.6.12-rc1-bk1 in the ide-disk changes. The
> second has been around for a while but is showing up again.
>  
> The problem is idedisk_cleanup() gets called twice from ide_unregister().
> Once here:
> 
>  for (unit = 0; unit < MAX_DRIVES; ++unit) {
>   drive = &hwif->drives[unit];
>   if (!drive->present)
>    continue;
>   DRIVER(drive)->cleanup(drive);
>  }
> 
> and secondly in ide_unregister indirectly via:
> 
>   blk_cleanup_queue(drive->queue);
>   printk(KERN_ERR "ide_unregister4()\n");
>   device_unregister(&drive->gendev);
>   down(&drive->gendev_rel_sem);
>   spin_lock_irq(&ide_lock);
>   drive->queue = NULL;
>   printk(KERN_ERR "ide_unregister5()\n");
> 
> device_unregister()  triggers ide_drive_remove() which calls
> DRIVER(drive)->cleanup(drive);
> 
> In the first call to idedisk_cleanup(), ide_disk_put(idkp) is called which
> decreases the reference counter to zero. This triggers ide_disk_release()
> which calls kfree(idkp). Hence the second call to idedisk_cleanup() calls
> what is now a null pointer (or worse).

Thanks for excellent debugging.

Both problems should be fixed by "convert IDE device drivers to 
driver-model" patch but I need to resync it against latest kernels.

Bartlomiej

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: IDE problems in 2.6.12-rc1-bk1 onwards (was Re: 2.6.12-rc3-mm1)
  2005-05-01 18:41 ` Bartlomiej Zolnierkiewicz
@ 2005-05-02 12:24   ` Richard Purdie
  0 siblings, 0 replies; 6+ messages in thread
From: Richard Purdie @ 2005-05-02 12:24 UTC (permalink / raw)
  To: Bartlomiej Zolnierkiewicz
  Cc: Linux Kernel Mailing List, Dominik Brodowski, Andrew Morton,
	linux-ide

Bartlomiej Zolnierkiewicz:
> Both problems should be fixed by "convert IDE device drivers to
> driver-model" patch but I need to resync it against latest kernels.

Thanks for the tip. I found that patch and applied the parts for the drivers 
I use. This cured the oops and also allowed "hot unplugging" to finally work 
under 2.6 for CF cards! Is there a timeline for when this goes into mainline 
and/or -mm?

I can still get an oops from the vfs layer if I try to access a card just 
after I remove it suggesting there are some timeout issues somewhere but 
this is a *massive* improvement on where things were before! I'm really 
pleased to see this :)

Thanks,

Richard 


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: IDE problems in 2.6.12-rc1-bk1 onwards (was Re: 2.6.12-rc3-mm1)
  2005-05-01 17:59 IDE problems in 2.6.12-rc1-bk1 onwards (was Re: 2.6.12-rc3-mm1) Richard Purdie
  2005-05-01 18:41 ` Bartlomiej Zolnierkiewicz
@ 2005-05-02 17:47 ` Alan Cox
  2005-05-02 19:39   ` Richard Purdie
  1 sibling, 1 reply; 6+ messages in thread
From: Alan Cox @ 2005-05-02 17:47 UTC (permalink / raw)
  To: Richard Purdie
  Cc: Linux Kernel Mailing List, bzolnier, Dominik Brodowski,
	Andrew Morton, linux-ide

On Sul, 2005-05-01 at 18:59, Richard Purdie wrote:
> Solution: ide_unregister() should return failure and pass responsibility for 
> handling it to ide-cs or it should always succeed. I'd favour the latter as 
> the ide layer should really handle its own cleanup. Maybe a parameter should 
> be added to ide_unregister() to select the behaviour if the drive is busy/in 
> use? If the hardware is gone, we want it to happen regardless for example...

This is what the -ac tree has done for some time. It tried to unregister
and
if that fails will wait and retry. It also sets the I/O operations to a
set of
null operations to ensure that there are no further unneccessary
writes/reads from the empty bus slot.

Alan

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: IDE problems in 2.6.12-rc1-bk1 onwards (was Re: 2.6.12-rc3-mm1)
  2005-05-02 17:47 ` Alan Cox
@ 2005-05-02 19:39   ` Richard Purdie
  2005-05-04 15:44     ` Alan Cox
  0 siblings, 1 reply; 6+ messages in thread
From: Richard Purdie @ 2005-05-02 19:39 UTC (permalink / raw)
  To: Alan Cox
  Cc: Linux Kernel Mailing List, bzolnier, Dominik Brodowski,
	Andrew Morton, linux-ide

Alan Cox:
> On Sul, 2005-05-01 at 18:59, Richard Purdie wrote:
>> Solution: ide_unregister() should return failure and pass responsibility 
>> for
>> handling it to ide-cs or it should always succeed. I'd favour the latter 
>> as
>> the ide layer should really handle its own cleanup. Maybe a parameter 
>> should
>> be added to ide_unregister() to select the behaviour if the drive is 
>> busy/in
>> use? If the hardware is gone, we want it to happen regardless for 
>> example...
>
> This is what the -ac tree has done for some time. It tried to unregister
> and
> if that fails will wait and retry. It also sets the I/O operations to a
> set of
> null operations to ensure that there are no further unneccessary
> writes/reads from the empty bus slot.

We've had this conversation before - I tried the -ac tree and found that 
whilst it will retry, it blocked whilst waiting and this blocking meant the 
status of the drive never changed. The "cardctl eject" command would 
therefore just sit there locked up which didn't really solve my problem.

The changeover to the driver model means all the callbacks.get handled by 
the kobjects and the function only needs to be called once. I applied that 
patch and so far it seems to be working very well. As an added bonus, 
hotunpluging is also working. I can still make it oops but seemingly not in 
the ide layer any longer (now it looks vfs related :).

Regards,

Richard 


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: IDE problems in 2.6.12-rc1-bk1 onwards (was Re: 2.6.12-rc3-mm1)
  2005-05-02 19:39   ` Richard Purdie
@ 2005-05-04 15:44     ` Alan Cox
  0 siblings, 0 replies; 6+ messages in thread
From: Alan Cox @ 2005-05-04 15:44 UTC (permalink / raw)
  To: Richard Purdie
  Cc: Linux Kernel Mailing List, bzolnier, Dominik Brodowski,
	Andrew Morton, linux-ide

On Llu, 2005-05-02 at 20:39, Richard Purdie wrote:
> We've had this conversation before - I tried the -ac tree and found that 
> whilst it will retry, it blocked whilst waiting and this blocking meant the 
> status of the drive never changed. The "cardctl eject" command would 
> therefore just sit there locked up which didn't really solve my problem.

You have to do that, stick a scope on the port and you'll see that the
IDE layer is still writing to the I/O ports until the last reference is
dropped.

> The changeover to the driver model means all the callbacks.get handled by 
> the kobjects and the function only needs to be called once. I applied that 
> patch and so far it seems to be working very well. As an added bonus, 
> hotunpluging is also working. I can still make it oops but seemingly not in 
> the ide layer any longer (now it looks vfs related :).

It is definitely the right way to go, but you do also have to kill the
IDE ops and know that every current operating reference is no longer
using the old IDE ops before you can safely reuse a PCMCIA port/PCI
slot, otherwise you merely trade easy to find bugs for really nasty
hotplug races.

Alan


^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2005-05-04 15:45 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2005-05-01 17:59 IDE problems in 2.6.12-rc1-bk1 onwards (was Re: 2.6.12-rc3-mm1) Richard Purdie
2005-05-01 18:41 ` Bartlomiej Zolnierkiewicz
2005-05-02 12:24   ` Richard Purdie
2005-05-02 17:47 ` Alan Cox
2005-05-02 19:39   ` Richard Purdie
2005-05-04 15:44     ` Alan Cox

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).