diff options
author | Tejun Heo <htejun@gmail.com> | 2006-05-31 18:28:13 +0900 |
---|---|---|
committer | Tejun Heo <htejun@gmail.com> | 2006-05-31 18:28:13 +0900 |
commit | 720ba12620ee09dce269adf4ad50958adac7bb54 (patch) | |
tree | f31a8b3da52195610bd244baf42a5fe2e26b0a36 /drivers/scsi/libata-eh.c | |
parent | 3e706399b03bd237d087d731d4b1b029e546b33d (diff) |
[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.c | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/drivers/scsi/libata-eh.c b/drivers/scsi/libata-eh.c index 70c132bef68..30a83a57a12 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 |