ide/ide-cs: fix order of releasing resources
ide_detach() called first ide_release() and then release_region(). This produced the following warnings: Trying to free nonexistent resource <000000000000c10e-000000000000c10e> Trying to free nonexistent resource <000000000000c100-000000000000c107> This is true, because the callchain inside ide_release() is: ide_release -> pcmcia_disable_device -> pcmcia_release_io So, the whole io-block is already gone for release_region(). To fix this, just swap the order of releasing (and remove the now obsolete shadowing). bzolnier: - release resources in ide_release() to fix ordering of events - remove stale FIXME note while at it Signed-off-by: Wolfram Sang <w.sang@pengutronix.de> Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
committed by
David S. Miller
parent
c3be57b6f3
commit
d4ae5415c6
@@ -121,19 +121,11 @@ static int ide_probe(struct pcmcia_device *link)
|
|||||||
static void ide_detach(struct pcmcia_device *link)
|
static void ide_detach(struct pcmcia_device *link)
|
||||||
{
|
{
|
||||||
ide_info_t *info = link->priv;
|
ide_info_t *info = link->priv;
|
||||||
ide_hwif_t *hwif = info->host->ports[0];
|
|
||||||
unsigned long data_addr, ctl_addr;
|
|
||||||
|
|
||||||
dev_dbg(&link->dev, "ide_detach(0x%p)\n", link);
|
dev_dbg(&link->dev, "ide_detach(0x%p)\n", link);
|
||||||
|
|
||||||
data_addr = hwif->io_ports.data_addr;
|
|
||||||
ctl_addr = hwif->io_ports.ctl_addr;
|
|
||||||
|
|
||||||
ide_release(link);
|
ide_release(link);
|
||||||
|
|
||||||
release_region(ctl_addr, 1);
|
|
||||||
release_region(data_addr, 8);
|
|
||||||
|
|
||||||
kfree(info);
|
kfree(info);
|
||||||
} /* ide_detach */
|
} /* ide_detach */
|
||||||
|
|
||||||
@@ -354,13 +346,20 @@ static void ide_release(struct pcmcia_device *link)
|
|||||||
|
|
||||||
dev_dbg(&link->dev, "ide_release(0x%p)\n", link);
|
dev_dbg(&link->dev, "ide_release(0x%p)\n", link);
|
||||||
|
|
||||||
if (info->ndev)
|
if (info->ndev) {
|
||||||
/* FIXME: if this fails we need to queue the cleanup somehow
|
ide_hwif_t *hwif = host->ports[0];
|
||||||
-- need to investigate the required PCMCIA magic */
|
unsigned long data_addr, ctl_addr;
|
||||||
ide_host_remove(host);
|
|
||||||
|
|
||||||
|
data_addr = hwif->io_ports.data_addr;
|
||||||
|
ctl_addr = hwif->io_ports.ctl_addr;
|
||||||
|
|
||||||
|
ide_host_remove(host);
|
||||||
info->ndev = 0;
|
info->ndev = 0;
|
||||||
|
|
||||||
|
release_region(ctl_addr, 1);
|
||||||
|
release_region(data_addr, 8);
|
||||||
|
}
|
||||||
|
|
||||||
pcmcia_disable_device(link);
|
pcmcia_disable_device(link);
|
||||||
} /* ide_release */
|
} /* ide_release */
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user