From: Chris Wedgwood Save 1.5k of stack. --- 25-akpm/drivers/ide/ide.c | 180 ++++++++++++++++++++++++---------------------- 1 files changed, 94 insertions(+), 86 deletions(-) diff -puN drivers/ide/ide.c~use-less-stack-in-ide_unregister drivers/ide/ide.c --- 25/drivers/ide/ide.c~use-less-stack-in-ide_unregister Thu Apr 29 15:40:16 2004 +++ 25-akpm/drivers/ide/ide.c Thu Apr 29 15:40:16 2004 @@ -608,18 +608,24 @@ EXPORT_SYMBOL(ide_hwif_release_regions); * Unregister restores the hwif structures to the default state. * This is raving bonkers. */ - -void ide_unregister (unsigned int index) +/* XXX(cw) this needs to be able to return an exit code here and the + * callers need to check for this. */ +void ide_unregister(unsigned int index) { ide_drive_t *drive; ide_hwif_t *hwif, *g; ide_hwgroup_t *hwgroup; int irq_count = 0, unit, i; - ide_hwif_t old_hwif; + ide_hwif_t *old_hwif; + + BUG_ON(index >= MAX_HWIFS); + + old_hwif = kmalloc(sizeof(*old_hwif), GFP_KERNEL|__GFP_NOFAIL); + if (!old_hwif) { + printk(KERN_ERR "ide_unregister: unable to allocate memory\n"); + return; + } - if (index >= MAX_HWIFS) - BUG(); - BUG_ON(in_interrupt()); BUG_ON(irqs_disabled()); down(&ide_cfg_sem); @@ -765,122 +771,124 @@ void ide_unregister (unsigned int index) hwif->dma_prdtable = 0; } - old_hwif = *hwif; + *old_hwif = *hwif; init_hwif_data(hwif, index); /* restore hwif data to pristine status */ init_hwif_default(hwif, index); - hwif->hwgroup = old_hwif.hwgroup; + hwif->hwgroup = old_hwif->hwgroup; - hwif->gendev.parent = old_hwif.gendev.parent; + hwif->gendev.parent = old_hwif->gendev.parent; - hwif->proc = old_hwif.proc; + hwif->proc = old_hwif->proc; - hwif->major = old_hwif.major; -// hwif->index = old_hwif.index; -// hwif->channel = old_hwif.channel; - hwif->straight8 = old_hwif.straight8; - hwif->bus_state = old_hwif.bus_state; + hwif->major = old_hwif->major; +// hwif->index = old_hwif->index; +// hwif->channel = old_hwif->channel; + hwif->straight8 = old_hwif->straight8; + hwif->bus_state = old_hwif->bus_state; - hwif->atapi_dma = old_hwif.atapi_dma; - hwif->ultra_mask = old_hwif.ultra_mask; - hwif->mwdma_mask = old_hwif.mwdma_mask; - hwif->swdma_mask = old_hwif.swdma_mask; + hwif->atapi_dma = old_hwif->atapi_dma; + hwif->ultra_mask = old_hwif->ultra_mask; + hwif->mwdma_mask = old_hwif->mwdma_mask; + hwif->swdma_mask = old_hwif->swdma_mask; - hwif->chipset = old_hwif.chipset; - hwif->hold = old_hwif.hold; + hwif->chipset = old_hwif->chipset; + hwif->hold = old_hwif->hold; #ifdef CONFIG_BLK_DEV_IDEPCI - hwif->pci_dev = old_hwif.pci_dev; - hwif->cds = old_hwif.cds; + hwif->pci_dev = old_hwif->pci_dev; + hwif->cds = old_hwif->cds; #endif /* CONFIG_BLK_DEV_IDEPCI */ #if 0 - hwif->hwifops = old_hwif.hwifops; + hwif->hwifops = old_hwif->hwifops; #else - hwif->identify = old_hwif.identify; - hwif->tuneproc = old_hwif.tuneproc; - hwif->speedproc = old_hwif.speedproc; - hwif->selectproc = old_hwif.selectproc; - hwif->reset_poll = old_hwif.reset_poll; - hwif->pre_reset = old_hwif.pre_reset; - hwif->resetproc = old_hwif.resetproc; - hwif->intrproc = old_hwif.intrproc; - hwif->maskproc = old_hwif.maskproc; - hwif->quirkproc = old_hwif.quirkproc; - hwif->busproc = old_hwif.busproc; + hwif->identify = old_hwif->identify; + hwif->tuneproc = old_hwif->tuneproc; + hwif->speedproc = old_hwif->speedproc; + hwif->selectproc = old_hwif->selectproc; + hwif->reset_poll = old_hwif->reset_poll; + hwif->pre_reset = old_hwif->pre_reset; + hwif->resetproc = old_hwif->resetproc; + hwif->intrproc = old_hwif->intrproc; + hwif->maskproc = old_hwif->maskproc; + hwif->quirkproc = old_hwif->quirkproc; + hwif->busproc = old_hwif->busproc; #endif #if 0 - hwif->pioops = old_hwif.pioops; + hwif->pioops = old_hwif->pioops; #else - hwif->ata_input_data = old_hwif.ata_input_data; - hwif->ata_output_data = old_hwif.ata_output_data; - hwif->atapi_input_bytes = old_hwif.atapi_input_bytes; - hwif->atapi_output_bytes = old_hwif.atapi_output_bytes; + hwif->ata_input_data = old_hwif->ata_input_data; + hwif->ata_output_data = old_hwif->ata_output_data; + hwif->atapi_input_bytes = old_hwif->atapi_input_bytes; + hwif->atapi_output_bytes = old_hwif->atapi_output_bytes; #endif #if 0 - hwif->dmaops = old_hwif.dmaops; + hwif->dmaops = old_hwif->dmaops; #else - hwif->ide_dma_read = old_hwif.ide_dma_read; - hwif->ide_dma_write = old_hwif.ide_dma_write; - hwif->ide_dma_begin = old_hwif.ide_dma_begin; - hwif->ide_dma_end = old_hwif.ide_dma_end; - hwif->ide_dma_check = old_hwif.ide_dma_check; - hwif->ide_dma_on = old_hwif.ide_dma_on; - hwif->ide_dma_off_quietly = old_hwif.ide_dma_off_quietly; - hwif->ide_dma_test_irq = old_hwif.ide_dma_test_irq; - hwif->ide_dma_host_on = old_hwif.ide_dma_host_on; - hwif->ide_dma_host_off = old_hwif.ide_dma_host_off; - hwif->ide_dma_verbose = old_hwif.ide_dma_verbose; - hwif->ide_dma_lostirq = old_hwif.ide_dma_lostirq; - hwif->ide_dma_timeout = old_hwif.ide_dma_timeout; + hwif->ide_dma_read = old_hwif->ide_dma_read; + hwif->ide_dma_write = old_hwif->ide_dma_write; + hwif->ide_dma_begin = old_hwif->ide_dma_begin; + hwif->ide_dma_end = old_hwif->ide_dma_end; + hwif->ide_dma_check = old_hwif->ide_dma_check; + hwif->ide_dma_on = old_hwif->ide_dma_on; + hwif->ide_dma_off_quietly = old_hwif->ide_dma_off_quietly; + hwif->ide_dma_test_irq = old_hwif->ide_dma_test_irq; + hwif->ide_dma_host_on = old_hwif->ide_dma_host_on; + hwif->ide_dma_host_off = old_hwif->ide_dma_host_off; + hwif->ide_dma_verbose = old_hwif->ide_dma_verbose; + hwif->ide_dma_lostirq = old_hwif->ide_dma_lostirq; + hwif->ide_dma_timeout = old_hwif->ide_dma_timeout; #endif #if 0 - hwif->iops = old_hwif.iops; + hwif->iops = old_hwif->iops; #else - hwif->OUTB = old_hwif.OUTB; - hwif->OUTBSYNC = old_hwif.OUTBSYNC; - hwif->OUTW = old_hwif.OUTW; - hwif->OUTL = old_hwif.OUTL; - hwif->OUTSW = old_hwif.OUTSW; - hwif->OUTSL = old_hwif.OUTSL; - - hwif->INB = old_hwif.INB; - hwif->INW = old_hwif.INW; - hwif->INL = old_hwif.INL; - hwif->INSW = old_hwif.INSW; - hwif->INSL = old_hwif.INSL; + hwif->OUTB = old_hwif->OUTB; + hwif->OUTBSYNC = old_hwif->OUTBSYNC; + hwif->OUTW = old_hwif->OUTW; + hwif->OUTL = old_hwif->OUTL; + hwif->OUTSW = old_hwif->OUTSW; + hwif->OUTSL = old_hwif->OUTSL; + + hwif->INB = old_hwif->INB; + hwif->INW = old_hwif->INW; + hwif->INL = old_hwif->INL; + hwif->INSW = old_hwif->INSW; + hwif->INSL = old_hwif->INSL; #endif - hwif->mmio = old_hwif.mmio; - hwif->rqsize = old_hwif.rqsize; - hwif->no_lba48 = old_hwif.no_lba48; + hwif->mmio = old_hwif->mmio; + hwif->rqsize = old_hwif->rqsize; + hwif->no_lba48 = old_hwif->no_lba48; #ifndef CONFIG_BLK_DEV_IDECS - hwif->irq = old_hwif.irq; + hwif->irq = old_hwif->irq; #endif /* CONFIG_BLK_DEV_IDECS */ - hwif->dma_base = old_hwif.dma_base; - hwif->dma_master = old_hwif.dma_master; - hwif->dma_command = old_hwif.dma_command; - hwif->dma_vendor1 = old_hwif.dma_vendor1; - hwif->dma_status = old_hwif.dma_status; - hwif->dma_vendor3 = old_hwif.dma_vendor3; - hwif->dma_prdtable = old_hwif.dma_prdtable; - - hwif->dma_extra = old_hwif.dma_extra; - hwif->config_data = old_hwif.config_data; - hwif->select_data = old_hwif.select_data; - hwif->autodma = old_hwif.autodma; - hwif->udma_four = old_hwif.udma_four; - hwif->no_dsc = old_hwif.no_dsc; + hwif->dma_base = old_hwif->dma_base; + hwif->dma_master = old_hwif->dma_master; + hwif->dma_command = old_hwif->dma_command; + hwif->dma_vendor1 = old_hwif->dma_vendor1; + hwif->dma_status = old_hwif->dma_status; + hwif->dma_vendor3 = old_hwif->dma_vendor3; + hwif->dma_prdtable = old_hwif->dma_prdtable; + + hwif->dma_extra = old_hwif->dma_extra; + hwif->config_data = old_hwif->config_data; + hwif->select_data = old_hwif->select_data; + hwif->autodma = old_hwif->autodma; + hwif->udma_four = old_hwif->udma_four; + hwif->no_dsc = old_hwif->no_dsc; - hwif->hwif_data = old_hwif.hwif_data; + hwif->hwif_data = old_hwif->hwif_data; abort: spin_unlock_irq(&ide_lock); up(&ide_cfg_sem); + + kfree(old_hwif); } EXPORT_SYMBOL(ide_unregister); _