summaryrefslogtreecommitdiffstats
path: root/drivers/scsi/libata-eh.c
diff options
context:
space:
mode:
authorTejun Heo2006-05-31 11:28:13 +0200
committerTejun Heo2006-05-31 11:28:13 +0200
commit720ba12620ee09dce269adf4ad50958adac7bb54 (patch)
treef31a8b3da52195610bd244baf42a5fe2e26b0a36 /drivers/scsi/libata-eh.c
parent[PATCH] libata-hp: implement bootplug (diff)
downloadkernel-qcow2-linux-720ba12620ee09dce269adf4ad50958adac7bb54.tar.gz
kernel-qcow2-linux-720ba12620ee09dce269adf4ad50958adac7bb54.tar.xz
kernel-qcow2-linux-720ba12620ee09dce269adf4ad50958adac7bb54.zip
[PATCH] libata-hp: update unload-unplug
Update unload unplug - driver unloading / PCI removal. This is done by ata_port_detach() which short-circuits EH, disables all devices and freezes the port. With this patch, EH and unloading/unplugging are properly synchronized. Signed-off-by: Tejun Heo <htejun@gmail.com>
Diffstat (limited to 'drivers/scsi/libata-eh.c')
-rw-r--r--drivers/scsi/libata-eh.c8
1 files changed, 6 insertions, 2 deletions
diff --git a/drivers/scsi/libata-eh.c b/drivers/scsi/libata-eh.c
index 70c132bef68e..30a83a57a12f 100644
--- a/drivers/scsi/libata-eh.c
+++ b/drivers/scsi/libata-eh.c
@@ -46,6 +46,7 @@
#include "libata.h"
static void __ata_port_freeze(struct ata_port *ap);
+static void ata_eh_finish(struct ata_port *ap);
static void ata_ering_record(struct ata_ering *ering, int is_io,
unsigned int err_mask)
@@ -242,8 +243,11 @@ void ata_scsi_error(struct Scsi_Host *host)
spin_unlock_irqrestore(hs_lock, flags);
- /* invoke EH */
- ap->ops->error_handler(ap);
+ /* invoke EH. if unloading, just finish failed qcs */
+ if (!(ap->flags & ATA_FLAG_UNLOADING))
+ ap->ops->error_handler(ap);
+ else
+ ata_eh_finish(ap);
/* Exception might have happend after ->error_handler
* recovered the port but before this point. Repeat