diff options
author | Martin Peschke <mp3@de.ibm.com> | 2008-03-27 09:22:02 -0400 |
---|---|---|
committer | James Bottomley <James.Bottomley@HansenPartnership.com> | 2008-04-07 13:19:04 -0400 |
commit | 698ec01635819c5ae60090bb4efcbeffc41642fb (patch) | |
tree | 8800461be45c3efa65558441a3d049fd0a38bf52 | |
parent | 348447e85749120ad600a5c8e23b6bb7058b931d (diff) |
[SCSI] zfcp: Add traces for state changes.
This patch writes a trace record which provides information about state
changes for adapters, ports and units, e.g. target failure, targets becoming
online, targets being temporarily blocked due to pending recovery, targets
which have been recovered successfully etc.
Signed-off-by: Martin Peschke <mp3@de.ibm.com>
Signed-off-by: Christof Schmitt <christof.schmitt@de.ibm.com>
Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com>
-rw-r--r-- | drivers/s390/scsi/zfcp_ccw.c | 6 | ||||
-rw-r--r-- | drivers/s390/scsi/zfcp_dbf.c | 126 | ||||
-rw-r--r-- | drivers/s390/scsi/zfcp_def.h | 11 | ||||
-rw-r--r-- | drivers/s390/scsi/zfcp_erp.c | 153 | ||||
-rw-r--r-- | drivers/s390/scsi/zfcp_ext.h | 24 | ||||
-rw-r--r-- | drivers/s390/scsi/zfcp_fsf.c | 70 | ||||
-rw-r--r-- | drivers/s390/scsi/zfcp_scsi.c | 2 | ||||
-rw-r--r-- | drivers/s390/scsi/zfcp_sysfs_adapter.c | 4 | ||||
-rw-r--r-- | drivers/s390/scsi/zfcp_sysfs_port.c | 3 | ||||
-rw-r--r-- | drivers/s390/scsi/zfcp_sysfs_unit.c | 3 |
10 files changed, 288 insertions, 114 deletions
diff --git a/drivers/s390/scsi/zfcp_ccw.c b/drivers/s390/scsi/zfcp_ccw.c index edc5015e920d..dd40b1c350b9 100644 --- a/drivers/s390/scsi/zfcp_ccw.c +++ b/drivers/s390/scsi/zfcp_ccw.c | |||
@@ -170,8 +170,8 @@ zfcp_ccw_set_online(struct ccw_device *ccw_device) | |||
170 | BUG_ON(!zfcp_reqlist_isempty(adapter)); | 170 | BUG_ON(!zfcp_reqlist_isempty(adapter)); |
171 | adapter->req_no = 0; | 171 | adapter->req_no = 0; |
172 | 172 | ||
173 | zfcp_erp_modify_adapter_status(adapter, ZFCP_STATUS_COMMON_RUNNING, | 173 | zfcp_erp_modify_adapter_status(adapter, 10, 0, |
174 | ZFCP_SET); | 174 | ZFCP_STATUS_COMMON_RUNNING, ZFCP_SET); |
175 | zfcp_erp_adapter_reopen(adapter, ZFCP_STATUS_COMMON_ERP_FAILED); | 175 | zfcp_erp_adapter_reopen(adapter, ZFCP_STATUS_COMMON_ERP_FAILED); |
176 | zfcp_erp_wait(adapter); | 176 | zfcp_erp_wait(adapter); |
177 | goto out; | 177 | goto out; |
@@ -236,7 +236,7 @@ zfcp_ccw_notify(struct ccw_device *ccw_device, int event) | |||
236 | ZFCP_LOG_NORMAL("adapter %s: operational again\n", | 236 | ZFCP_LOG_NORMAL("adapter %s: operational again\n", |
237 | zfcp_get_busid_by_adapter(adapter)); | 237 | zfcp_get_busid_by_adapter(adapter)); |
238 | debug_text_event(adapter->erp_dbf,1,"dev_oper"); | 238 | debug_text_event(adapter->erp_dbf,1,"dev_oper"); |
239 | zfcp_erp_modify_adapter_status(adapter, | 239 | zfcp_erp_modify_adapter_status(adapter, 11, 0, |
240 | ZFCP_STATUS_COMMON_RUNNING, | 240 | ZFCP_STATUS_COMMON_RUNNING, |
241 | ZFCP_SET); | 241 | ZFCP_SET); |
242 | zfcp_erp_adapter_reopen(adapter, | 242 | zfcp_erp_adapter_reopen(adapter, |
diff --git a/drivers/s390/scsi/zfcp_dbf.c b/drivers/s390/scsi/zfcp_dbf.c index 5a4b1e9a8b50..2fcfe9bec554 100644 --- a/drivers/s390/scsi/zfcp_dbf.c +++ b/drivers/s390/scsi/zfcp_dbf.c | |||
@@ -522,6 +522,7 @@ static struct debug_view zfcp_hba_dbf_view = { | |||
522 | 522 | ||
523 | static const char *zfcp_rec_dbf_tags[] = { | 523 | static const char *zfcp_rec_dbf_tags[] = { |
524 | [ZFCP_REC_DBF_ID_THREAD] = "thread", | 524 | [ZFCP_REC_DBF_ID_THREAD] = "thread", |
525 | [ZFCP_REC_DBF_ID_TARGET] = "target", | ||
525 | }; | 526 | }; |
526 | 527 | ||
527 | static const char *zfcp_rec_dbf_ids[] = { | 528 | static const char *zfcp_rec_dbf_ids[] = { |
@@ -534,6 +535,58 @@ static const char *zfcp_rec_dbf_ids[] = { | |||
534 | [7] = "down wakeup ecd", | 535 | [7] = "down wakeup ecd", |
535 | [8] = "down sleep epd", | 536 | [8] = "down sleep epd", |
536 | [9] = "down wakeup epd", | 537 | [9] = "down wakeup epd", |
538 | [10] = "online", | ||
539 | [11] = "operational", | ||
540 | [12] = "scsi slave destroy", | ||
541 | [13] = "propagate failed adapter", | ||
542 | [14] = "propagate failed port", | ||
543 | [15] = "block adapter", | ||
544 | [16] = "unblock adapter", | ||
545 | [17] = "block port", | ||
546 | [18] = "unblock port", | ||
547 | [19] = "block unit", | ||
548 | [20] = "unblock unit", | ||
549 | [21] = "unit recovery failed", | ||
550 | [22] = "port recovery failed", | ||
551 | [23] = "adapter recovery failed", | ||
552 | [24] = "qdio queues down", | ||
553 | [25] = "p2p failed", | ||
554 | [26] = "nameserver lookup failed", | ||
555 | [27] = "nameserver port failed", | ||
556 | [28] = "link up", | ||
557 | [29] = "link down", | ||
558 | [30] = "link up status read", | ||
559 | [31] = "open port failed", | ||
560 | [32] = "open port failed", | ||
561 | [33] = "close port", | ||
562 | [34] = "open unit failed", | ||
563 | [35] = "exclusive open unit failed", | ||
564 | [36] = "shared open unit failed", | ||
565 | [37] = "link down", | ||
566 | [38] = "link down status read no link", | ||
567 | [39] = "link down status read fdisc login", | ||
568 | [40] = "link down status read firmware update", | ||
569 | [41] = "link down status read unknown reason", | ||
570 | [42] = "link down ecd incomplete", | ||
571 | [43] = "link down epd incomplete", | ||
572 | [44] = "sysfs adapter recovery", | ||
573 | [45] = "sysfs port recovery", | ||
574 | [46] = "sysfs unit recovery", | ||
575 | [47] = "port boxed abort", | ||
576 | [48] = "unit boxed abort", | ||
577 | [49] = "port boxed ct", | ||
578 | [50] = "port boxed close physical", | ||
579 | [51] = "port boxed open unit", | ||
580 | [52] = "port boxed close unit", | ||
581 | [53] = "port boxed fcp", | ||
582 | [54] = "unit boxed fcp", | ||
583 | [55] = "port access denied ct", | ||
584 | [56] = "port access denied els", | ||
585 | [57] = "port access denied open port", | ||
586 | [58] = "port access denied close physical", | ||
587 | [59] = "unit access denied open unit", | ||
588 | [60] = "shared unit access denied open unit", | ||
589 | [61] = "unit access denied fcp", | ||
537 | }; | 590 | }; |
538 | 591 | ||
539 | static int zfcp_rec_dbf_view_format(debug_info_t *id, struct debug_view *view, | 592 | static int zfcp_rec_dbf_view_format(debug_info_t *id, struct debug_view *view, |
@@ -552,6 +605,14 @@ static int zfcp_rec_dbf_view_format(debug_info_t *id, struct debug_view *view, | |||
552 | zfcp_dbf_out(&p, "ready", "%d", r->u.thread.ready); | 605 | zfcp_dbf_out(&p, "ready", "%d", r->u.thread.ready); |
553 | zfcp_dbf_out(&p, "running", "%d", r->u.thread.running); | 606 | zfcp_dbf_out(&p, "running", "%d", r->u.thread.running); |
554 | break; | 607 | break; |
608 | case ZFCP_REC_DBF_ID_TARGET: | ||
609 | zfcp_dbf_out(&p, "reference", "0x%016Lx", r->u.target.ref); | ||
610 | zfcp_dbf_out(&p, "status", "0x%08x", r->u.target.status); | ||
611 | zfcp_dbf_out(&p, "erp_count", "%d", r->u.target.erp_count); | ||
612 | zfcp_dbf_out(&p, "d_id", "0x%06x", r->u.target.d_id); | ||
613 | zfcp_dbf_out(&p, "wwpn", "0x%016Lx", r->u.target.wwpn); | ||
614 | zfcp_dbf_out(&p, "fcp_lun", "0x%016Lx", r->u.target.fcp_lun); | ||
615 | break; | ||
555 | } | 616 | } |
556 | sprintf(p, "\n"); | 617 | sprintf(p, "\n"); |
557 | return (p - buf) + 1; | 618 | return (p - buf) + 1; |
@@ -601,6 +662,71 @@ void zfcp_rec_dbf_event_thread(u8 id2, struct zfcp_adapter *adapter, int lock) | |||
601 | spin_unlock_irqrestore(&adapter->rec_dbf_lock, flags); | 662 | spin_unlock_irqrestore(&adapter->rec_dbf_lock, flags); |
602 | } | 663 | } |
603 | 664 | ||
665 | static void zfcp_rec_dbf_event_target(u8 id2, u64 ref, | ||
666 | struct zfcp_adapter *adapter, | ||
667 | atomic_t *status, atomic_t *erp_count, | ||
668 | u64 wwpn, u32 d_id, u64 fcp_lun) | ||
669 | { | ||
670 | struct zfcp_rec_dbf_record *r = &adapter->rec_dbf_buf; | ||
671 | unsigned long flags; | ||
672 | |||
673 | spin_lock_irqsave(&adapter->rec_dbf_lock, flags); | ||
674 | memset(r, 0, sizeof(*r)); | ||
675 | r->id = ZFCP_REC_DBF_ID_TARGET; | ||
676 | r->id2 = id2; | ||
677 | r->u.target.ref = ref; | ||
678 | r->u.target.status = atomic_read(status); | ||
679 | r->u.target.wwpn = wwpn; | ||
680 | r->u.target.d_id = d_id; | ||
681 | r->u.target.fcp_lun = fcp_lun; | ||
682 | r->u.target.erp_count = atomic_read(erp_count); | ||
683 | debug_event(adapter->rec_dbf, 3, r, sizeof(*r)); | ||
684 | spin_unlock_irqrestore(&adapter->rec_dbf_lock, flags); | ||
685 | } | ||
686 | |||
687 | /** | ||
688 | * zfcp_rec_dbf_event_adapter - trace event for adapter state change | ||
689 | * @id: identifier for trigger of state change | ||
690 | * @ref: additional reference (e.g. request) | ||
691 | * @adapter: adapter | ||
692 | */ | ||
693 | void zfcp_rec_dbf_event_adapter(u8 id, u64 ref, struct zfcp_adapter *adapter) | ||
694 | { | ||
695 | zfcp_rec_dbf_event_target(id, ref, adapter, &adapter->status, | ||
696 | &adapter->erp_counter, 0, 0, 0); | ||
697 | } | ||
698 | |||
699 | /** | ||
700 | * zfcp_rec_dbf_event_port - trace event for port state change | ||
701 | * @id: identifier for trigger of state change | ||
702 | * @ref: additional reference (e.g. request) | ||
703 | * @port: port | ||
704 | */ | ||
705 | void zfcp_rec_dbf_event_port(u8 id, u64 ref, struct zfcp_port *port) | ||
706 | { | ||
707 | struct zfcp_adapter *adapter = port->adapter; | ||
708 | |||
709 | zfcp_rec_dbf_event_target(id, ref, adapter, &port->status, | ||
710 | &port->erp_counter, port->wwpn, port->d_id, | ||
711 | 0); | ||
712 | } | ||
713 | |||
714 | /** | ||
715 | * zfcp_rec_dbf_event_unit - trace event for unit state change | ||
716 | * @id: identifier for trigger of state change | ||
717 | * @ref: additional reference (e.g. request) | ||
718 | * @unit: unit | ||
719 | */ | ||
720 | void zfcp_rec_dbf_event_unit(u8 id, u64 ref, struct zfcp_unit *unit) | ||
721 | { | ||
722 | struct zfcp_port *port = unit->port; | ||
723 | struct zfcp_adapter *adapter = port->adapter; | ||
724 | |||
725 | zfcp_rec_dbf_event_target(id, ref, adapter, &unit->status, | ||
726 | &unit->erp_counter, port->wwpn, port->d_id, | ||
727 | unit->fcp_lun); | ||
728 | } | ||
729 | |||
604 | static void | 730 | static void |
605 | _zfcp_san_dbf_event_common_ct(const char *tag, struct zfcp_fsf_req *fsf_req, | 731 | _zfcp_san_dbf_event_common_ct(const char *tag, struct zfcp_fsf_req *fsf_req, |
606 | u32 s_id, u32 d_id, void *buffer, int buflen) | 732 | u32 s_id, u32 d_id, void *buffer, int buflen) |
diff --git a/drivers/s390/scsi/zfcp_def.h b/drivers/s390/scsi/zfcp_def.h index 332c83eba6c7..659ec739706a 100644 --- a/drivers/s390/scsi/zfcp_def.h +++ b/drivers/s390/scsi/zfcp_def.h | |||
@@ -286,16 +286,27 @@ struct zfcp_rec_dbf_record_thread { | |||
286 | u32 running; | 286 | u32 running; |
287 | } __attribute__ ((packed)); | 287 | } __attribute__ ((packed)); |
288 | 288 | ||
289 | struct zfcp_rec_dbf_record_target { | ||
290 | u64 ref; | ||
291 | u32 status; | ||
292 | u32 d_id; | ||
293 | u64 wwpn; | ||
294 | u64 fcp_lun; | ||
295 | u32 erp_count; | ||
296 | } __attribute__ ((packed)); | ||
297 | |||
289 | struct zfcp_rec_dbf_record { | 298 | struct zfcp_rec_dbf_record { |
290 | u8 id; | 299 | u8 id; |
291 | u8 id2; | 300 | u8 id2; |
292 | union { | 301 | union { |
293 | struct zfcp_rec_dbf_record_thread thread; | 302 | struct zfcp_rec_dbf_record_thread thread; |
303 | struct zfcp_rec_dbf_record_target target; | ||
294 | } u; | 304 | } u; |
295 | } __attribute__ ((packed)); | 305 | } __attribute__ ((packed)); |
296 | 306 | ||
297 | enum { | 307 | enum { |
298 | ZFCP_REC_DBF_ID_THREAD, | 308 | ZFCP_REC_DBF_ID_THREAD, |
309 | ZFCP_REC_DBF_ID_TARGET, | ||
299 | }; | 310 | }; |
300 | 311 | ||
301 | struct zfcp_hba_dbf_record_response { | 312 | struct zfcp_hba_dbf_record_response { |
diff --git a/drivers/s390/scsi/zfcp_erp.c b/drivers/s390/scsi/zfcp_erp.c index f9383f068169..bee03443efd4 100644 --- a/drivers/s390/scsi/zfcp_erp.c +++ b/drivers/s390/scsi/zfcp_erp.c | |||
@@ -163,7 +163,7 @@ static void zfcp_close_fsf(struct zfcp_adapter *adapter) | |||
163 | /* reset FSF request sequence number */ | 163 | /* reset FSF request sequence number */ |
164 | adapter->fsf_req_seq_no = 0; | 164 | adapter->fsf_req_seq_no = 0; |
165 | /* all ports and units are closed */ | 165 | /* all ports and units are closed */ |
166 | zfcp_erp_modify_adapter_status(adapter, | 166 | zfcp_erp_modify_adapter_status(adapter, 24, 0, |
167 | ZFCP_STATUS_COMMON_OPEN, ZFCP_CLEAR); | 167 | ZFCP_STATUS_COMMON_OPEN, ZFCP_CLEAR); |
168 | } | 168 | } |
169 | 169 | ||
@@ -216,7 +216,7 @@ zfcp_erp_adapter_reopen_internal(struct zfcp_adapter *adapter, int clear_mask) | |||
216 | zfcp_get_busid_by_adapter(adapter)); | 216 | zfcp_get_busid_by_adapter(adapter)); |
217 | debug_text_event(adapter->erp_dbf, 5, "a_ro_f"); | 217 | debug_text_event(adapter->erp_dbf, 5, "a_ro_f"); |
218 | /* ensure propagation of failed status to new devices */ | 218 | /* ensure propagation of failed status to new devices */ |
219 | zfcp_erp_adapter_failed(adapter); | 219 | zfcp_erp_adapter_failed(adapter, 13, 0); |
220 | retval = -EIO; | 220 | retval = -EIO; |
221 | goto out; | 221 | goto out; |
222 | } | 222 | } |
@@ -572,7 +572,7 @@ zfcp_erp_port_reopen_internal(struct zfcp_port *port, int clear_mask) | |||
572 | debug_text_event(adapter->erp_dbf, 5, "p_ro_f"); | 572 | debug_text_event(adapter->erp_dbf, 5, "p_ro_f"); |
573 | debug_event(adapter->erp_dbf, 5, &port->wwpn, sizeof (wwn_t)); | 573 | debug_event(adapter->erp_dbf, 5, &port->wwpn, sizeof (wwn_t)); |
574 | /* ensure propagation of failed status to new devices */ | 574 | /* ensure propagation of failed status to new devices */ |
575 | zfcp_erp_port_failed(port); | 575 | zfcp_erp_port_failed(port, 14, 0); |
576 | retval = -EIO; | 576 | retval = -EIO; |
577 | goto out; | 577 | goto out; |
578 | } | 578 | } |
@@ -688,18 +688,44 @@ zfcp_erp_unit_reopen(struct zfcp_unit *unit, int clear_mask) | |||
688 | static void zfcp_erp_adapter_block(struct zfcp_adapter *adapter, int clear_mask) | 688 | static void zfcp_erp_adapter_block(struct zfcp_adapter *adapter, int clear_mask) |
689 | { | 689 | { |
690 | debug_text_event(adapter->erp_dbf, 6, "a_bl"); | 690 | debug_text_event(adapter->erp_dbf, 6, "a_bl"); |
691 | zfcp_erp_modify_adapter_status(adapter, | 691 | zfcp_erp_modify_adapter_status(adapter, 15, 0, |
692 | ZFCP_STATUS_COMMON_UNBLOCKED | | 692 | ZFCP_STATUS_COMMON_UNBLOCKED | |
693 | clear_mask, ZFCP_CLEAR); | 693 | clear_mask, ZFCP_CLEAR); |
694 | } | 694 | } |
695 | 695 | ||
696 | /* FIXME: isn't really atomic */ | ||
697 | /* | ||
698 | * returns the mask which has not been set so far, i.e. | ||
699 | * 0 if no bit has been changed, !0 if some bit has been changed | ||
700 | */ | ||
701 | static int atomic_test_and_set_mask(unsigned long mask, atomic_t *v) | ||
702 | { | ||
703 | int changed_bits = (atomic_read(v) /*XOR*/^ mask) & mask; | ||
704 | atomic_set_mask(mask, v); | ||
705 | return changed_bits; | ||
706 | } | ||
707 | |||
708 | /* FIXME: isn't really atomic */ | ||
709 | /* | ||
710 | * returns the mask which has not been cleared so far, i.e. | ||
711 | * 0 if no bit has been changed, !0 if some bit has been changed | ||
712 | */ | ||
713 | static int atomic_test_and_clear_mask(unsigned long mask, atomic_t *v) | ||
714 | { | ||
715 | int changed_bits = atomic_read(v) & mask; | ||
716 | atomic_clear_mask(mask, v); | ||
717 | return changed_bits; | ||
718 | } | ||
719 | |||
696 | /** | 720 | /** |
697 | * zfcp_erp_adapter_unblock - mark adapter as unblocked, allow scsi requests | 721 | * zfcp_erp_adapter_unblock - mark adapter as unblocked, allow scsi requests |
698 | */ | 722 | */ |
699 | static void zfcp_erp_adapter_unblock(struct zfcp_adapter *adapter) | 723 | static void zfcp_erp_adapter_unblock(struct zfcp_adapter *adapter) |
700 | { | 724 | { |
701 | debug_text_event(adapter->erp_dbf, 6, "a_ubl"); | 725 | debug_text_event(adapter->erp_dbf, 6, "a_ubl"); |
702 | atomic_set_mask(ZFCP_STATUS_COMMON_UNBLOCKED, &adapter->status); | 726 | if (atomic_test_and_set_mask(ZFCP_STATUS_COMMON_UNBLOCKED, |
727 | &adapter->status)) | ||
728 | zfcp_rec_dbf_event_adapter(16, 0, adapter); | ||
703 | } | 729 | } |
704 | 730 | ||
705 | /* | 731 | /* |
@@ -718,7 +744,7 @@ zfcp_erp_port_block(struct zfcp_port *port, int clear_mask) | |||
718 | 744 | ||
719 | debug_text_event(adapter->erp_dbf, 6, "p_bl"); | 745 | debug_text_event(adapter->erp_dbf, 6, "p_bl"); |
720 | debug_event(adapter->erp_dbf, 6, &port->wwpn, sizeof (wwn_t)); | 746 | debug_event(adapter->erp_dbf, 6, &port->wwpn, sizeof (wwn_t)); |
721 | zfcp_erp_modify_port_status(port, | 747 | zfcp_erp_modify_port_status(port, 17, 0, |
722 | ZFCP_STATUS_COMMON_UNBLOCKED | clear_mask, | 748 | ZFCP_STATUS_COMMON_UNBLOCKED | clear_mask, |
723 | ZFCP_CLEAR); | 749 | ZFCP_CLEAR); |
724 | } | 750 | } |
@@ -737,7 +763,9 @@ zfcp_erp_port_unblock(struct zfcp_port *port) | |||
737 | 763 | ||
738 | debug_text_event(adapter->erp_dbf, 6, "p_ubl"); | 764 | debug_text_event(adapter->erp_dbf, 6, "p_ubl"); |
739 | debug_event(adapter->erp_dbf, 6, &port->wwpn, sizeof (wwn_t)); | 765 | debug_event(adapter->erp_dbf, 6, &port->wwpn, sizeof (wwn_t)); |
740 | atomic_set_mask(ZFCP_STATUS_COMMON_UNBLOCKED, &port->status); | 766 | if (atomic_test_and_set_mask(ZFCP_STATUS_COMMON_UNBLOCKED, |
767 | &port->status)) | ||
768 | zfcp_rec_dbf_event_port(18, 0, port); | ||
741 | } | 769 | } |
742 | 770 | ||
743 | /* | 771 | /* |
@@ -756,7 +784,7 @@ zfcp_erp_unit_block(struct zfcp_unit *unit, int clear_mask) | |||
756 | 784 | ||
757 | debug_text_event(adapter->erp_dbf, 6, "u_bl"); | 785 | debug_text_event(adapter->erp_dbf, 6, "u_bl"); |
758 | debug_event(adapter->erp_dbf, 6, &unit->fcp_lun, sizeof (fcp_lun_t)); | 786 | debug_event(adapter->erp_dbf, 6, &unit->fcp_lun, sizeof (fcp_lun_t)); |
759 | zfcp_erp_modify_unit_status(unit, | 787 | zfcp_erp_modify_unit_status(unit, 19, 0, |
760 | ZFCP_STATUS_COMMON_UNBLOCKED | clear_mask, | 788 | ZFCP_STATUS_COMMON_UNBLOCKED | clear_mask, |
761 | ZFCP_CLEAR); | 789 | ZFCP_CLEAR); |
762 | } | 790 | } |
@@ -775,7 +803,9 @@ zfcp_erp_unit_unblock(struct zfcp_unit *unit) | |||
775 | 803 | ||
776 | debug_text_event(adapter->erp_dbf, 6, "u_ubl"); | 804 | debug_text_event(adapter->erp_dbf, 6, "u_ubl"); |
777 | debug_event(adapter->erp_dbf, 6, &unit->fcp_lun, sizeof (fcp_lun_t)); | 805 | debug_event(adapter->erp_dbf, 6, &unit->fcp_lun, sizeof (fcp_lun_t)); |
778 | atomic_set_mask(ZFCP_STATUS_COMMON_UNBLOCKED, &unit->status); | 806 | if (atomic_test_and_set_mask(ZFCP_STATUS_COMMON_UNBLOCKED, |
807 | &unit->status)) | ||
808 | zfcp_rec_dbf_event_unit(20, 0, unit); | ||
779 | } | 809 | } |
780 | 810 | ||
781 | static void | 811 | static void |
@@ -1357,9 +1387,9 @@ zfcp_erp_strategy_memwait(struct zfcp_erp_action *erp_action) | |||
1357 | * | 1387 | * |
1358 | */ | 1388 | */ |
1359 | void | 1389 | void |
1360 | zfcp_erp_adapter_failed(struct zfcp_adapter *adapter) | 1390 | zfcp_erp_adapter_failed(struct zfcp_adapter *adapter, u8 id, u64 ref) |
1361 | { | 1391 | { |
1362 | zfcp_erp_modify_adapter_status(adapter, | 1392 | zfcp_erp_modify_adapter_status(adapter, id, ref, |
1363 | ZFCP_STATUS_COMMON_ERP_FAILED, ZFCP_SET); | 1393 | ZFCP_STATUS_COMMON_ERP_FAILED, ZFCP_SET); |
1364 | ZFCP_LOG_NORMAL("adapter erp failed on adapter %s\n", | 1394 | ZFCP_LOG_NORMAL("adapter erp failed on adapter %s\n", |
1365 | zfcp_get_busid_by_adapter(adapter)); | 1395 | zfcp_get_busid_by_adapter(adapter)); |
@@ -1373,9 +1403,9 @@ zfcp_erp_adapter_failed(struct zfcp_adapter *adapter) | |||
1373 | * | 1403 | * |
1374 | */ | 1404 | */ |
1375 | void | 1405 | void |
1376 | zfcp_erp_port_failed(struct zfcp_port *port) | 1406 | zfcp_erp_port_failed(struct zfcp_port *port, u8 id, u64 ref) |
1377 | { | 1407 | { |
1378 | zfcp_erp_modify_port_status(port, | 1408 | zfcp_erp_modify_port_status(port, id, ref, |
1379 | ZFCP_STATUS_COMMON_ERP_FAILED, ZFCP_SET); | 1409 | ZFCP_STATUS_COMMON_ERP_FAILED, ZFCP_SET); |
1380 | 1410 | ||
1381 | if (atomic_test_mask(ZFCP_STATUS_PORT_WKA, &port->status)) | 1411 | if (atomic_test_mask(ZFCP_STATUS_PORT_WKA, &port->status)) |
@@ -1397,9 +1427,9 @@ zfcp_erp_port_failed(struct zfcp_port *port) | |||
1397 | * | 1427 | * |
1398 | */ | 1428 | */ |
1399 | void | 1429 | void |
1400 | zfcp_erp_unit_failed(struct zfcp_unit *unit) | 1430 | zfcp_erp_unit_failed(struct zfcp_unit *unit, u8 id, u64 ref) |
1401 | { | 1431 | { |
1402 | zfcp_erp_modify_unit_status(unit, | 1432 | zfcp_erp_modify_unit_status(unit, id, ref, |
1403 | ZFCP_STATUS_COMMON_ERP_FAILED, ZFCP_SET); | 1433 | ZFCP_STATUS_COMMON_ERP_FAILED, ZFCP_SET); |
1404 | 1434 | ||
1405 | ZFCP_LOG_NORMAL("unit erp failed on unit 0x%016Lx on port 0x%016Lx " | 1435 | ZFCP_LOG_NORMAL("unit erp failed on unit 0x%016Lx on port 0x%016Lx " |
@@ -1522,7 +1552,7 @@ zfcp_erp_strategy_check_unit(struct zfcp_unit *unit, int result) | |||
1522 | case ZFCP_ERP_FAILED : | 1552 | case ZFCP_ERP_FAILED : |
1523 | atomic_inc(&unit->erp_counter); | 1553 | atomic_inc(&unit->erp_counter); |
1524 | if (atomic_read(&unit->erp_counter) > ZFCP_MAX_ERPS) | 1554 | if (atomic_read(&unit->erp_counter) > ZFCP_MAX_ERPS) |
1525 | zfcp_erp_unit_failed(unit); | 1555 | zfcp_erp_unit_failed(unit, 21, 0); |
1526 | break; | 1556 | break; |
1527 | case ZFCP_ERP_EXIT : | 1557 | case ZFCP_ERP_EXIT : |
1528 | /* nothing */ | 1558 | /* nothing */ |
@@ -1551,7 +1581,7 @@ zfcp_erp_strategy_check_port(struct zfcp_port *port, int result) | |||
1551 | case ZFCP_ERP_FAILED : | 1581 | case ZFCP_ERP_FAILED : |
1552 | atomic_inc(&port->erp_counter); | 1582 | atomic_inc(&port->erp_counter); |
1553 | if (atomic_read(&port->erp_counter) > ZFCP_MAX_ERPS) | 1583 | if (atomic_read(&port->erp_counter) > ZFCP_MAX_ERPS) |
1554 | zfcp_erp_port_failed(port); | 1584 | zfcp_erp_port_failed(port, 22, 0); |
1555 | break; | 1585 | break; |
1556 | case ZFCP_ERP_EXIT : | 1586 | case ZFCP_ERP_EXIT : |
1557 | /* nothing */ | 1587 | /* nothing */ |
@@ -1579,7 +1609,7 @@ zfcp_erp_strategy_check_adapter(struct zfcp_adapter *adapter, int result) | |||
1579 | case ZFCP_ERP_FAILED : | 1609 | case ZFCP_ERP_FAILED : |
1580 | atomic_inc(&adapter->erp_counter); | 1610 | atomic_inc(&adapter->erp_counter); |
1581 | if (atomic_read(&adapter->erp_counter) > ZFCP_MAX_ERPS) | 1611 | if (atomic_read(&adapter->erp_counter) > ZFCP_MAX_ERPS) |
1582 | zfcp_erp_adapter_failed(adapter); | 1612 | zfcp_erp_adapter_failed(adapter, 23, 0); |
1583 | break; | 1613 | break; |
1584 | case ZFCP_ERP_EXIT : | 1614 | case ZFCP_ERP_EXIT : |
1585 | /* nothing */ | 1615 | /* nothing */ |
@@ -1737,29 +1767,30 @@ zfcp_erp_wait(struct zfcp_adapter *adapter) | |||
1737 | return retval; | 1767 | return retval; |
1738 | } | 1768 | } |
1739 | 1769 | ||
1740 | void | 1770 | void zfcp_erp_modify_adapter_status(struct zfcp_adapter *adapter, u8 id, |
1741 | zfcp_erp_modify_adapter_status(struct zfcp_adapter *adapter, | 1771 | u64 ref, u32 mask, int set_or_clear) |
1742 | u32 mask, int set_or_clear) | ||
1743 | { | 1772 | { |
1744 | struct zfcp_port *port; | 1773 | struct zfcp_port *port; |
1745 | u32 common_mask = mask & ZFCP_COMMON_FLAGS; | 1774 | u32 changed, common_mask = mask & ZFCP_COMMON_FLAGS; |
1746 | 1775 | ||
1747 | if (set_or_clear == ZFCP_SET) { | 1776 | if (set_or_clear == ZFCP_SET) { |
1748 | atomic_set_mask(mask, &adapter->status); | 1777 | changed = atomic_test_and_set_mask(mask, &adapter->status); |
1749 | debug_text_event(adapter->erp_dbf, 3, "a_mod_as_s"); | 1778 | debug_text_event(adapter->erp_dbf, 3, "a_mod_as_s"); |
1750 | } else { | 1779 | } else { |
1751 | atomic_clear_mask(mask, &adapter->status); | 1780 | changed = atomic_test_and_clear_mask(mask, &adapter->status); |
1752 | if (mask & ZFCP_STATUS_COMMON_ERP_FAILED) | 1781 | if (mask & ZFCP_STATUS_COMMON_ERP_FAILED) |
1753 | atomic_set(&adapter->erp_counter, 0); | 1782 | atomic_set(&adapter->erp_counter, 0); |
1754 | debug_text_event(adapter->erp_dbf, 3, "a_mod_as_c"); | 1783 | debug_text_event(adapter->erp_dbf, 3, "a_mod_as_c"); |
1755 | } | 1784 | } |
1785 | if (changed) | ||
1786 | zfcp_rec_dbf_event_adapter(id, ref, adapter); | ||
1756 | debug_event(adapter->erp_dbf, 3, &mask, sizeof (u32)); | 1787 | debug_event(adapter->erp_dbf, 3, &mask, sizeof (u32)); |
1757 | 1788 | ||
1758 | /* Deal with all underlying devices, only pass common_mask */ | 1789 | /* Deal with all underlying devices, only pass common_mask */ |
1759 | if (common_mask) | 1790 | if (common_mask) |
1760 | list_for_each_entry(port, &adapter->port_list_head, list) | 1791 | list_for_each_entry(port, &adapter->port_list_head, list) |
1761 | zfcp_erp_modify_port_status(port, common_mask, | 1792 | zfcp_erp_modify_port_status(port, id, ref, common_mask, |
1762 | set_or_clear); | 1793 | set_or_clear); |
1763 | } | 1794 | } |
1764 | 1795 | ||
1765 | /* | 1796 | /* |
@@ -1768,29 +1799,31 @@ zfcp_erp_modify_adapter_status(struct zfcp_adapter *adapter, | |||
1768 | * purpose: sets the port and all underlying devices to ERP_FAILED | 1799 | * purpose: sets the port and all underlying devices to ERP_FAILED |
1769 | * | 1800 | * |
1770 | */ | 1801 | */ |
1771 | void | 1802 | void zfcp_erp_modify_port_status(struct zfcp_port *port, u8 id, u64 ref, |
1772 | zfcp_erp_modify_port_status(struct zfcp_port *port, u32 mask, int set_or_clear) | 1803 | u32 mask, int set_or_clear) |
1773 | { | 1804 | { |
1774 | struct zfcp_unit *unit; | 1805 | struct zfcp_unit *unit; |
1775 | u32 common_mask = mask & ZFCP_COMMON_FLAGS; | 1806 | u32 changed, common_mask = mask & ZFCP_COMMON_FLAGS; |
1776 | 1807 | ||
1777 | if (set_or_clear == ZFCP_SET) { | 1808 | if (set_or_clear == ZFCP_SET) { |
1778 | atomic_set_mask(mask, &port->status); | 1809 | changed = atomic_test_and_set_mask(mask, &port->status); |
1779 | debug_text_event(port->adapter->erp_dbf, 3, "p_mod_ps_s"); | 1810 | debug_text_event(port->adapter->erp_dbf, 3, "p_mod_ps_s"); |
1780 | } else { | 1811 | } else { |
1781 | atomic_clear_mask(mask, &port->status); | 1812 | changed = atomic_test_and_clear_mask(mask, &port->status); |
1782 | if (mask & ZFCP_STATUS_COMMON_ERP_FAILED) | 1813 | if (mask & ZFCP_STATUS_COMMON_ERP_FAILED) |
1783 | atomic_set(&port->erp_counter, 0); | 1814 | atomic_set(&port->erp_counter, 0); |
1784 | debug_text_event(port->adapter->erp_dbf, 3, "p_mod_ps_c"); | 1815 | debug_text_event(port->adapter->erp_dbf, 3, "p_mod_ps_c"); |
1785 | } | 1816 | } |
1817 | if (changed) | ||
1818 | zfcp_rec_dbf_event_port(id, ref, port); | ||
1786 | debug_event(port->adapter->erp_dbf, 3, &port->wwpn, sizeof (wwn_t)); | 1819 | debug_event(port->adapter->erp_dbf, 3, &port->wwpn, sizeof (wwn_t)); |
1787 | debug_event(port->adapter->erp_dbf, 3, &mask, sizeof (u32)); | 1820 | debug_event(port->adapter->erp_dbf, 3, &mask, sizeof (u32)); |
1788 | 1821 | ||
1789 | /* Modify status of all underlying devices, only pass common mask */ | 1822 | /* Modify status of all underlying devices, only pass common mask */ |
1790 | if (common_mask) | 1823 | if (common_mask) |
1791 | list_for_each_entry(unit, &port->unit_list_head, list) | 1824 | list_for_each_entry(unit, &port->unit_list_head, list) |
1792 | zfcp_erp_modify_unit_status(unit, common_mask, | 1825 | zfcp_erp_modify_unit_status(unit, id, ref, common_mask, |
1793 | set_or_clear); | 1826 | set_or_clear); |
1794 | } | 1827 | } |
1795 | 1828 | ||
1796 | /* | 1829 | /* |
@@ -1799,19 +1832,23 @@ zfcp_erp_modify_port_status(struct zfcp_port *port, u32 mask, int set_or_clear) | |||
1799 | * purpose: sets the unit to ERP_FAILED | 1832 | * purpose: sets the unit to ERP_FAILED |
1800 | * | 1833 | * |
1801 | */ | 1834 | */ |
1802 | void | 1835 | void zfcp_erp_modify_unit_status(struct zfcp_unit *unit, u8 id, u64 ref, |
1803 | zfcp_erp_modify_unit_status(struct zfcp_unit *unit, u32 mask, int set_or_clear) | 1836 | u32 mask, int set_or_clear) |
1804 | { | 1837 | { |
1838 | u32 changed; | ||
1839 | |||
1805 | if (set_or_clear == ZFCP_SET) { | 1840 | if (set_or_clear == ZFCP_SET) { |
1806 | atomic_set_mask(mask, &unit->status); | 1841 | changed = atomic_test_and_set_mask(mask, &unit->status); |
1807 | debug_text_event(unit->port->adapter->erp_dbf, 3, "u_mod_us_s"); | 1842 | debug_text_event(unit->port->adapter->erp_dbf, 3, "u_mod_us_s"); |
1808 | } else { | 1843 | } else { |
1809 | atomic_clear_mask(mask, &unit->status); | 1844 | changed = atomic_test_and_clear_mask(mask, &unit->status); |
1810 | if (mask & ZFCP_STATUS_COMMON_ERP_FAILED) { | 1845 | if (mask & ZFCP_STATUS_COMMON_ERP_FAILED) { |
1811 | atomic_set(&unit->erp_counter, 0); | 1846 | atomic_set(&unit->erp_counter, 0); |
1812 | } | 1847 | } |
1813 | debug_text_event(unit->port->adapter->erp_dbf, 3, "u_mod_us_c"); | 1848 | debug_text_event(unit->port->adapter->erp_dbf, 3, "u_mod_us_c"); |
1814 | } | 1849 | } |
1850 | if (changed) | ||
1851 | zfcp_rec_dbf_event_unit(id, ref, unit); | ||
1815 | debug_event(unit->port->adapter->erp_dbf, 3, &unit->fcp_lun, | 1852 | debug_event(unit->port->adapter->erp_dbf, 3, &unit->fcp_lun, |
1816 | sizeof (fcp_lun_t)); | 1853 | sizeof (fcp_lun_t)); |
1817 | debug_event(unit->port->adapter->erp_dbf, 3, &mask, sizeof (u32)); | 1854 | debug_event(unit->port->adapter->erp_dbf, 3, &mask, sizeof (u32)); |
@@ -2403,7 +2440,7 @@ zfcp_erp_port_strategy_open_common(struct zfcp_erp_action *erp_action) | |||
2403 | port->wwpn, | 2440 | port->wwpn, |
2404 | zfcp_get_busid_by_adapter(adapter), | 2441 | zfcp_get_busid_by_adapter(adapter), |
2405 | adapter->peer_wwpn); | 2442 | adapter->peer_wwpn); |
2406 | zfcp_erp_port_failed(port); | 2443 | zfcp_erp_port_failed(port, 25, 0); |
2407 | retval = ZFCP_ERP_FAILED; | 2444 | retval = ZFCP_ERP_FAILED; |
2408 | break; | 2445 | break; |
2409 | } | 2446 | } |
@@ -2461,7 +2498,7 @@ zfcp_erp_port_strategy_open_common(struct zfcp_erp_action *erp_action) | |||
2461 | "for port 0x%016Lx " | 2498 | "for port 0x%016Lx " |
2462 | "(misconfigured WWPN?)\n", | 2499 | "(misconfigured WWPN?)\n", |
2463 | port->wwpn); | 2500 | port->wwpn); |
2464 | zfcp_erp_port_failed(port); | 2501 | zfcp_erp_port_failed(port, 26, 0); |
2465 | retval = ZFCP_ERP_EXIT; | 2502 | retval = ZFCP_ERP_EXIT; |
2466 | } else { | 2503 | } else { |
2467 | ZFCP_LOG_DEBUG("nameserver look-up failed for " | 2504 | ZFCP_LOG_DEBUG("nameserver look-up failed for " |
@@ -2567,7 +2604,7 @@ zfcp_erp_port_strategy_open_nameserver_wakeup(struct zfcp_erp_action | |||
2567 | if (atomic_test_mask( | 2604 | if (atomic_test_mask( |
2568 | ZFCP_STATUS_COMMON_ERP_FAILED, | 2605 | ZFCP_STATUS_COMMON_ERP_FAILED, |
2569 | &adapter->nameserver_port->status)) | 2606 | &adapter->nameserver_port->status)) |
2570 | zfcp_erp_port_failed(erp_action->port); | 2607 | zfcp_erp_port_failed(erp_action->port, 27, 0); |
2571 | zfcp_erp_action_ready(erp_action); | 2608 | zfcp_erp_action_ready(erp_action); |
2572 | } | 2609 | } |
2573 | } | 2610 | } |
@@ -3274,8 +3311,7 @@ static void zfcp_erp_action_to_ready(struct zfcp_erp_action *erp_action) | |||
3274 | list_move(&erp_action->list, &erp_action->adapter->erp_ready_head); | 3311 | list_move(&erp_action->list, &erp_action->adapter->erp_ready_head); |
3275 | } | 3312 | } |
3276 | 3313 | ||
3277 | void | 3314 | void zfcp_erp_port_boxed(struct zfcp_port *port, u8 id, u64 ref) |
3278 | zfcp_erp_port_boxed(struct zfcp_port *port) | ||
3279 | { | 3315 | { |
3280 | struct zfcp_adapter *adapter = port->adapter; | 3316 | struct zfcp_adapter *adapter = port->adapter; |
3281 | unsigned long flags; | 3317 | unsigned long flags; |
@@ -3283,28 +3319,24 @@ zfcp_erp_port_boxed(struct zfcp_port *port) | |||
3283 | debug_text_event(adapter->erp_dbf, 3, "p_access_boxed"); | 3319 | debug_text_event(adapter->erp_dbf, 3, "p_access_boxed"); |
3284 | debug_event(adapter->erp_dbf, 3, &port->wwpn, sizeof(wwn_t)); | 3320 | debug_event(adapter->erp_dbf, 3, &port->wwpn, sizeof(wwn_t)); |
3285 | read_lock_irqsave(&zfcp_data.config_lock, flags); | 3321 | read_lock_irqsave(&zfcp_data.config_lock, flags); |
3286 | zfcp_erp_modify_port_status(port, | 3322 | zfcp_erp_modify_port_status(port, id, ref, |
3287 | ZFCP_STATUS_COMMON_ACCESS_BOXED, | 3323 | ZFCP_STATUS_COMMON_ACCESS_BOXED, ZFCP_SET); |
3288 | ZFCP_SET); | ||
3289 | read_unlock_irqrestore(&zfcp_data.config_lock, flags); | 3324 | read_unlock_irqrestore(&zfcp_data.config_lock, flags); |
3290 | zfcp_erp_port_reopen(port, ZFCP_STATUS_COMMON_ERP_FAILED); | 3325 | zfcp_erp_port_reopen(port, ZFCP_STATUS_COMMON_ERP_FAILED); |
3291 | } | 3326 | } |
3292 | 3327 | ||
3293 | void | 3328 | void zfcp_erp_unit_boxed(struct zfcp_unit *unit, u8 id, u64 ref) |
3294 | zfcp_erp_unit_boxed(struct zfcp_unit *unit) | ||
3295 | { | 3329 | { |
3296 | struct zfcp_adapter *adapter = unit->port->adapter; | 3330 | struct zfcp_adapter *adapter = unit->port->adapter; |
3297 | 3331 | ||
3298 | debug_text_event(adapter->erp_dbf, 3, "u_access_boxed"); | 3332 | debug_text_event(adapter->erp_dbf, 3, "u_access_boxed"); |
3299 | debug_event(adapter->erp_dbf, 3, &unit->fcp_lun, sizeof(fcp_lun_t)); | 3333 | debug_event(adapter->erp_dbf, 3, &unit->fcp_lun, sizeof(fcp_lun_t)); |
3300 | zfcp_erp_modify_unit_status(unit, | 3334 | zfcp_erp_modify_unit_status(unit, id, ref, |
3301 | ZFCP_STATUS_COMMON_ACCESS_BOXED, | 3335 | ZFCP_STATUS_COMMON_ACCESS_BOXED, ZFCP_SET); |
3302 | ZFCP_SET); | ||
3303 | zfcp_erp_unit_reopen(unit, ZFCP_STATUS_COMMON_ERP_FAILED); | 3336 | zfcp_erp_unit_reopen(unit, ZFCP_STATUS_COMMON_ERP_FAILED); |
3304 | } | 3337 | } |
3305 | 3338 | ||
3306 | void | 3339 | void zfcp_erp_port_access_denied(struct zfcp_port *port, u8 id, u64 ref) |
3307 | zfcp_erp_port_access_denied(struct zfcp_port *port) | ||
3308 | { | 3340 | { |
3309 | struct zfcp_adapter *adapter = port->adapter; | 3341 | struct zfcp_adapter *adapter = port->adapter; |
3310 | unsigned long flags; | 3342 | unsigned long flags; |
@@ -3312,24 +3344,21 @@ zfcp_erp_port_access_denied(struct zfcp_port *port) | |||
3312 | debug_text_event(adapter->erp_dbf, 3, "p_access_denied"); | 3344 | debug_text_event(adapter->erp_dbf, 3, "p_access_denied"); |
3313 | debug_event(adapter->erp_dbf, 3, &port->wwpn, sizeof(wwn_t)); | 3345 | debug_event(adapter->erp_dbf, 3, &port->wwpn, sizeof(wwn_t)); |
3314 | read_lock_irqsave(&zfcp_data.config_lock, flags); | 3346 | read_lock_irqsave(&zfcp_data.config_lock, flags); |
3315 | zfcp_erp_modify_port_status(port, | 3347 | zfcp_erp_modify_port_status(port, id, ref, |
3316 | ZFCP_STATUS_COMMON_ERP_FAILED | | 3348 | ZFCP_STATUS_COMMON_ERP_FAILED | |
3317 | ZFCP_STATUS_COMMON_ACCESS_DENIED, | 3349 | ZFCP_STATUS_COMMON_ACCESS_DENIED, ZFCP_SET); |
3318 | ZFCP_SET); | ||
3319 | read_unlock_irqrestore(&zfcp_data.config_lock, flags); | 3350 | read_unlock_irqrestore(&zfcp_data.config_lock, flags); |
3320 | } | 3351 | } |
3321 | 3352 | ||
3322 | void | 3353 | void zfcp_erp_unit_access_denied(struct zfcp_unit *unit, u8 id, u64 ref) |
3323 | zfcp_erp_unit_access_denied(struct zfcp_unit *unit) | ||
3324 | { | 3354 | { |
3325 | struct zfcp_adapter *adapter = unit->port->adapter; | 3355 | struct zfcp_adapter *adapter = unit->port->adapter; |
3326 | 3356 | ||
3327 | debug_text_event(adapter->erp_dbf, 3, "u_access_denied"); | 3357 | debug_text_event(adapter->erp_dbf, 3, "u_access_denied"); |
3328 | debug_event(adapter->erp_dbf, 3, &unit->fcp_lun, sizeof(fcp_lun_t)); | 3358 | debug_event(adapter->erp_dbf, 3, &unit->fcp_lun, sizeof(fcp_lun_t)); |
3329 | zfcp_erp_modify_unit_status(unit, | 3359 | zfcp_erp_modify_unit_status(unit, id, ref, |
3330 | ZFCP_STATUS_COMMON_ERP_FAILED | | 3360 | ZFCP_STATUS_COMMON_ERP_FAILED | |
3331 | ZFCP_STATUS_COMMON_ACCESS_DENIED, | 3361 | ZFCP_STATUS_COMMON_ACCESS_DENIED, ZFCP_SET); |
3332 | ZFCP_SET); | ||
3333 | } | 3362 | } |
3334 | 3363 | ||
3335 | void | 3364 | void |
diff --git a/drivers/s390/scsi/zfcp_ext.h b/drivers/s390/scsi/zfcp_ext.h index f64951ba98c7..20ad6fde2e22 100644 --- a/drivers/s390/scsi/zfcp_ext.h +++ b/drivers/s390/scsi/zfcp_ext.h | |||
@@ -131,22 +131,23 @@ extern int zfcp_scsi_command_sync(struct zfcp_unit *, struct scsi_cmnd *, int); | |||
131 | extern struct fc_function_template zfcp_transport_functions; | 131 | extern struct fc_function_template zfcp_transport_functions; |
132 | 132 | ||
133 | /******************************** ERP ****************************************/ | 133 | /******************************** ERP ****************************************/ |
134 | extern void zfcp_erp_modify_adapter_status(struct zfcp_adapter *, u32, int); | 134 | extern void zfcp_erp_modify_adapter_status(struct zfcp_adapter *, u8, u64, u32, |
135 | int); | ||
135 | extern int zfcp_erp_adapter_reopen(struct zfcp_adapter *, int); | 136 | extern int zfcp_erp_adapter_reopen(struct zfcp_adapter *, int); |
136 | extern int zfcp_erp_adapter_shutdown(struct zfcp_adapter *, int); | 137 | extern int zfcp_erp_adapter_shutdown(struct zfcp_adapter *, int); |
137 | extern void zfcp_erp_adapter_failed(struct zfcp_adapter *); | 138 | extern void zfcp_erp_adapter_failed(struct zfcp_adapter *, u8, u64); |
138 | 139 | ||
139 | extern void zfcp_erp_modify_port_status(struct zfcp_port *, u32, int); | 140 | extern void zfcp_erp_modify_port_status(struct zfcp_port *, u8, u64, u32, int); |
140 | extern int zfcp_erp_port_reopen(struct zfcp_port *, int); | 141 | extern int zfcp_erp_port_reopen(struct zfcp_port *, int); |
141 | extern int zfcp_erp_port_shutdown(struct zfcp_port *, int); | 142 | extern int zfcp_erp_port_shutdown(struct zfcp_port *, int); |
142 | extern int zfcp_erp_port_forced_reopen(struct zfcp_port *, int); | 143 | extern int zfcp_erp_port_forced_reopen(struct zfcp_port *, int); |
143 | extern void zfcp_erp_port_failed(struct zfcp_port *); | 144 | extern void zfcp_erp_port_failed(struct zfcp_port *, u8, u64); |
144 | extern int zfcp_erp_port_reopen_all(struct zfcp_adapter *, int); | 145 | extern int zfcp_erp_port_reopen_all(struct zfcp_adapter *, int); |
145 | 146 | ||
146 | extern void zfcp_erp_modify_unit_status(struct zfcp_unit *, u32, int); | 147 | extern void zfcp_erp_modify_unit_status(struct zfcp_unit *, u8, u64, u32, int); |
147 | extern int zfcp_erp_unit_reopen(struct zfcp_unit *, int); | 148 | extern int zfcp_erp_unit_reopen(struct zfcp_unit *, int); |
148 | extern int zfcp_erp_unit_shutdown(struct zfcp_unit *, int); | 149 | extern int zfcp_erp_unit_shutdown(struct zfcp_unit *, int); |
149 | extern void zfcp_erp_unit_failed(struct zfcp_unit *); | 150 | extern void zfcp_erp_unit_failed(struct zfcp_unit *, u8, u64); |
150 | 151 | ||
151 | extern int zfcp_erp_thread_setup(struct zfcp_adapter *); | 152 | extern int zfcp_erp_thread_setup(struct zfcp_adapter *); |
152 | extern int zfcp_erp_thread_kill(struct zfcp_adapter *); | 153 | extern int zfcp_erp_thread_kill(struct zfcp_adapter *); |
@@ -155,10 +156,10 @@ extern void zfcp_erp_async_handler(struct zfcp_erp_action *, unsigned long); | |||
155 | 156 | ||
156 | extern int zfcp_test_link(struct zfcp_port *); | 157 | extern int zfcp_test_link(struct zfcp_port *); |
157 | 158 | ||
158 | extern void zfcp_erp_port_boxed(struct zfcp_port *); | 159 | extern void zfcp_erp_port_boxed(struct zfcp_port *, u8 id, u64 ref); |
159 | extern void zfcp_erp_unit_boxed(struct zfcp_unit *); | 160 | extern void zfcp_erp_unit_boxed(struct zfcp_unit *, u8 id, u64 ref); |
160 | extern void zfcp_erp_port_access_denied(struct zfcp_port *); | 161 | extern void zfcp_erp_port_access_denied(struct zfcp_port *, u8 id, u64 ref); |
161 | extern void zfcp_erp_unit_access_denied(struct zfcp_unit *); | 162 | extern void zfcp_erp_unit_access_denied(struct zfcp_unit *, u8 id, u64 ref); |
162 | extern void zfcp_erp_adapter_access_changed(struct zfcp_adapter *); | 163 | extern void zfcp_erp_adapter_access_changed(struct zfcp_adapter *); |
163 | extern void zfcp_erp_port_access_changed(struct zfcp_port *); | 164 | extern void zfcp_erp_port_access_changed(struct zfcp_port *); |
164 | extern void zfcp_erp_unit_access_changed(struct zfcp_unit *); | 165 | extern void zfcp_erp_unit_access_changed(struct zfcp_unit *); |
@@ -166,6 +167,9 @@ extern void zfcp_erp_unit_access_changed(struct zfcp_unit *); | |||
166 | /******************************** AUX ****************************************/ | 167 | /******************************** AUX ****************************************/ |
167 | extern void zfcp_rec_dbf_event_thread(u8 id, struct zfcp_adapter *adapter, | 168 | extern void zfcp_rec_dbf_event_thread(u8 id, struct zfcp_adapter *adapter, |
168 | int lock); | 169 | int lock); |
170 | extern void zfcp_rec_dbf_event_adapter(u8 id, u64 ref, struct zfcp_adapter *); | ||
171 | extern void zfcp_rec_dbf_event_port(u8 id, u64 ref, struct zfcp_port *port); | ||
172 | extern void zfcp_rec_dbf_event_unit(u8 id, u64 ref, struct zfcp_unit *unit); | ||
169 | 173 | ||
170 | extern void zfcp_hba_dbf_event_fsf_response(struct zfcp_fsf_req *); | 174 | extern void zfcp_hba_dbf_event_fsf_response(struct zfcp_fsf_req *); |
171 | extern void zfcp_hba_dbf_event_fsf_unsol(const char *, struct zfcp_adapter *, | 175 | extern void zfcp_hba_dbf_event_fsf_unsol(const char *, struct zfcp_adapter *, |
diff --git a/drivers/s390/scsi/zfcp_fsf.c b/drivers/s390/scsi/zfcp_fsf.c index 264f5f1bdde6..2b7ddb78767c 100644 --- a/drivers/s390/scsi/zfcp_fsf.c +++ b/drivers/s390/scsi/zfcp_fsf.c | |||
@@ -46,7 +46,7 @@ static int zfcp_fsf_req_send(struct zfcp_fsf_req *); | |||
46 | static int zfcp_fsf_protstatus_eval(struct zfcp_fsf_req *); | 46 | static int zfcp_fsf_protstatus_eval(struct zfcp_fsf_req *); |
47 | static int zfcp_fsf_fsfstatus_eval(struct zfcp_fsf_req *); | 47 | static int zfcp_fsf_fsfstatus_eval(struct zfcp_fsf_req *); |
48 | static int zfcp_fsf_fsfstatus_qual_eval(struct zfcp_fsf_req *); | 48 | static int zfcp_fsf_fsfstatus_qual_eval(struct zfcp_fsf_req *); |
49 | static void zfcp_fsf_link_down_info_eval(struct zfcp_adapter *, | 49 | static void zfcp_fsf_link_down_info_eval(struct zfcp_fsf_req *, u8, |
50 | struct fsf_link_down_info *); | 50 | struct fsf_link_down_info *); |
51 | static int zfcp_fsf_req_dispatch(struct zfcp_fsf_req *); | 51 | static int zfcp_fsf_req_dispatch(struct zfcp_fsf_req *); |
52 | 52 | ||
@@ -342,7 +342,7 @@ zfcp_fsf_protstatus_eval(struct zfcp_fsf_req *fsf_req) | |||
342 | break; | 342 | break; |
343 | 343 | ||
344 | case FSF_PROT_LINK_DOWN: | 344 | case FSF_PROT_LINK_DOWN: |
345 | zfcp_fsf_link_down_info_eval(adapter, | 345 | zfcp_fsf_link_down_info_eval(fsf_req, 37, |
346 | &prot_status_qual->link_down_info); | 346 | &prot_status_qual->link_down_info); |
347 | zfcp_erp_adapter_reopen(adapter, 0); | 347 | zfcp_erp_adapter_reopen(adapter, 0); |
348 | fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR; | 348 | fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR; |
@@ -354,8 +354,8 @@ zfcp_fsf_protstatus_eval(struct zfcp_fsf_req *fsf_req) | |||
354 | "Re-starting operations on this adapter.\n", | 354 | "Re-starting operations on this adapter.\n", |
355 | zfcp_get_busid_by_adapter(adapter)); | 355 | zfcp_get_busid_by_adapter(adapter)); |
356 | /* All ports should be marked as ready to run again */ | 356 | /* All ports should be marked as ready to run again */ |
357 | zfcp_erp_modify_adapter_status(adapter, | 357 | zfcp_erp_modify_adapter_status(adapter, 28, |
358 | ZFCP_STATUS_COMMON_RUNNING, | 358 | 0, ZFCP_STATUS_COMMON_RUNNING, |
359 | ZFCP_SET); | 359 | ZFCP_SET); |
360 | zfcp_erp_adapter_reopen(adapter, | 360 | zfcp_erp_adapter_reopen(adapter, |
361 | ZFCP_STATUS_ADAPTER_LINK_UNPLUGGED | 361 | ZFCP_STATUS_ADAPTER_LINK_UNPLUGGED |
@@ -506,9 +506,11 @@ zfcp_fsf_fsfstatus_qual_eval(struct zfcp_fsf_req *fsf_req) | |||
506 | * zfcp_fsf_link_down_info_eval - evaluate link down information block | 506 | * zfcp_fsf_link_down_info_eval - evaluate link down information block |
507 | */ | 507 | */ |
508 | static void | 508 | static void |
509 | zfcp_fsf_link_down_info_eval(struct zfcp_adapter *adapter, | 509 | zfcp_fsf_link_down_info_eval(struct zfcp_fsf_req *fsf_req, u8 id, |
510 | struct fsf_link_down_info *link_down) | 510 | struct fsf_link_down_info *link_down) |
511 | { | 511 | { |
512 | struct zfcp_adapter *adapter = fsf_req->adapter; | ||
513 | |||
512 | if (atomic_test_mask(ZFCP_STATUS_ADAPTER_LINK_UNPLUGGED, | 514 | if (atomic_test_mask(ZFCP_STATUS_ADAPTER_LINK_UNPLUGGED, |
513 | &adapter->status)) | 515 | &adapter->status)) |
514 | return; | 516 | return; |
@@ -599,7 +601,7 @@ zfcp_fsf_link_down_info_eval(struct zfcp_adapter *adapter, | |||
599 | link_down->vendor_specific_code); | 601 | link_down->vendor_specific_code); |
600 | 602 | ||
601 | out: | 603 | out: |
602 | zfcp_erp_adapter_failed(adapter); | 604 | zfcp_erp_adapter_failed(adapter, id, (u64)fsf_req); |
603 | } | 605 | } |
604 | 606 | ||
605 | /* | 607 | /* |
@@ -897,7 +899,7 @@ zfcp_fsf_status_read_handler(struct zfcp_fsf_req *fsf_req) | |||
897 | case FSF_STATUS_READ_SUB_NO_PHYSICAL_LINK: | 899 | case FSF_STATUS_READ_SUB_NO_PHYSICAL_LINK: |
898 | ZFCP_LOG_INFO("Physical link to adapter %s is down\n", | 900 | ZFCP_LOG_INFO("Physical link to adapter %s is down\n", |
899 | zfcp_get_busid_by_adapter(adapter)); | 901 | zfcp_get_busid_by_adapter(adapter)); |
900 | zfcp_fsf_link_down_info_eval(adapter, | 902 | zfcp_fsf_link_down_info_eval(fsf_req, 38, |
901 | (struct fsf_link_down_info *) | 903 | (struct fsf_link_down_info *) |
902 | &status_buffer->payload); | 904 | &status_buffer->payload); |
903 | break; | 905 | break; |
@@ -905,7 +907,7 @@ zfcp_fsf_status_read_handler(struct zfcp_fsf_req *fsf_req) | |||
905 | ZFCP_LOG_INFO("Local link to adapter %s is down " | 907 | ZFCP_LOG_INFO("Local link to adapter %s is down " |
906 | "due to failed FDISC login\n", | 908 | "due to failed FDISC login\n", |
907 | zfcp_get_busid_by_adapter(adapter)); | 909 | zfcp_get_busid_by_adapter(adapter)); |
908 | zfcp_fsf_link_down_info_eval(adapter, | 910 | zfcp_fsf_link_down_info_eval(fsf_req, 39, |
909 | (struct fsf_link_down_info *) | 911 | (struct fsf_link_down_info *) |
910 | &status_buffer->payload); | 912 | &status_buffer->payload); |
911 | break; | 913 | break; |
@@ -913,13 +915,13 @@ zfcp_fsf_status_read_handler(struct zfcp_fsf_req *fsf_req) | |||
913 | ZFCP_LOG_INFO("Local link to adapter %s is down " | 915 | ZFCP_LOG_INFO("Local link to adapter %s is down " |
914 | "due to firmware update on adapter\n", | 916 | "due to firmware update on adapter\n", |
915 | zfcp_get_busid_by_adapter(adapter)); | 917 | zfcp_get_busid_by_adapter(adapter)); |
916 | zfcp_fsf_link_down_info_eval(adapter, NULL); | 918 | zfcp_fsf_link_down_info_eval(fsf_req, 40, NULL); |
917 | break; | 919 | break; |
918 | default: | 920 | default: |
919 | ZFCP_LOG_INFO("Local link to adapter %s is down " | 921 | ZFCP_LOG_INFO("Local link to adapter %s is down " |
920 | "due to unknown reason\n", | 922 | "due to unknown reason\n", |
921 | zfcp_get_busid_by_adapter(adapter)); | 923 | zfcp_get_busid_by_adapter(adapter)); |
922 | zfcp_fsf_link_down_info_eval(adapter, NULL); | 924 | zfcp_fsf_link_down_info_eval(fsf_req, 41, NULL); |
923 | }; | 925 | }; |
924 | break; | 926 | break; |
925 | 927 | ||
@@ -928,7 +930,7 @@ zfcp_fsf_status_read_handler(struct zfcp_fsf_req *fsf_req) | |||
928 | "Restarting operations on this adapter\n", | 930 | "Restarting operations on this adapter\n", |
929 | zfcp_get_busid_by_adapter(adapter)); | 931 | zfcp_get_busid_by_adapter(adapter)); |
930 | /* All ports should be marked as ready to run again */ | 932 | /* All ports should be marked as ready to run again */ |
931 | zfcp_erp_modify_adapter_status(adapter, | 933 | zfcp_erp_modify_adapter_status(adapter, 30, 0, |
932 | ZFCP_STATUS_COMMON_RUNNING, | 934 | ZFCP_STATUS_COMMON_RUNNING, |
933 | ZFCP_SET); | 935 | ZFCP_SET); |
934 | zfcp_erp_adapter_reopen(adapter, | 936 | zfcp_erp_adapter_reopen(adapter, |
@@ -1215,7 +1217,7 @@ zfcp_fsf_abort_fcp_command_handler(struct zfcp_fsf_req *new_fsf_req) | |||
1215 | zfcp_get_busid_by_unit(unit)); | 1217 | zfcp_get_busid_by_unit(unit)); |
1216 | debug_text_event(new_fsf_req->adapter->erp_dbf, 2, | 1218 | debug_text_event(new_fsf_req->adapter->erp_dbf, 2, |
1217 | "fsf_s_pboxed"); | 1219 | "fsf_s_pboxed"); |
1218 | zfcp_erp_port_boxed(unit->port); | 1220 | zfcp_erp_port_boxed(unit->port, 47, (u64)new_fsf_req); |
1219 | new_fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR | 1221 | new_fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR |
1220 | | ZFCP_STATUS_FSFREQ_RETRY; | 1222 | | ZFCP_STATUS_FSFREQ_RETRY; |
1221 | break; | 1223 | break; |
@@ -1227,7 +1229,7 @@ zfcp_fsf_abort_fcp_command_handler(struct zfcp_fsf_req *new_fsf_req) | |||
1227 | unit->fcp_lun, unit->port->wwpn, | 1229 | unit->fcp_lun, unit->port->wwpn, |
1228 | zfcp_get_busid_by_unit(unit)); | 1230 | zfcp_get_busid_by_unit(unit)); |
1229 | debug_text_event(new_fsf_req->adapter->erp_dbf, 1, "fsf_s_lboxed"); | 1231 | debug_text_event(new_fsf_req->adapter->erp_dbf, 1, "fsf_s_lboxed"); |
1230 | zfcp_erp_unit_boxed(unit); | 1232 | zfcp_erp_unit_boxed(unit, 48, (u64)new_fsf_req); |
1231 | new_fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR | 1233 | new_fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR |
1232 | | ZFCP_STATUS_FSFREQ_RETRY; | 1234 | | ZFCP_STATUS_FSFREQ_RETRY; |
1233 | break; | 1235 | break; |
@@ -1519,7 +1521,7 @@ zfcp_fsf_send_ct_handler(struct zfcp_fsf_req *fsf_req) | |||
1519 | } | 1521 | } |
1520 | } | 1522 | } |
1521 | debug_text_event(adapter->erp_dbf, 1, "fsf_s_access"); | 1523 | debug_text_event(adapter->erp_dbf, 1, "fsf_s_access"); |
1522 | zfcp_erp_port_access_denied(port); | 1524 | zfcp_erp_port_access_denied(port, 55, (u64)fsf_req); |
1523 | fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR; | 1525 | fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR; |
1524 | break; | 1526 | break; |
1525 | 1527 | ||
@@ -1554,7 +1556,7 @@ zfcp_fsf_send_ct_handler(struct zfcp_fsf_req *fsf_req) | |||
1554 | "(adapter %s, port d_id=0x%06x)\n", | 1556 | "(adapter %s, port d_id=0x%06x)\n", |
1555 | zfcp_get_busid_by_port(port), port->d_id); | 1557 | zfcp_get_busid_by_port(port), port->d_id); |
1556 | debug_text_event(adapter->erp_dbf, 2, "fsf_s_pboxed"); | 1558 | debug_text_event(adapter->erp_dbf, 2, "fsf_s_pboxed"); |
1557 | zfcp_erp_port_boxed(port); | 1559 | zfcp_erp_port_boxed(port, 49, (u64)fsf_req); |
1558 | fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR | 1560 | fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR |
1559 | | ZFCP_STATUS_FSFREQ_RETRY; | 1561 | | ZFCP_STATUS_FSFREQ_RETRY; |
1560 | break; | 1562 | break; |
@@ -1880,7 +1882,7 @@ static int zfcp_fsf_send_els_handler(struct zfcp_fsf_req *fsf_req) | |||
1880 | } | 1882 | } |
1881 | debug_text_event(adapter->erp_dbf, 1, "fsf_s_access"); | 1883 | debug_text_event(adapter->erp_dbf, 1, "fsf_s_access"); |
1882 | if (port != NULL) | 1884 | if (port != NULL) |
1883 | zfcp_erp_port_access_denied(port); | 1885 | zfcp_erp_port_access_denied(port, 56, (u64)fsf_req); |
1884 | fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR; | 1886 | fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR; |
1885 | break; | 1887 | break; |
1886 | 1888 | ||
@@ -2210,7 +2212,7 @@ zfcp_fsf_exchange_config_data_handler(struct zfcp_fsf_req *fsf_req) | |||
2210 | atomic_set_mask(ZFCP_STATUS_ADAPTER_XCONFIG_OK, | 2212 | atomic_set_mask(ZFCP_STATUS_ADAPTER_XCONFIG_OK, |
2211 | &adapter->status); | 2213 | &adapter->status); |
2212 | 2214 | ||
2213 | zfcp_fsf_link_down_info_eval(adapter, | 2215 | zfcp_fsf_link_down_info_eval(fsf_req, 42, |
2214 | &qtcb->header.fsf_status_qual.link_down_info); | 2216 | &qtcb->header.fsf_status_qual.link_down_info); |
2215 | break; | 2217 | break; |
2216 | default: | 2218 | default: |
@@ -2393,7 +2395,7 @@ zfcp_fsf_exchange_port_data_handler(struct zfcp_fsf_req *fsf_req) | |||
2393 | case FSF_EXCHANGE_CONFIG_DATA_INCOMPLETE: | 2395 | case FSF_EXCHANGE_CONFIG_DATA_INCOMPLETE: |
2394 | zfcp_fsf_exchange_port_evaluate(fsf_req, 0); | 2396 | zfcp_fsf_exchange_port_evaluate(fsf_req, 0); |
2395 | atomic_set_mask(ZFCP_STATUS_ADAPTER_XPORT_OK, &adapter->status); | 2397 | atomic_set_mask(ZFCP_STATUS_ADAPTER_XPORT_OK, &adapter->status); |
2396 | zfcp_fsf_link_down_info_eval(adapter, | 2398 | zfcp_fsf_link_down_info_eval(fsf_req, 43, |
2397 | &qtcb->header.fsf_status_qual.link_down_info); | 2399 | &qtcb->header.fsf_status_qual.link_down_info); |
2398 | break; | 2400 | break; |
2399 | default: | 2401 | default: |
@@ -2523,7 +2525,7 @@ zfcp_fsf_open_port_handler(struct zfcp_fsf_req *fsf_req) | |||
2523 | } | 2525 | } |
2524 | } | 2526 | } |
2525 | debug_text_event(fsf_req->adapter->erp_dbf, 1, "fsf_s_access"); | 2527 | debug_text_event(fsf_req->adapter->erp_dbf, 1, "fsf_s_access"); |
2526 | zfcp_erp_port_access_denied(port); | 2528 | zfcp_erp_port_access_denied(port, 57, (u64)fsf_req); |
2527 | fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR; | 2529 | fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR; |
2528 | break; | 2530 | break; |
2529 | 2531 | ||
@@ -2534,7 +2536,7 @@ zfcp_fsf_open_port_handler(struct zfcp_fsf_req *fsf_req) | |||
2534 | port->wwpn, zfcp_get_busid_by_port(port)); | 2536 | port->wwpn, zfcp_get_busid_by_port(port)); |
2535 | debug_text_event(fsf_req->adapter->erp_dbf, 1, | 2537 | debug_text_event(fsf_req->adapter->erp_dbf, 1, |
2536 | "fsf_s_max_ports"); | 2538 | "fsf_s_max_ports"); |
2537 | zfcp_erp_port_failed(port); | 2539 | zfcp_erp_port_failed(port, 31, (u64)fsf_req); |
2538 | fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR; | 2540 | fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR; |
2539 | break; | 2541 | break; |
2540 | 2542 | ||
@@ -2560,7 +2562,7 @@ zfcp_fsf_open_port_handler(struct zfcp_fsf_req *fsf_req) | |||
2560 | zfcp_get_busid_by_port(port)); | 2562 | zfcp_get_busid_by_port(port)); |
2561 | debug_text_exception(fsf_req->adapter->erp_dbf, 0, | 2563 | debug_text_exception(fsf_req->adapter->erp_dbf, 0, |
2562 | "fsf_sq_no_retry"); | 2564 | "fsf_sq_no_retry"); |
2563 | zfcp_erp_port_failed(port); | 2565 | zfcp_erp_port_failed(port, 32, (u64)fsf_req); |
2564 | fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR; | 2566 | fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR; |
2565 | break; | 2567 | break; |
2566 | default: | 2568 | default: |
@@ -2773,7 +2775,7 @@ zfcp_fsf_close_port_handler(struct zfcp_fsf_req *fsf_req) | |||
2773 | ZFCP_LOG_TRACE("remote port 0x016%Lx on adapter %s closed, " | 2775 | ZFCP_LOG_TRACE("remote port 0x016%Lx on adapter %s closed, " |
2774 | "port handle 0x%x\n", port->wwpn, | 2776 | "port handle 0x%x\n", port->wwpn, |
2775 | zfcp_get_busid_by_port(port), port->handle); | 2777 | zfcp_get_busid_by_port(port), port->handle); |
2776 | zfcp_erp_modify_port_status(port, | 2778 | zfcp_erp_modify_port_status(port, 33, (u64)fsf_req, |
2777 | ZFCP_STATUS_COMMON_OPEN, | 2779 | ZFCP_STATUS_COMMON_OPEN, |
2778 | ZFCP_CLEAR); | 2780 | ZFCP_CLEAR); |
2779 | retval = 0; | 2781 | retval = 0; |
@@ -2923,7 +2925,7 @@ zfcp_fsf_close_physical_port_handler(struct zfcp_fsf_req *fsf_req) | |||
2923 | } | 2925 | } |
2924 | } | 2926 | } |
2925 | debug_text_event(fsf_req->adapter->erp_dbf, 1, "fsf_s_access"); | 2927 | debug_text_event(fsf_req->adapter->erp_dbf, 1, "fsf_s_access"); |
2926 | zfcp_erp_port_access_denied(port); | 2928 | zfcp_erp_port_access_denied(port, 58, (u64)fsf_req); |
2927 | fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR; | 2929 | fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR; |
2928 | break; | 2930 | break; |
2929 | 2931 | ||
@@ -2934,7 +2936,7 @@ zfcp_fsf_close_physical_port_handler(struct zfcp_fsf_req *fsf_req) | |||
2934 | port->wwpn, | 2936 | port->wwpn, |
2935 | zfcp_get_busid_by_port(port)); | 2937 | zfcp_get_busid_by_port(port)); |
2936 | debug_text_event(fsf_req->adapter->erp_dbf, 1, "fsf_s_pboxed"); | 2938 | debug_text_event(fsf_req->adapter->erp_dbf, 1, "fsf_s_pboxed"); |
2937 | zfcp_erp_port_boxed(port); | 2939 | zfcp_erp_port_boxed(port, 50, (u64)fsf_req); |
2938 | fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR | | 2940 | fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR | |
2939 | ZFCP_STATUS_FSFREQ_RETRY; | 2941 | ZFCP_STATUS_FSFREQ_RETRY; |
2940 | 2942 | ||
@@ -3159,7 +3161,7 @@ zfcp_fsf_open_unit_handler(struct zfcp_fsf_req *fsf_req) | |||
3159 | } | 3161 | } |
3160 | } | 3162 | } |
3161 | debug_text_event(adapter->erp_dbf, 1, "fsf_s_access"); | 3163 | debug_text_event(adapter->erp_dbf, 1, "fsf_s_access"); |
3162 | zfcp_erp_unit_access_denied(unit); | 3164 | zfcp_erp_unit_access_denied(unit, 59, (u64)fsf_req); |
3163 | atomic_clear_mask(ZFCP_STATUS_UNIT_SHARED, &unit->status); | 3165 | atomic_clear_mask(ZFCP_STATUS_UNIT_SHARED, &unit->status); |
3164 | atomic_clear_mask(ZFCP_STATUS_UNIT_READONLY, &unit->status); | 3166 | atomic_clear_mask(ZFCP_STATUS_UNIT_READONLY, &unit->status); |
3165 | fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR; | 3167 | fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR; |
@@ -3170,7 +3172,7 @@ zfcp_fsf_open_unit_handler(struct zfcp_fsf_req *fsf_req) | |||
3170 | "needs to be reopened\n", | 3172 | "needs to be reopened\n", |
3171 | unit->port->wwpn, zfcp_get_busid_by_unit(unit)); | 3173 | unit->port->wwpn, zfcp_get_busid_by_unit(unit)); |
3172 | debug_text_event(adapter->erp_dbf, 2, "fsf_s_pboxed"); | 3174 | debug_text_event(adapter->erp_dbf, 2, "fsf_s_pboxed"); |
3173 | zfcp_erp_port_boxed(unit->port); | 3175 | zfcp_erp_port_boxed(unit->port, 51, (u64)fsf_req); |
3174 | fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR | | 3176 | fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR | |
3175 | ZFCP_STATUS_FSFREQ_RETRY; | 3177 | ZFCP_STATUS_FSFREQ_RETRY; |
3176 | break; | 3178 | break; |
@@ -3212,7 +3214,7 @@ zfcp_fsf_open_unit_handler(struct zfcp_fsf_req *fsf_req) | |||
3212 | sizeof (union fsf_status_qual)); | 3214 | sizeof (union fsf_status_qual)); |
3213 | debug_text_event(adapter->erp_dbf, 2, | 3215 | debug_text_event(adapter->erp_dbf, 2, |
3214 | "fsf_s_l_sh_vio"); | 3216 | "fsf_s_l_sh_vio"); |
3215 | zfcp_erp_unit_access_denied(unit); | 3217 | zfcp_erp_unit_access_denied(unit, 60, (u64)fsf_req); |
3216 | atomic_clear_mask(ZFCP_STATUS_UNIT_SHARED, &unit->status); | 3218 | atomic_clear_mask(ZFCP_STATUS_UNIT_SHARED, &unit->status); |
3217 | atomic_clear_mask(ZFCP_STATUS_UNIT_READONLY, &unit->status); | 3219 | atomic_clear_mask(ZFCP_STATUS_UNIT_READONLY, &unit->status); |
3218 | fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR; | 3220 | fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR; |
@@ -3228,7 +3230,7 @@ zfcp_fsf_open_unit_handler(struct zfcp_fsf_req *fsf_req) | |||
3228 | zfcp_get_busid_by_unit(unit)); | 3230 | zfcp_get_busid_by_unit(unit)); |
3229 | debug_text_event(adapter->erp_dbf, 1, | 3231 | debug_text_event(adapter->erp_dbf, 1, |
3230 | "fsf_s_max_units"); | 3232 | "fsf_s_max_units"); |
3231 | zfcp_erp_unit_failed(unit); | 3233 | zfcp_erp_unit_failed(unit, 34, (u64)fsf_req); |
3232 | fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR; | 3234 | fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR; |
3233 | break; | 3235 | break; |
3234 | 3236 | ||
@@ -3307,13 +3309,13 @@ zfcp_fsf_open_unit_handler(struct zfcp_fsf_req *fsf_req) | |||
3307 | if (exclusive && !readwrite) { | 3309 | if (exclusive && !readwrite) { |
3308 | ZFCP_LOG_NORMAL("exclusive access of read-only " | 3310 | ZFCP_LOG_NORMAL("exclusive access of read-only " |
3309 | "unit not supported\n"); | 3311 | "unit not supported\n"); |
3310 | zfcp_erp_unit_failed(unit); | 3312 | zfcp_erp_unit_failed(unit, 35, (u64)fsf_req); |
3311 | fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR; | 3313 | fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR; |
3312 | zfcp_erp_unit_shutdown(unit, 0); | 3314 | zfcp_erp_unit_shutdown(unit, 0); |
3313 | } else if (!exclusive && readwrite) { | 3315 | } else if (!exclusive && readwrite) { |
3314 | ZFCP_LOG_NORMAL("shared access of read-write " | 3316 | ZFCP_LOG_NORMAL("shared access of read-write " |
3315 | "unit not supported\n"); | 3317 | "unit not supported\n"); |
3316 | zfcp_erp_unit_failed(unit); | 3318 | zfcp_erp_unit_failed(unit, 36, (u64)fsf_req); |
3317 | fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR; | 3319 | fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR; |
3318 | zfcp_erp_unit_shutdown(unit, 0); | 3320 | zfcp_erp_unit_shutdown(unit, 0); |
3319 | } | 3321 | } |
@@ -3471,7 +3473,7 @@ zfcp_fsf_close_unit_handler(struct zfcp_fsf_req *fsf_req) | |||
3471 | unit->port->wwpn, | 3473 | unit->port->wwpn, |
3472 | zfcp_get_busid_by_unit(unit)); | 3474 | zfcp_get_busid_by_unit(unit)); |
3473 | debug_text_event(fsf_req->adapter->erp_dbf, 2, "fsf_s_pboxed"); | 3475 | debug_text_event(fsf_req->adapter->erp_dbf, 2, "fsf_s_pboxed"); |
3474 | zfcp_erp_port_boxed(unit->port); | 3476 | zfcp_erp_port_boxed(unit->port, 52, (u64)fsf_req); |
3475 | fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR | | 3477 | fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR | |
3476 | ZFCP_STATUS_FSFREQ_RETRY; | 3478 | ZFCP_STATUS_FSFREQ_RETRY; |
3477 | break; | 3479 | break; |
@@ -3928,7 +3930,7 @@ zfcp_fsf_send_fcp_command_handler(struct zfcp_fsf_req *fsf_req) | |||
3928 | } | 3930 | } |
3929 | } | 3931 | } |
3930 | debug_text_event(fsf_req->adapter->erp_dbf, 1, "fsf_s_access"); | 3932 | debug_text_event(fsf_req->adapter->erp_dbf, 1, "fsf_s_access"); |
3931 | zfcp_erp_unit_access_denied(unit); | 3933 | zfcp_erp_unit_access_denied(unit, 61, (u64)fsf_req); |
3932 | fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR; | 3934 | fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR; |
3933 | break; | 3935 | break; |
3934 | 3936 | ||
@@ -3967,7 +3969,7 @@ zfcp_fsf_send_fcp_command_handler(struct zfcp_fsf_req *fsf_req) | |||
3967 | "needs to be reopened\n", | 3969 | "needs to be reopened\n", |
3968 | unit->port->wwpn, zfcp_get_busid_by_unit(unit)); | 3970 | unit->port->wwpn, zfcp_get_busid_by_unit(unit)); |
3969 | debug_text_event(fsf_req->adapter->erp_dbf, 2, "fsf_s_pboxed"); | 3971 | debug_text_event(fsf_req->adapter->erp_dbf, 2, "fsf_s_pboxed"); |
3970 | zfcp_erp_port_boxed(unit->port); | 3972 | zfcp_erp_port_boxed(unit->port, 53, (u64)fsf_req); |
3971 | fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR | | 3973 | fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR | |
3972 | ZFCP_STATUS_FSFREQ_RETRY; | 3974 | ZFCP_STATUS_FSFREQ_RETRY; |
3973 | break; | 3975 | break; |
@@ -3978,7 +3980,7 @@ zfcp_fsf_send_fcp_command_handler(struct zfcp_fsf_req *fsf_req) | |||
3978 | zfcp_get_busid_by_unit(unit), | 3980 | zfcp_get_busid_by_unit(unit), |
3979 | unit->port->wwpn, unit->fcp_lun); | 3981 | unit->port->wwpn, unit->fcp_lun); |
3980 | debug_text_event(fsf_req->adapter->erp_dbf, 1, "fsf_s_lboxed"); | 3982 | debug_text_event(fsf_req->adapter->erp_dbf, 1, "fsf_s_lboxed"); |
3981 | zfcp_erp_unit_boxed(unit); | 3983 | zfcp_erp_unit_boxed(unit, 54, (u64)fsf_req); |
3982 | fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR | 3984 | fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR |
3983 | | ZFCP_STATUS_FSFREQ_RETRY; | 3985 | | ZFCP_STATUS_FSFREQ_RETRY; |
3984 | break; | 3986 | break; |
diff --git a/drivers/s390/scsi/zfcp_scsi.c b/drivers/s390/scsi/zfcp_scsi.c index ff97a61ad964..1198f0b27e3a 100644 --- a/drivers/s390/scsi/zfcp_scsi.c +++ b/drivers/s390/scsi/zfcp_scsi.c | |||
@@ -185,7 +185,7 @@ static void zfcp_scsi_slave_destroy(struct scsi_device *sdpnt) | |||
185 | atomic_clear_mask(ZFCP_STATUS_UNIT_REGISTERED, &unit->status); | 185 | atomic_clear_mask(ZFCP_STATUS_UNIT_REGISTERED, &unit->status); |
186 | sdpnt->hostdata = NULL; | 186 | sdpnt->hostdata = NULL; |
187 | unit->device = NULL; | 187 | unit->device = NULL; |
188 | zfcp_erp_unit_failed(unit); | 188 | zfcp_erp_unit_failed(unit, 12, 0); |
189 | zfcp_unit_put(unit); | 189 | zfcp_unit_put(unit); |
190 | } else | 190 | } else |
191 | ZFCP_LOG_NORMAL("bug: no unit associated with SCSI device at " | 191 | ZFCP_LOG_NORMAL("bug: no unit associated with SCSI device at " |
diff --git a/drivers/s390/scsi/zfcp_sysfs_adapter.c b/drivers/s390/scsi/zfcp_sysfs_adapter.c index 705c6d4428f3..ec340530c824 100644 --- a/drivers/s390/scsi/zfcp_sysfs_adapter.c +++ b/drivers/s390/scsi/zfcp_sysfs_adapter.c | |||
@@ -191,8 +191,8 @@ zfcp_sysfs_adapter_failed_store(struct device *dev, struct device_attribute *att | |||
191 | goto out; | 191 | goto out; |
192 | } | 192 | } |
193 | 193 | ||
194 | zfcp_erp_modify_adapter_status(adapter, ZFCP_STATUS_COMMON_RUNNING, | 194 | zfcp_erp_modify_adapter_status(adapter, 44, 0, |
195 | ZFCP_SET); | 195 | ZFCP_STATUS_COMMON_RUNNING, ZFCP_SET); |
196 | zfcp_erp_adapter_reopen(adapter, ZFCP_STATUS_COMMON_ERP_FAILED); | 196 | zfcp_erp_adapter_reopen(adapter, ZFCP_STATUS_COMMON_ERP_FAILED); |
197 | zfcp_erp_wait(adapter); | 197 | zfcp_erp_wait(adapter); |
198 | out: | 198 | out: |
diff --git a/drivers/s390/scsi/zfcp_sysfs_port.c b/drivers/s390/scsi/zfcp_sysfs_port.c index 1320c0591431..9cc2bc5be724 100644 --- a/drivers/s390/scsi/zfcp_sysfs_port.c +++ b/drivers/s390/scsi/zfcp_sysfs_port.c | |||
@@ -193,7 +193,8 @@ zfcp_sysfs_port_failed_store(struct device *dev, struct device_attribute *attr, | |||
193 | goto out; | 193 | goto out; |
194 | } | 194 | } |
195 | 195 | ||
196 | zfcp_erp_modify_port_status(port, ZFCP_STATUS_COMMON_RUNNING, ZFCP_SET); | 196 | zfcp_erp_modify_port_status(port, 45, 0, |
197 | ZFCP_STATUS_COMMON_RUNNING, ZFCP_SET); | ||
197 | zfcp_erp_port_reopen(port, ZFCP_STATUS_COMMON_ERP_FAILED); | 198 | zfcp_erp_port_reopen(port, ZFCP_STATUS_COMMON_ERP_FAILED); |
198 | zfcp_erp_wait(port->adapter); | 199 | zfcp_erp_wait(port->adapter); |
199 | out: | 200 | out: |
diff --git a/drivers/s390/scsi/zfcp_sysfs_unit.c b/drivers/s390/scsi/zfcp_sysfs_unit.c index 63f75ee95c33..52a5f6a25ff9 100644 --- a/drivers/s390/scsi/zfcp_sysfs_unit.c +++ b/drivers/s390/scsi/zfcp_sysfs_unit.c | |||
@@ -94,7 +94,8 @@ zfcp_sysfs_unit_failed_store(struct device *dev, struct device_attribute *attr, | |||
94 | goto out; | 94 | goto out; |
95 | } | 95 | } |
96 | 96 | ||
97 | zfcp_erp_modify_unit_status(unit, ZFCP_STATUS_COMMON_RUNNING, ZFCP_SET); | 97 | zfcp_erp_modify_unit_status(unit, 46, 0, |
98 | ZFCP_STATUS_COMMON_RUNNING, ZFCP_SET); | ||
98 | zfcp_erp_unit_reopen(unit, ZFCP_STATUS_COMMON_ERP_FAILED); | 99 | zfcp_erp_unit_reopen(unit, ZFCP_STATUS_COMMON_ERP_FAILED); |
99 | zfcp_erp_wait(unit->port->adapter); | 100 | zfcp_erp_wait(unit->port->adapter); |
100 | out: | 101 | out: |