From: Arjan van de Ven <arjanv@redhat.com>




---

 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);
 }
 

_