
#
# Patch managed by http://www.holgerschurig.de/patcher.html
#

Index: linux-2.6.11/drivers/ide/ide.c
===================================================================
--- linux-2.6.11.orig/drivers/ide/ide.c	2005-05-01 19:15:45.000000000 +0100
+++ linux-2.6.11/drivers/ide/ide.c	2005-05-01 19:22:26.000000000 +0100
@@ -645,8 +645,6 @@
 		drive = &hwif->drives[unit];
 		if (!drive->present)
 			continue;
-		if (drive->usage || DRIVER(drive)->busy)
-			goto abort;
 		drive->dead = 1;
 	}
 	hwif->present = 0;
@@ -2058,7 +2056,7 @@
 	
 	down(&ide_setting_sem);
 	spin_lock_irqsave(&ide_lock, flags);
-	if (drive->usage || drive->driver == NULL || DRIVER(drive)->busy) {
+	if (!drive->dead && (drive->usage || drive->driver == NULL || DRIVER(drive)->busy)) {
 		spin_unlock_irqrestore(&ide_lock, flags);
 		up(&ide_setting_sem);
 		return 1;
@@ -2081,8 +2079,8 @@
 
 static int ide_drive_remove(struct device * dev)
 {
-	ide_drive_t * drive = container_of(dev,ide_drive_t,gendev);
-	DRIVER(drive)->cleanup(drive);
+	//ide_drive_t * drive = container_of(dev,ide_drive_t,gendev);
+	//DRIVER(drive)->cleanup(drive);
 	return 0;
 }
 
Index: linux-2.6.11/drivers/ide/ide-disk.c
===================================================================
--- linux-2.6.11.orig/drivers/ide/ide-disk.c	2005-05-01 19:16:00.000000000 +0100
+++ linux-2.6.11/drivers/ide/ide-disk.c	2005-05-01 19:16:06.000000000 +0100
@@ -1023,7 +1023,7 @@
 
 static void ide_cacheflush_p(ide_drive_t *drive)
 {
-	if (!drive->wcache || !ide_id_has_flush_cache(drive->id))
+	if (drive->dead || !drive->wcache || !ide_id_has_flush_cache(drive->id))
 		return;
 
 	if (do_idedisk_flushcache(drive))
@@ -1122,6 +1122,8 @@
 
 	drive = idkp->drive;
 
+	if (!drive->hwif->present) return -ENODEV;
+
 	drive->usage++;
 	if (drive->removable && drive->usage == 1) {
 		ide_task_t args;
@@ -1170,6 +1172,7 @@
 {
 	struct block_device *bdev = inode->i_bdev;
 	struct ide_disk_obj *idkp = ide_disk_g(bdev->bd_disk);
+ 	if (!idkp->drive->hwif->present) return -ENODEV;	
 	return generic_ide_ioctl(idkp->drive, file, bdev, cmd, arg);
 }
 

