diff options
author | Andreas Herrmann <aherrman@de.ibm.com> | 2006-09-18 16:30:36 -0400 |
---|---|---|
committer | James Bottomley <jejb@mulgrave.il.steeleye.com> | 2006-09-23 19:01:46 -0400 |
commit | 8165428610446ea9e6aa9dfa5485ab78e58cc9fc (patch) | |
tree | c410ad0f802abd86461a04ea7a4f552447e3ed03 | |
parent | 2abbe866c8eb0296e3f5343bcf73e5371522a738 (diff) |
[SCSI] zfcp: fix: avoid removal of fsf reqs before qdio queues are down
Fix the fix ... One of my previous fixes introduced removal of all fsf
requests in zfcp's eh_host_reset_handler. But this must not happen
before qdio queues are shut down. So, I revert the changes of
zfcp_scsi_eh_host_reset_handler.
Signed-off-by: Andreas Herrmann <aherrman@de.ibm.com>
Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>
-rw-r--r-- | drivers/s390/scsi/zfcp_erp.c | 3 | ||||
-rw-r--r-- | drivers/s390/scsi/zfcp_ext.h | 1 | ||||
-rw-r--r-- | drivers/s390/scsi/zfcp_scsi.c | 19 |
3 files changed, 4 insertions, 19 deletions
diff --git a/drivers/s390/scsi/zfcp_erp.c b/drivers/s390/scsi/zfcp_erp.c index af42a0eadf03..862a411a4aa0 100644 --- a/drivers/s390/scsi/zfcp_erp.c +++ b/drivers/s390/scsi/zfcp_erp.c | |||
@@ -91,6 +91,7 @@ static int zfcp_erp_unit_strategy_clearstati(struct zfcp_unit *); | |||
91 | static int zfcp_erp_unit_strategy_close(struct zfcp_erp_action *); | 91 | static int zfcp_erp_unit_strategy_close(struct zfcp_erp_action *); |
92 | static int zfcp_erp_unit_strategy_open(struct zfcp_erp_action *); | 92 | static int zfcp_erp_unit_strategy_open(struct zfcp_erp_action *); |
93 | 93 | ||
94 | static void zfcp_erp_action_dismiss_adapter(struct zfcp_adapter *); | ||
94 | static void zfcp_erp_action_dismiss_port(struct zfcp_port *); | 95 | static void zfcp_erp_action_dismiss_port(struct zfcp_port *); |
95 | static void zfcp_erp_action_dismiss_unit(struct zfcp_unit *); | 96 | static void zfcp_erp_action_dismiss_unit(struct zfcp_unit *); |
96 | static void zfcp_erp_action_dismiss(struct zfcp_erp_action *); | 97 | static void zfcp_erp_action_dismiss(struct zfcp_erp_action *); |
@@ -3157,7 +3158,7 @@ zfcp_erp_action_cleanup(int action, struct zfcp_adapter *adapter, | |||
3157 | } | 3158 | } |
3158 | 3159 | ||
3159 | 3160 | ||
3160 | void zfcp_erp_action_dismiss_adapter(struct zfcp_adapter *adapter) | 3161 | static void zfcp_erp_action_dismiss_adapter(struct zfcp_adapter *adapter) |
3161 | { | 3162 | { |
3162 | struct zfcp_port *port; | 3163 | struct zfcp_port *port; |
3163 | 3164 | ||
diff --git a/drivers/s390/scsi/zfcp_ext.h b/drivers/s390/scsi/zfcp_ext.h index 3125a42a6343..b8794d77285d 100644 --- a/drivers/s390/scsi/zfcp_ext.h +++ b/drivers/s390/scsi/zfcp_ext.h | |||
@@ -134,7 +134,6 @@ extern void zfcp_erp_modify_adapter_status(struct zfcp_adapter *, u32, int); | |||
134 | extern int zfcp_erp_adapter_reopen(struct zfcp_adapter *, int); | 134 | extern int zfcp_erp_adapter_reopen(struct zfcp_adapter *, int); |
135 | extern int zfcp_erp_adapter_shutdown(struct zfcp_adapter *, int); | 135 | extern int zfcp_erp_adapter_shutdown(struct zfcp_adapter *, int); |
136 | extern void zfcp_erp_adapter_failed(struct zfcp_adapter *); | 136 | extern void zfcp_erp_adapter_failed(struct zfcp_adapter *); |
137 | extern void zfcp_erp_action_dismiss_adapter(struct zfcp_adapter *); | ||
138 | 137 | ||
139 | extern void zfcp_erp_modify_port_status(struct zfcp_port *, u32, int); | 138 | extern void zfcp_erp_modify_port_status(struct zfcp_port *, u32, int); |
140 | extern int zfcp_erp_port_reopen(struct zfcp_port *, int); | 139 | extern int zfcp_erp_port_reopen(struct zfcp_port *, int); |
diff --git a/drivers/s390/scsi/zfcp_scsi.c b/drivers/s390/scsi/zfcp_scsi.c index 753bb9b2fe74..7cafa34e4c7f 100644 --- a/drivers/s390/scsi/zfcp_scsi.c +++ b/drivers/s390/scsi/zfcp_scsi.c | |||
@@ -544,7 +544,6 @@ int zfcp_scsi_eh_host_reset_handler(struct scsi_cmnd *scpnt) | |||
544 | { | 544 | { |
545 | struct zfcp_unit *unit; | 545 | struct zfcp_unit *unit; |
546 | struct zfcp_adapter *adapter; | 546 | struct zfcp_adapter *adapter; |
547 | unsigned long flags; | ||
548 | 547 | ||
549 | unit = (struct zfcp_unit*) scpnt->device->hostdata; | 548 | unit = (struct zfcp_unit*) scpnt->device->hostdata; |
550 | adapter = unit->port->adapter; | 549 | adapter = unit->port->adapter; |
@@ -552,22 +551,8 @@ int zfcp_scsi_eh_host_reset_handler(struct scsi_cmnd *scpnt) | |||
552 | ZFCP_LOG_NORMAL("host/bus reset because of problems with " | 551 | ZFCP_LOG_NORMAL("host/bus reset because of problems with " |
553 | "unit 0x%016Lx\n", unit->fcp_lun); | 552 | "unit 0x%016Lx\n", unit->fcp_lun); |
554 | 553 | ||
555 | write_lock_irqsave(&adapter->erp_lock, flags); | 554 | zfcp_erp_adapter_reopen(adapter, 0); |
556 | if (atomic_test_mask(ZFCP_STATUS_ADAPTER_ERP_PENDING, | 555 | zfcp_erp_wait(adapter); |
557 | &adapter->status)) { | ||
558 | zfcp_erp_modify_adapter_status(adapter, | ||
559 | ZFCP_STATUS_COMMON_UNBLOCKED|ZFCP_STATUS_COMMON_OPEN, | ||
560 | ZFCP_CLEAR); | ||
561 | zfcp_erp_action_dismiss_adapter(adapter); | ||
562 | write_unlock_irqrestore(&adapter->erp_lock, flags); | ||
563 | zfcp_fsf_req_dismiss_all(adapter); | ||
564 | adapter->fsf_req_seq_no = 0; | ||
565 | zfcp_erp_adapter_reopen(adapter, 0); | ||
566 | } else { | ||
567 | write_unlock_irqrestore(&adapter->erp_lock, flags); | ||
568 | zfcp_erp_adapter_reopen(adapter, 0); | ||
569 | zfcp_erp_wait(adapter); | ||
570 | } | ||
571 | 556 | ||
572 | return SUCCESS; | 557 | return SUCCESS; |
573 | } | 558 | } |