From: Arjan van de Ven --- 25-akpm/drivers/ide/ide-disk.c | 18 ++++++++++++++++++ 1 files changed, 18 insertions(+) diff -puN drivers/ide/ide-disk.c~force-ide-cache-flush-on-shutdown-flush drivers/ide/ide-disk.c --- 25/drivers/ide/ide-disk.c~force-ide-cache-flush-on-shutdown-flush 2004-05-08 13:14:43.366947944 -0700 +++ 25-akpm/drivers/ide/ide-disk.c 2004-05-08 13:14:43.372947032 -0700 @@ -1835,6 +1835,23 @@ static int idedisk_revalidate_disk(struc return 0; } +static int ide_drive_shutdown(struct device * dev) +{ + ide_drive_t * drive = container_of(dev,ide_drive_t,gendev); + + /* safety checks */ + if (!drive->present) + return 0; + if (drive->media != ide_disk) + return 0; + printk("Flushing cache: %s \n", drive->name); + ide_cacheflush_p(drive); + /* give the hardware time to finish; it may return prematurely to cheat */ + mdelay(300); + return 0; +} + + static struct block_device_operations idedisk_ops = { .owner = THIS_MODULE, .open = idedisk_open, @@ -1896,6 +1913,7 @@ static void __exit idedisk_exit (void) static int idedisk_init (void) { + idedisk_driver.gen_driver.shutdown = ide_drive_shutdown; return ide_register_driver(&idedisk_driver); } _