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

--- linux-2.6.10/drivers/ide/ide.c~ide_fixes-r0.patch
+++ linux-2.6.10/drivers/ide/ide.c
@@ -786,8 +786,6 @@
 		drive = &hwif->drives[unit];
 		if (!drive->present)
 			continue;
-		if (drive->usage || DRIVER(drive)->busy)
-			goto abort;
 		drive->dead = 1;
 	}
 	hwif->present = 0;
@@ -2300,7 +2298,7 @@
 	
 	down(&ide_setting_sem);
 	spin_lock_irqsave(&ide_lock, flags);
-	if (drive->usage || drive->driver == &idedefault_driver || DRIVER(drive)->busy) {
+	if (!drive->dead && (drive->usage || drive->driver == &idedefault_driver || DRIVER(drive)->busy)) {
 		spin_unlock_irqrestore(&ide_lock, flags);
 		up(&ide_setting_sem);
 		return 1;
--- linux-2.6.10/drivers/ide/ide-disk.c~ide_fixes-r0.patch
+++ linux-2.6.10/drivers/ide/ide-disk.c
@@ -1294,7 +1294,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))
@@ -1374,6 +1374,7 @@
 static int idedisk_open(struct inode *inode, struct file *filp)
 {
 	ide_drive_t *drive = inode->i_bdev->bd_disk->private_data;
+	if (!drive->hwif->present) return -ENODEV;
 	drive->usage++;
 	if (drive->removable && drive->usage == 1) {
 		ide_task_t args;
@@ -1415,6 +1416,8 @@
 			unsigned int cmd, unsigned long arg)
 {
 	struct block_device *bdev = inode->i_bdev;
+	ide_drive_t *drive = bdev->bd_disk->private_data;
+	if (!drive->hwif->present) return -ENODEV;	
 	return generic_ide_ioctl(file, bdev, cmd, arg);
 }
 

