From: Hans-Joachim Picht <hpicht@redhat.com> Date: Wed, 9 Apr 2008 12:46:37 +0200 Subject: [s390] zfcp: Enhanced Trace Facility Message-id: 20080409104637.GC11855@redhat.com O-Subject: [RHEL5 U3 PATCH 3/3] FEAT: s390 - zfcp: Enhanced Trace Facility Bugzilla: 439482 RH-Acked-by: Pete Zaitcev <zaitcev@redhat.com> Description ============ The zfcp error recovery was reworked and the remaining traces in s390dbf are updated under consideration of: - addition of trace entries for important events, if they are missing - removal of trace entries, when no information is gained from the trace entry - rework of the content of trace entries in order to pass meaningful information - assignment of appropriate loglevels to trace entries, to provide similar level of detail information through all trace facilities in same debug level. Bugzilla ========= BZ 439482 https://bugzilla.redhat.com/show_bug.cgi?id=439482 Upstream status of the patch: ============================= This patch as been posted upstream and will go into linux-2.6 via scsi-misc. http://www.spinics.net/lists/linux-scsi/msg25284.html http://www.spinics.net/lists/linux-scsi/msg25291.html I'll reply to this message as soon as we have a git commit id Test status: ============ The patch has been tested. Please ACK. With best regards, Hans diff --git a/drivers/s390/scsi/zfcp_aux.c b/drivers/s390/scsi/zfcp_aux.c index d4d802c..f798903 100644 --- a/drivers/s390/scsi/zfcp_aux.c +++ b/drivers/s390/scsi/zfcp_aux.c @@ -165,7 +165,6 @@ void zfcp_reqlist_remove(struct zfcp_adapter *adapter, unsigned long req_id) { struct zfcp_fsf_req *request, *tmp; unsigned int i, counter; - u64 dbg_tmp[2]; i = req_id % REQUEST_LIST_SIZE; BUG_ON(list_empty(&adapter->req_list[i])); @@ -173,9 +172,6 @@ void zfcp_reqlist_remove(struct zfcp_adapter *adapter, unsigned long req_id) counter = 0; list_for_each_entry_safe(request, tmp, &adapter->req_list[i], list) { if (request->req_id == req_id) { - dbg_tmp[0] = (u64) atomic_read(&adapter->reqs_active); - dbg_tmp[1] = (u64) counter; - debug_event(adapter->erp_dbf, 4, (void *) dbg_tmp, 16); list_del(&request->list); break; } @@ -1078,10 +1074,10 @@ zfcp_adapter_enqueue(struct ccw_device *ccw_device) /* initialize debug locks */ - spin_lock_init(&adapter->erp_dbf_lock); spin_lock_init(&adapter->hba_dbf_lock); spin_lock_init(&adapter->san_dbf_lock); spin_lock_init(&adapter->scsi_dbf_lock); + spin_lock_init(&adapter->rec_dbf_lock); /* initialize error recovery stuff */ @@ -1366,10 +1362,10 @@ zfcp_nameserver_enqueue(struct zfcp_adapter *adapter) #define ZFCP_LOG_AREA ZFCP_LOG_AREA_FC -void -zfcp_fsf_incoming_els_rscn(struct zfcp_adapter *adapter, - struct fsf_status_read_buffer *status_buffer) +void zfcp_fsf_incoming_els_rscn(struct zfcp_fsf_req *fsf_req) { + struct fsf_status_read_buffer *status_buffer = (void*)fsf_req->data; + struct zfcp_adapter *adapter = fsf_req->adapter; struct fcp_rscn_head *fcp_rscn_head; struct fcp_rscn_element *fcp_rscn_element; struct zfcp_port *port; @@ -1416,7 +1412,8 @@ zfcp_fsf_incoming_els_rscn(struct zfcp_adapter *adapter, ZFCP_LOG_INFO("incoming RSCN, trying to open " "port 0x%016Lx\n", port->wwpn); zfcp_erp_port_reopen(port, - ZFCP_STATUS_COMMON_ERP_FAILED); + ZFCP_STATUS_COMMON_ERP_FAILED, + 82, fsf_req); continue; } @@ -1447,10 +1444,10 @@ zfcp_fsf_incoming_els_rscn(struct zfcp_adapter *adapter, } } -static void -zfcp_fsf_incoming_els_plogi(struct zfcp_adapter *adapter, - struct fsf_status_read_buffer *status_buffer) +static void zfcp_fsf_incoming_els_plogi(struct zfcp_fsf_req *fsf_req) { + struct fsf_status_read_buffer *status_buffer = (void*)fsf_req->data; + struct zfcp_adapter *adapter = fsf_req->adapter; struct fsf_plogi *els_plogi; struct zfcp_port *port; unsigned long flags; @@ -1469,14 +1466,14 @@ zfcp_fsf_incoming_els_plogi(struct zfcp_adapter *adapter, status_buffer->d_id, zfcp_get_busid_by_adapter(adapter)); } else { - zfcp_erp_port_forced_reopen(port, 0); + zfcp_erp_port_forced_reopen(port, 0, 83, fsf_req); } } -static void -zfcp_fsf_incoming_els_logo(struct zfcp_adapter *adapter, - struct fsf_status_read_buffer *status_buffer) +static void zfcp_fsf_incoming_els_logo(struct zfcp_fsf_req *fsf_req) { + struct fsf_status_read_buffer *status_buffer = (void*)fsf_req->data; + struct zfcp_adapter *adapter = fsf_req->adapter; struct fcp_logo *els_logo = (struct fcp_logo *) status_buffer->payload; struct zfcp_port *port; unsigned long flags; @@ -1494,7 +1491,7 @@ zfcp_fsf_incoming_els_logo(struct zfcp_adapter *adapter, status_buffer->d_id, zfcp_get_busid_by_adapter(adapter)); } else { - zfcp_erp_port_forced_reopen(port, 0); + zfcp_erp_port_forced_reopen(port, 0, 84, fsf_req); } } @@ -1521,12 +1518,12 @@ zfcp_fsf_incoming_els(struct zfcp_fsf_req *fsf_req) zfcp_san_dbf_event_incoming_els(fsf_req); if (els_type == LS_PLOGI) - zfcp_fsf_incoming_els_plogi(adapter, status_buffer); + zfcp_fsf_incoming_els_plogi(fsf_req); else if (els_type == LS_LOGO) - zfcp_fsf_incoming_els_logo(adapter, status_buffer); + zfcp_fsf_incoming_els_logo(fsf_req); else if ((els_type & 0xffff0000) == LS_RSCN) /* we are only concerned with the command, not the length */ - zfcp_fsf_incoming_els_rscn(adapter, status_buffer); + zfcp_fsf_incoming_els_rscn(fsf_req); else zfcp_fsf_incoming_els_unknown(adapter, status_buffer); } diff --git a/drivers/s390/scsi/zfcp_ccw.c b/drivers/s390/scsi/zfcp_ccw.c index 5e2bf90..276170d 100644 --- a/drivers/s390/scsi/zfcp_ccw.c +++ b/drivers/s390/scsi/zfcp_ccw.c @@ -172,9 +172,9 @@ zfcp_ccw_set_online(struct ccw_device *ccw_device) BUG_ON(!zfcp_reqlist_isempty(adapter)); adapter->req_no = 0; - zfcp_erp_modify_adapter_status(adapter, ZFCP_STATUS_COMMON_RUNNING, - ZFCP_SET); - zfcp_erp_adapter_reopen(adapter, ZFCP_STATUS_COMMON_ERP_FAILED); + zfcp_erp_modify_adapter_status(adapter, 10, 0, + ZFCP_STATUS_COMMON_RUNNING, ZFCP_SET); + zfcp_erp_adapter_reopen(adapter, ZFCP_STATUS_COMMON_ERP_FAILED, 85, 0); zfcp_erp_wait(adapter); goto out; @@ -201,7 +201,7 @@ zfcp_ccw_set_offline(struct ccw_device *ccw_device) down(&zfcp_data.config_sema); adapter = dev_get_drvdata(&ccw_device->dev); - zfcp_erp_adapter_shutdown(adapter, 0); + zfcp_erp_adapter_shutdown(adapter, 0, 86, 0); zfcp_erp_wait(adapter); zfcp_erp_thread_kill(adapter); zfcp_adapter_debug_unregister(adapter); @@ -228,24 +228,21 @@ zfcp_ccw_notify(struct ccw_device *ccw_device, int event) case CIO_GONE: ZFCP_LOG_NORMAL("adapter %s: device gone\n", zfcp_get_busid_by_adapter(adapter)); - debug_text_event(adapter->erp_dbf,1,"dev_gone"); - zfcp_erp_adapter_shutdown(adapter, 0); + zfcp_erp_adapter_shutdown(adapter, 0, 87, 0); break; case CIO_NO_PATH: ZFCP_LOG_NORMAL("adapter %s: no path\n", zfcp_get_busid_by_adapter(adapter)); - debug_text_event(adapter->erp_dbf,1,"no_path"); - zfcp_erp_adapter_shutdown(adapter, 0); + zfcp_erp_adapter_shutdown(adapter, 0, 88, 0); break; case CIO_OPER: ZFCP_LOG_NORMAL("adapter %s: operational again\n", zfcp_get_busid_by_adapter(adapter)); - debug_text_event(adapter->erp_dbf,1,"dev_oper"); - zfcp_erp_modify_adapter_status(adapter, + zfcp_erp_modify_adapter_status(adapter, 11, 0, ZFCP_STATUS_COMMON_RUNNING, ZFCP_SET); zfcp_erp_adapter_reopen(adapter, - ZFCP_STATUS_COMMON_ERP_FAILED); + ZFCP_STATUS_COMMON_ERP_FAILED, 89, 0); break; } zfcp_erp_wait(adapter); @@ -299,7 +296,7 @@ zfcp_ccw_shutdown(struct device *dev) down(&zfcp_data.config_sema); adapter = dev_get_drvdata(dev); - zfcp_erp_adapter_shutdown(adapter, 0); + zfcp_erp_adapter_shutdown(adapter, 0, 90, 0); zfcp_erp_wait(adapter); up(&zfcp_data.config_sema); } diff --git a/drivers/s390/scsi/zfcp_dbf.c b/drivers/s390/scsi/zfcp_dbf.c index 6a8a97e..5778bfd 100644 --- a/drivers/s390/scsi/zfcp_dbf.c +++ b/drivers/s390/scsi/zfcp_dbf.c @@ -62,6 +62,24 @@ static int zfcp_dbf_tag(char *out_buf, const char *label, const char *tag) return len; } +static void zfcp_dbf_hexdump(debug_info_t *dbf, void *to, int to_len, + int level, char *from, int from_len) +{ + int offset; + struct zfcp_dbf_dump *dump = to; + int room = to_len - sizeof(*dump); + + for (offset = 0; offset < from_len; offset += dump->size) { + memset(to, 0, to_len); + strncpy(dump->tag, "dump", ZFCP_DBF_TAG_SIZE); + dump->total_size = from_len; + dump->offset = offset; + dump->size = min(from_len - offset, room); + memcpy(dump->data, from + offset, dump->size); + debug_event(dbf, level, dump, dump->size); + } +} + static int zfcp_dbf_view(char *out_buf, const char *label, const char *format, ...) { @@ -77,6 +95,22 @@ zfcp_dbf_view(char *out_buf, const char *label, const char *format, ...) return len; } +static void zfcp_dbf_outs(char **buf, const char *s1, const char *s2) +{ + *buf += sprintf(*buf, "%-24s%s\n", s1, s2); +} + +static void zfcp_dbf_out(char **buf, const char *s, const char *format, ...) +{ + va_list arg; + + *buf += sprintf(*buf, "%-24s", s); + va_start(arg, format); + *buf += vsprintf(*buf, format, arg); + va_end(arg); + *buf += sprintf(*buf, "\n"); +} + static int zfcp_dbf_view_dump(char *out_buf, const char *label, char *buffer, int buflen, int offset, int total_size) @@ -161,6 +195,9 @@ inline void zfcp_hba_dbf_event_fsf_response(struct zfcp_fsf_req *fsf_req) (fsf_req->fsf_command == FSF_QTCB_OPEN_LUN)) { strncpy(rec->tag2, "open", ZFCP_DBF_TAG_SIZE); level = 4; + } else if (qtcb->header.log_length) { + strncpy(rec->tag2, "qtcb", ZFCP_DBF_TAG_SIZE); + level = 5; } else { strncpy(rec->tag2, "norm", ZFCP_DBF_TAG_SIZE); level = 6; @@ -232,6 +269,17 @@ inline void zfcp_hba_dbf_event_fsf_response(struct zfcp_fsf_req *fsf_req) debug_event(adapter->hba_dbf, level, rec, sizeof(struct zfcp_hba_dbf_record)); + + /* have fcp channel microcode fixed to use as little as possible */ + if (fsf_req->fsf_command != FSF_QTCB_FCP_CMND) { + /* adjust length skipping trailing zeros */ + char *buf = (char*)qtcb + qtcb->header.log_start; + int len = qtcb->header.log_length; + for (; len && !buf[len - 1]; len--); + zfcp_dbf_hexdump(adapter->hba_dbf, rec, sizeof(*rec), level, + buf, len); + } + spin_unlock_irqrestore(&adapter->hba_dbf_lock, flags); } @@ -472,6 +520,382 @@ struct debug_view zfcp_hba_dbf_view = { NULL }; +static const char *zfcp_rec_dbf_tags[] = { + [ZFCP_REC_DBF_ID_THREAD] = "thread", + [ZFCP_REC_DBF_ID_TARGET] = "target", + [ZFCP_REC_DBF_ID_TRIGGER] = "trigger", + [ZFCP_REC_DBF_ID_ACTION] = "action", +}; + +static const char *zfcp_rec_dbf_ids[] = { + [1] = "new", + [2] = "ready", + [3] = "kill", + [4] = "down sleep", + [5] = "down wakeup", + [6] = "down sleep ecd", + [7] = "down wakeup ecd", + [8] = "down sleep epd", + [9] = "down wakeup epd", + [10] = "online", + [11] = "operational", + [12] = "scsi slave destroy", + [13] = "propagate failed adapter", + [14] = "propagate failed port", + [15] = "block adapter", + [16] = "unblock adapter", + [17] = "block port", + [18] = "unblock port", + [19] = "block unit", + [20] = "unblock unit", + [21] = "unit recovery failed", + [22] = "port recovery failed", + [23] = "adapter recovery failed", + [24] = "qdio queues down", + [25] = "p2p failed", + [26] = "nameserver lookup failed", + [27] = "nameserver port failed", + [28] = "link up", + [29] = "link down", + [30] = "link up status read", + [31] = "open port failed", + [32] = "open port failed", + [33] = "close port", + [34] = "open unit failed", + [35] = "exclusive open unit failed", + [36] = "shared open unit failed", + [37] = "link down", + [38] = "link down status read no link", + [39] = "link down status read fdisc login", + [40] = "link down status read firmware update", + [41] = "link down status read unknown reason", + [42] = "link down ecd incomplete", + [43] = "link down epd incomplete", + [44] = "sysfs adapter recovery", + [45] = "sysfs port recovery", + [46] = "sysfs unit recovery", + [47] = "port boxed abort", + [48] = "unit boxed abort", + [49] = "port boxed ct", + [50] = "port boxed close physical", + [51] = "port boxed open unit", + [52] = "port boxed close unit", + [53] = "port boxed fcp", + [54] = "unit boxed fcp", + [55] = "port access denied ct", + [56] = "port access denied els", + [57] = "port access denied open port", + [58] = "port access denied close physical", + [59] = "unit access denied open unit", + [60] = "shared unit access denied open unit", + [61] = "unit access denied fcp", + [62] = "request timeout", + [63] = "adisc link test reject or timeout", + [64] = "adisc link test d_id changed", + [65] = "adisc link test failed", + [66] = "recovery out of memory", + [67] = "adapter recovery repeated after state change", + [68] = "port recovery repeated after state change", + [69] = "unit recovery repeated after state change", + [70] = "port recovery follow-up after successful adapter recovery", + [71] = "adapter recovery escalation after failed adapter recovery", + [72] = "port recovery follow-up after successful physical port " + "recovery", + [73] = "adapter recovery escalation after failed physical port " + "recovery", + [74] = "unit recovery follow-up after successful port recovery", + [75] = "physical port recovery escalation after failed port " + "recovery", + [76] = "port recovery escalation after failed unit recovery", + [77] = "recovery opening nameserver port", + [78] = "duplicate request id", + [79] = "link down", + [80] = "exclusive read-only unit access unsupported", + [81] = "shared read-write unit access unsupported", + [82] = "incoming rscn", + [83] = "incoming plogi", + [84] = "incoming logo", + [85] = "online", + [86] = "offline", + [87] = "ccw device gone", + [88] = "ccw device no path", + [89] = "ccw device operational", + [90] = "ccw device shutdown", + [91] = "sysfs port addition", + [92] = "sysfs port removal", + [93] = "sysfs adapter recovery", + [94] = "sysfs unit addition", + [95] = "sysfs unit removal", + [96] = "sysfs port recovery", + [97] = "sysfs unit recovery", + [98] = "sequence number mismatch", + [99] = "link up", + [100] = "error state", + [101] = "status read physical port closed", + [102] = "link up status read", + [103] = "too many failed status read buffers", + [104] = "port handle not valid abort", + [105] = "lun handle not valid abort", + [106] = "port handle not valid ct", + [107] = "port handle not valid close port", + [108] = "port handle not valid close physical port", + [109] = "port handle not valid open unit", + [110] = "port handle not valid close unit", + [111] = "lun handle not valid close unit", + [112] = "port handle not valid fcp", + [113] = "lun handle not valid fcp", + [114] = "handle mismatch fcp", + [115] = "lun not valid fcp", + [116] = "qdio send failed", + [117] = "version mismatch", + [118] = "incompatible qtcb type", + [119] = "unknown protocol status", + [120] = "unknown fsf command", + [121] = "no recommendation for status qualifier", + [122] = "status read physical port closed in error", + [123] = "fc service class not supported ct", + [124] = "fc service class not supported els", + [125] = "need newer zfcp", + [126] = "need newer microcode", + [127] = "arbitrated loop not supported", + [128] = "unknown topology", + [129] = "qtcb size mismatch", + [130] = "unknown fsf status ecd", + [131] = "fcp request too big", + [132] = "fc service class not supported fcp", + [133] = "data direction not valid fcp", + [134] = "command length not valid fcp", + [135] = "status read act update", + [136] = "status read cfdc update", + [137] = "hbaapi port open", + [138] = "hbaapi unit open", + [139] = "hbaapi unit shutdown", + [140] = "qdio error", + [141] = "scsi host reset", + [142] = "dismissing fsf request for recovery action", + [143] = "recovery action timed out", + [144] = "recovery action gone", + [145] = "recovery action being processed", + [146] = "recovery action ready for next step", +}; + +static int zfcp_rec_dbf_view_format(debug_info_t *id, struct debug_view *view, + char *buf, const char *_rec) +{ + struct zfcp_rec_dbf_record *r = (struct zfcp_rec_dbf_record *)_rec; + char *p = buf; + + zfcp_dbf_outs(&p, "tag", zfcp_rec_dbf_tags[r->id]); + zfcp_dbf_outs(&p, "hint", zfcp_rec_dbf_ids[r->id2]); + zfcp_dbf_out(&p, "id", "%d", r->id2); + switch (r->id) { + case ZFCP_REC_DBF_ID_THREAD: + zfcp_dbf_out(&p, "sema", "%d", r->u.thread.sema); + zfcp_dbf_out(&p, "total", "%d", r->u.thread.total); + zfcp_dbf_out(&p, "ready", "%d", r->u.thread.ready); + zfcp_dbf_out(&p, "running", "%d", r->u.thread.running); + break; + case ZFCP_REC_DBF_ID_TARGET: + zfcp_dbf_out(&p, "reference", "0x%016Lx", r->u.target.ref); + zfcp_dbf_out(&p, "status", "0x%08x", r->u.target.status); + zfcp_dbf_out(&p, "erp_count", "%d", r->u.target.erp_count); + zfcp_dbf_out(&p, "d_id", "0x%06x", r->u.target.d_id); + zfcp_dbf_out(&p, "wwpn", "0x%016Lx", r->u.target.wwpn); + zfcp_dbf_out(&p, "fcp_lun", "0x%016Lx", r->u.target.fcp_lun); + break; + case ZFCP_REC_DBF_ID_TRIGGER: + zfcp_dbf_out(&p, "reference", "0x%016Lx", r->u.trigger.ref); + zfcp_dbf_out(&p, "erp_action", "0x%016Lx", r->u.trigger.action); + zfcp_dbf_out(&p, "requested", "%d", r->u.trigger.want); + zfcp_dbf_out(&p, "executed", "%d", r->u.trigger.need); + zfcp_dbf_out(&p, "wwpn", "0x%016Lx", r->u.trigger.wwpn); + zfcp_dbf_out(&p, "fcp_lun", "0x%016Lx", r->u.trigger.fcp_lun); + zfcp_dbf_out(&p, "adapter_status", "0x%08x", r->u.trigger.as); + zfcp_dbf_out(&p, "port_status", "0x%08x", r->u.trigger.ps); + zfcp_dbf_out(&p, "unit_status", "0x%08x", r->u.trigger.us); + break; + case ZFCP_REC_DBF_ID_ACTION: + zfcp_dbf_out(&p, "erp_action", "0x%016Lx", r->u.action.action); + zfcp_dbf_out(&p, "fsf_req", "0x%016Lx", r->u.action.fsf_req); + zfcp_dbf_out(&p, "status", "0x%08Lx", r->u.action.status); + zfcp_dbf_out(&p, "step", "0x%08Lx", r->u.action.step); + break; + } + sprintf(p, "\n"); + return (p - buf) + 1; +} + +static struct debug_view zfcp_rec_dbf_view = { + "structured", + NULL, + &zfcp_dbf_view_header, + &zfcp_rec_dbf_view_format, + NULL, + NULL +}; + +/** + * zfcp_rec_dbf_event_thread - trace event related to recovery thread operation + * @id2: identifier for event + * @adapter: adapter + * @lock: non-zero value indicates that erp_lock has not yet been acquired + */ +void zfcp_rec_dbf_event_thread(u8 id2, struct zfcp_adapter *adapter, int lock) +{ + struct zfcp_rec_dbf_record *r = &adapter->rec_dbf_buf; + unsigned long flags = 0; + struct list_head *entry; + unsigned ready = 0, running = 0, total; + + if (lock) + read_lock_irqsave(&adapter->erp_lock, flags); + list_for_each(entry, &adapter->erp_ready_head) + ready++; + list_for_each(entry, &adapter->erp_running_head) + running++; + total = adapter->erp_total_count; + if (lock) + read_unlock_irqrestore(&adapter->erp_lock, flags); + + spin_lock_irqsave(&adapter->rec_dbf_lock, flags); + memset(r, 0, sizeof(*r)); + r->id = ZFCP_REC_DBF_ID_THREAD; + r->id2 = id2; + r->u.thread.sema = atomic_read(&adapter->erp_ready_sem.count); + r->u.thread.total = total; + r->u.thread.ready = ready; + r->u.thread.running = running; + debug_event(adapter->rec_dbf, 5, r, sizeof(*r)); + spin_unlock_irqrestore(&adapter->rec_dbf_lock, flags); +} + +static void zfcp_rec_dbf_event_target(u8 id2, void *ref, + struct zfcp_adapter *adapter, + atomic_t *status, atomic_t *erp_count, + u64 wwpn, u32 d_id, u64 fcp_lun) +{ + struct zfcp_rec_dbf_record *r = &adapter->rec_dbf_buf; + unsigned long flags; + + spin_lock_irqsave(&adapter->rec_dbf_lock, flags); + memset(r, 0, sizeof(*r)); + r->id = ZFCP_REC_DBF_ID_TARGET; + r->id2 = id2; + r->u.target.ref = (unsigned long)ref; + r->u.target.status = atomic_read(status); + r->u.target.wwpn = wwpn; + r->u.target.d_id = d_id; + r->u.target.fcp_lun = fcp_lun; + r->u.target.erp_count = atomic_read(erp_count); + debug_event(adapter->rec_dbf, 3, r, sizeof(*r)); + spin_unlock_irqrestore(&adapter->rec_dbf_lock, flags); +} + +/** + * zfcp_rec_dbf_event_adapter - trace event for adapter state change + * @id: identifier for trigger of state change + * @ref: additional reference (e.g. request) + * @adapter: adapter + */ +void zfcp_rec_dbf_event_adapter(u8 id, void *ref, struct zfcp_adapter *adapter) +{ + zfcp_rec_dbf_event_target(id, ref, adapter, &adapter->status, + &adapter->erp_counter, 0, 0, 0); +} + +/** + * zfcp_rec_dbf_event_port - trace event for port state change + * @id: identifier for trigger of state change + * @ref: additional reference (e.g. request) + * @port: port + */ +void zfcp_rec_dbf_event_port(u8 id, void *ref, struct zfcp_port *port) +{ + struct zfcp_adapter *adapter = port->adapter; + + zfcp_rec_dbf_event_target(id, ref, adapter, &port->status, + &port->erp_counter, port->wwpn, port->d_id, + 0); +} + +/** + * zfcp_rec_dbf_event_unit - trace event for unit state change + * @id: identifier for trigger of state change + * @ref: additional reference (e.g. request) + * @unit: unit + */ +void zfcp_rec_dbf_event_unit(u8 id, void *ref, struct zfcp_unit *unit) +{ + struct zfcp_port *port = unit->port; + struct zfcp_adapter *adapter = port->adapter; + + zfcp_rec_dbf_event_target(id, ref, adapter, &unit->status, + &unit->erp_counter, port->wwpn, port->d_id, + unit->fcp_lun); +} + +/** + * zfcp_rec_dbf_event_trigger - trace event for triggered error recovery + * @id2: identifier for error recovery trigger + * @ref: additional reference (e.g. request) + * @want: originally requested error recovery action + * @need: error recovery action actually initiated + * @action: address of error recovery action struct + * @adapter: adapter + * @port: port + * @unit: unit + */ +void zfcp_rec_dbf_event_trigger(u8 id2, void *ref, u8 want, u8 need, + void *action, struct zfcp_adapter *adapter, + struct zfcp_port *port, struct zfcp_unit *unit) +{ + struct zfcp_rec_dbf_record *r = &adapter->rec_dbf_buf; + unsigned long flags; + + spin_lock_irqsave(&adapter->rec_dbf_lock, flags); + memset(r, 0, sizeof(*r)); + r->id = ZFCP_REC_DBF_ID_TRIGGER; + r->id2 = id2; + r->u.trigger.ref = (unsigned long)ref; + r->u.trigger.want = want; + r->u.trigger.need = need; + r->u.trigger.action = (unsigned long)action; + r->u.trigger.as = atomic_read(&adapter->status); + if (port) { + r->u.trigger.ps = atomic_read(&port->status); + r->u.trigger.wwpn = port->wwpn; + } + if (unit) { + r->u.trigger.us = atomic_read(&unit->status); + r->u.trigger.fcp_lun = unit->fcp_lun; + } + debug_event(adapter->rec_dbf, action ? 1 : 4, r, sizeof(*r)); + spin_unlock_irqrestore(&adapter->rec_dbf_lock, flags); +} + +/** + * zfcp_rec_dbf_event_action - trace event showing progress of recovery action + * @id2: identifier + * @erp_action: error recovery action struct pointer + */ +void zfcp_rec_dbf_event_action(u8 id2, struct zfcp_erp_action *erp_action) +{ + struct zfcp_adapter *adapter = erp_action->adapter; + struct zfcp_rec_dbf_record *r = &adapter->rec_dbf_buf; + unsigned long flags; + + spin_lock_irqsave(&adapter->rec_dbf_lock, flags); + memset(r, 0, sizeof(*r)); + r->id = ZFCP_REC_DBF_ID_ACTION; + r->id2 = id2; + r->u.action.action = (unsigned long)erp_action; + r->u.action.status = erp_action->status; + r->u.action.step = erp_action->step; + r->u.action.fsf_req = (unsigned long)erp_action->fsf_req; + debug_event(adapter->rec_dbf, 4, r, sizeof(*r)); + spin_unlock_irqrestore(&adapter->rec_dbf_lock, flags); +} + inline void _zfcp_san_dbf_event_common_ct(const char *tag, struct zfcp_fsf_req *fsf_req, u32 s_id, u32 d_id, void *buffer, int buflen) @@ -544,38 +968,19 @@ _zfcp_san_dbf_event_common_els(const char *tag, int level, { struct zfcp_adapter *adapter = fsf_req->adapter; struct zfcp_san_dbf_record *rec = &adapter->san_dbf_buf; - struct zfcp_dbf_dump *dump = (struct zfcp_dbf_dump *)rec; unsigned long flags; - int offset = 0; spin_lock_irqsave(&adapter->san_dbf_lock, flags); - do { - memset(rec, 0, sizeof(struct zfcp_san_dbf_record)); - if (offset == 0) { - strncpy(rec->tag, tag, ZFCP_DBF_TAG_SIZE); - rec->fsf_reqid = (unsigned long)fsf_req; - rec->fsf_seqno = fsf_req->seq_no; - rec->s_id = s_id; - rec->d_id = d_id; - rec->type.els.ls_code = ls_code; - buflen = min(buflen, ZFCP_DBF_ELS_MAX_PAYLOAD); - rec->type.els.payload_size = buflen; - memcpy(rec->type.els.payload, - buffer, min(buflen, ZFCP_DBF_ELS_PAYLOAD)); - offset += min(buflen, ZFCP_DBF_ELS_PAYLOAD); - } else { - strncpy(dump->tag, "dump", ZFCP_DBF_TAG_SIZE); - dump->total_size = buflen; - dump->offset = offset; - dump->size = min(buflen - offset, - (int)sizeof(struct zfcp_san_dbf_record) - - (int)sizeof(struct zfcp_dbf_dump)); - memcpy(dump->data, buffer + offset, dump->size); - offset += dump->size; - } - debug_event(adapter->san_dbf, level, - rec, sizeof(struct zfcp_san_dbf_record)); - } while (offset < buflen); + memset(rec, 0, sizeof(struct zfcp_san_dbf_record)); + strncpy(rec->tag, tag, ZFCP_DBF_TAG_SIZE); + rec->fsf_reqid = (unsigned long)fsf_req; + rec->fsf_seqno = fsf_req->seq_no; + rec->s_id = s_id; + rec->d_id = d_id; + rec->type.els.ls_code = ls_code; + debug_event(adapter->san_dbf, level, rec, sizeof(*rec)); + zfcp_dbf_hexdump(adapter->san_dbf, rec, sizeof(*rec), level, + buffer, min(buflen, ZFCP_DBF_ELS_MAX_PAYLOAD)); spin_unlock_irqrestore(&adapter->san_dbf_lock, flags); } @@ -897,13 +1302,14 @@ int zfcp_adapter_debug_register(struct zfcp_adapter *adapter) char dbf_name[DEBUG_MAX_NAME_LEN]; /* debug feature area which records recovery activity */ - sprintf(dbf_name, "zfcp_%s_erp", zfcp_get_busid_by_adapter(adapter)); - adapter->erp_dbf = debug_register(dbf_name, dbfsize, 2, - sizeof(struct zfcp_erp_dbf_record)); - if (!adapter->erp_dbf) + sprintf(dbf_name, "zfcp_%s_rec", zfcp_get_busid_by_adapter(adapter)); + adapter->rec_dbf = debug_register(dbf_name, dbfsize, 1, + sizeof(struct zfcp_rec_dbf_record)); + if (!adapter->rec_dbf) goto failed; - debug_register_view(adapter->erp_dbf, &debug_hex_ascii_view); - debug_set_level(adapter->erp_dbf, 3); + debug_register_view(adapter->rec_dbf, &debug_hex_ascii_view); + debug_register_view(adapter->rec_dbf, &zfcp_rec_dbf_view); + debug_set_level(adapter->rec_dbf, 3); /* debug feature area which records HBA (FSF and QDIO) conditions */ sprintf(dbf_name, "zfcp_%s_hba", zfcp_get_busid_by_adapter(adapter)); @@ -952,11 +1358,11 @@ void zfcp_adapter_debug_unregister(struct zfcp_adapter *adapter) debug_unregister(adapter->scsi_dbf); debug_unregister(adapter->san_dbf); debug_unregister(adapter->hba_dbf); - debug_unregister(adapter->erp_dbf); + debug_unregister(adapter->rec_dbf); adapter->scsi_dbf = NULL; adapter->san_dbf = NULL; adapter->hba_dbf = NULL; - adapter->erp_dbf = NULL; + adapter->rec_dbf = NULL; } #undef ZFCP_LOG_AREA diff --git a/drivers/s390/scsi/zfcp_def.h b/drivers/s390/scsi/zfcp_def.h index 9ae4907..33ed851 100644 --- a/drivers/s390/scsi/zfcp_def.h +++ b/drivers/s390/scsi/zfcp_def.h @@ -272,11 +272,59 @@ struct zfcp_dbf_dump { u8 data[]; /* dump data */ } __attribute__ ((packed)); -/* FIXME: to be inflated when reworking the erp dbf */ -struct zfcp_erp_dbf_record { - u8 dummy[16]; +struct zfcp_rec_dbf_record_thread { + u32 sema; + u32 total; + u32 ready; + u32 running; } __attribute__ ((packed)); +struct zfcp_rec_dbf_record_target { + u64 ref; + u32 status; + u32 d_id; + u64 wwpn; + u64 fcp_lun; + u32 erp_count; +} __attribute__ ((packed)); + +struct zfcp_rec_dbf_record_trigger { + u8 want; + u8 need; + u32 as; + u32 ps; + u32 us; + u64 ref; + u64 action; + u64 wwpn; + u64 fcp_lun; +} __attribute__ ((packed)); + +struct zfcp_rec_dbf_record_action { + u32 status; + u32 step; + u64 action; + u64 fsf_req; +} __attribute__ ((packed)); + +struct zfcp_rec_dbf_record { + u8 id; + u8 id2; + union { + struct zfcp_rec_dbf_record_action action; + struct zfcp_rec_dbf_record_thread thread; + struct zfcp_rec_dbf_record_target target; + struct zfcp_rec_dbf_record_trigger trigger; + } u; +} __attribute__ ((packed)); + +enum { + ZFCP_REC_DBF_ID_ACTION, + ZFCP_REC_DBF_ID_THREAD, + ZFCP_REC_DBF_ID_TARGET, + ZFCP_REC_DBF_ID_TRIGGER, +}; + struct zfcp_hba_dbf_record_response { u32 fsf_command; u64 fsf_reqid; @@ -915,15 +963,15 @@ struct zfcp_adapter { u32 erp_low_mem_count; /* nr of erp actions waiting for memory */ struct zfcp_port *nameserver_port; /* adapter's nameserver */ - debug_info_t *erp_dbf; + debug_info_t *rec_dbf; debug_info_t *hba_dbf; debug_info_t *san_dbf; /* debug feature areas */ debug_info_t *scsi_dbf; - spinlock_t erp_dbf_lock; + spinlock_t rec_dbf_lock; spinlock_t hba_dbf_lock; spinlock_t san_dbf_lock; spinlock_t scsi_dbf_lock; - struct zfcp_erp_dbf_record erp_dbf_buf; + struct zfcp_rec_dbf_record rec_dbf_buf; struct zfcp_hba_dbf_record hba_dbf_buf; struct zfcp_san_dbf_record san_dbf_buf; struct zfcp_scsi_dbf_record scsi_dbf_buf; diff --git a/drivers/s390/scsi/zfcp_erp.c b/drivers/s390/scsi/zfcp_erp.c index 6cc091b..24b800b 100644 --- a/drivers/s390/scsi/zfcp_erp.c +++ b/drivers/s390/scsi/zfcp_erp.c @@ -26,13 +26,17 @@ static int zfcp_erp_adisc(struct zfcp_port *); static void zfcp_erp_adisc_handler(unsigned long); -static int zfcp_erp_adapter_reopen_internal(struct zfcp_adapter *, int); -static int zfcp_erp_port_forced_reopen_internal(struct zfcp_port *, int); -static int zfcp_erp_port_reopen_internal(struct zfcp_port *, int); -static int zfcp_erp_unit_reopen_internal(struct zfcp_unit *, int); - -static int zfcp_erp_port_reopen_all_internal(struct zfcp_adapter *, int); -static int zfcp_erp_unit_reopen_all_internal(struct zfcp_port *, int); +static int zfcp_erp_adapter_reopen_internal(struct zfcp_adapter *, int, u8, + void *); +static int zfcp_erp_port_forced_reopen_internal(struct zfcp_port *, int, u8, + void *); +static int zfcp_erp_port_reopen_internal(struct zfcp_port *, int, u8, void *); +static int zfcp_erp_unit_reopen_internal(struct zfcp_unit *, int, u8, void *); + +static int zfcp_erp_port_reopen_all_internal(struct zfcp_adapter *, int, u8, + void *); +static int zfcp_erp_unit_reopen_all_internal(struct zfcp_port *, int, u8, + void *); static void zfcp_erp_adapter_block(struct zfcp_adapter *, int); static void zfcp_erp_adapter_unblock(struct zfcp_adapter *); @@ -97,7 +101,8 @@ static void zfcp_erp_action_dismiss_unit(struct zfcp_unit *); static void zfcp_erp_action_dismiss(struct zfcp_erp_action *); static int zfcp_erp_action_enqueue(int, struct zfcp_adapter *, - struct zfcp_port *, struct zfcp_unit *); + struct zfcp_port *, struct zfcp_unit *, + u8 id, void *ref); static int zfcp_erp_action_dequeue(struct zfcp_erp_action *); static void zfcp_erp_action_cleanup(int, struct zfcp_adapter *, struct zfcp_port *, struct zfcp_unit *, @@ -128,11 +133,9 @@ static void zfcp_close_qdio(struct zfcp_adapter *adapter) atomic_clear_mask(ZFCP_STATUS_ADAPTER_QDIOUP, &adapter->status); write_unlock_irq(&req_queue->queue_lock); - debug_text_event(adapter->erp_dbf, 3, "qdio_down2a"); while (qdio_shutdown(adapter->ccw_device, QDIO_FLAG_CLEANUP_USING_CLEAR) == -EINPROGRESS) msleep(1000); - debug_text_event(adapter->erp_dbf, 3, "qdio_down2b"); /* cleanup used outbound sbals */ count = atomic_read(&req_queue->free_count); @@ -163,7 +166,7 @@ static void zfcp_close_fsf(struct zfcp_adapter *adapter) /* reset FSF request sequence number */ adapter->fsf_req_seq_no = 0; /* all ports and units are closed */ - zfcp_erp_modify_adapter_status(adapter, + zfcp_erp_modify_adapter_status(adapter, 24, 0, ZFCP_STATUS_COMMON_OPEN, ZFCP_CLEAR); } @@ -179,7 +182,7 @@ static void zfcp_close_fsf(struct zfcp_adapter *adapter) static void zfcp_fsf_request_timeout_handler(unsigned long data) { struct zfcp_adapter *adapter = (struct zfcp_adapter *) data; - zfcp_erp_adapter_reopen(adapter, ZFCP_STATUS_COMMON_ERP_FAILED); + zfcp_erp_adapter_reopen(adapter, ZFCP_STATUS_COMMON_ERP_FAILED, 62, 0); } void zfcp_fsf_start_timer(struct zfcp_fsf_req *fsf_req, unsigned long timeout) @@ -200,12 +203,11 @@ void zfcp_fsf_start_timer(struct zfcp_fsf_req *fsf_req, unsigned long timeout) * returns: 0 - initiated action successfully * <0 - failed to initiate action */ -int -zfcp_erp_adapter_reopen_internal(struct zfcp_adapter *adapter, int clear_mask) +int zfcp_erp_adapter_reopen_internal(struct zfcp_adapter *adapter, + int clear_mask, u8 id, void *ref) { int retval; - debug_text_event(adapter->erp_dbf, 5, "a_ro"); ZFCP_LOG_DEBUG("reopen adapter %s\n", zfcp_get_busid_by_adapter(adapter)); @@ -214,14 +216,13 @@ zfcp_erp_adapter_reopen_internal(struct zfcp_adapter *adapter, int clear_mask) if (atomic_test_mask(ZFCP_STATUS_COMMON_ERP_FAILED, &adapter->status)) { ZFCP_LOG_DEBUG("skipped reopen of failed adapter %s\n", zfcp_get_busid_by_adapter(adapter)); - debug_text_event(adapter->erp_dbf, 5, "a_ro_f"); /* ensure propagation of failed status to new devices */ - zfcp_erp_adapter_failed(adapter); + zfcp_erp_adapter_failed(adapter, 13, 0); retval = -EIO; goto out; } retval = zfcp_erp_action_enqueue(ZFCP_ERP_ACTION_REOPEN_ADAPTER, - adapter, NULL, NULL); + adapter, NULL, NULL, id, ref); out: return retval; @@ -236,56 +237,56 @@ zfcp_erp_adapter_reopen_internal(struct zfcp_adapter *adapter, int clear_mask) * returns: 0 - initiated action successfully * <0 - failed to initiate action */ -int -zfcp_erp_adapter_reopen(struct zfcp_adapter *adapter, int clear_mask) +int zfcp_erp_adapter_reopen(struct zfcp_adapter *adapter, int clear_mask, + u8 id, void *ref) { int retval; unsigned long flags; read_lock_irqsave(&zfcp_data.config_lock, flags); write_lock(&adapter->erp_lock); - retval = zfcp_erp_adapter_reopen_internal(adapter, clear_mask); + retval = zfcp_erp_adapter_reopen_internal(adapter, clear_mask, id, ref); write_unlock(&adapter->erp_lock); read_unlock_irqrestore(&zfcp_data.config_lock, flags); return retval; } -int -zfcp_erp_adapter_shutdown(struct zfcp_adapter *adapter, int clear_mask) +int zfcp_erp_adapter_shutdown(struct zfcp_adapter *adapter, int clear_mask, + u8 id, void *ref) { int retval; retval = zfcp_erp_adapter_reopen(adapter, ZFCP_STATUS_COMMON_RUNNING | ZFCP_STATUS_COMMON_ERP_FAILED | - clear_mask); + clear_mask, id, ref); return retval; } -int -zfcp_erp_port_shutdown(struct zfcp_port *port, int clear_mask) +int zfcp_erp_port_shutdown(struct zfcp_port *port, int clear_mask, u8 id, + void *ref) { int retval; retval = zfcp_erp_port_reopen(port, ZFCP_STATUS_COMMON_RUNNING | ZFCP_STATUS_COMMON_ERP_FAILED | - clear_mask); + clear_mask, id, ref); return retval; } -int -zfcp_erp_unit_shutdown(struct zfcp_unit *unit, int clear_mask) +int zfcp_erp_unit_shutdown(struct zfcp_unit *unit, int clear_mask, u8 id, + void *ref) { int retval; retval = zfcp_erp_unit_reopen(unit, ZFCP_STATUS_COMMON_RUNNING | ZFCP_STATUS_COMMON_ERP_FAILED | - clear_mask); + clear_mask, id, ref); return retval; } @@ -400,8 +401,7 @@ zfcp_erp_adisc_handler(unsigned long data) "force physical port reopen " "(adapter %s, port d_id=0x%08x)\n", zfcp_get_busid_by_adapter(adapter), d_id); - debug_text_event(adapter->erp_dbf, 3, "forcreop"); - if (zfcp_erp_port_forced_reopen(port, 0)) + if (zfcp_erp_port_forced_reopen(port, 0, 63, 0)) ZFCP_LOG_NORMAL("failed reopen of port " "(adapter %s, wwpn=0x%016Lx)\n", zfcp_get_busid_by_port(port), @@ -428,7 +428,7 @@ zfcp_erp_adisc_handler(unsigned long data) "adisc_resp_wwpn=0x%016Lx)\n", zfcp_get_busid_by_port(port), port->wwpn, (wwn_t) adisc->wwpn); - if (zfcp_erp_port_reopen(port, 0)) + if (zfcp_erp_port_reopen(port, 0, 64, 0)) ZFCP_LOG_NORMAL("failed reopen of port " "(adapter %s, wwpn=0x%016Lx)\n", zfcp_get_busid_by_port(port), @@ -462,7 +462,7 @@ zfcp_test_link(struct zfcp_port *port) ZFCP_LOG_NORMAL("reopen needed for port 0x%016Lx " "on adapter %s\n ", port->wwpn, zfcp_get_busid_by_port(port)); - retval = zfcp_erp_port_forced_reopen(port, 0); + retval = zfcp_erp_port_forced_reopen(port, 0, 65, 0); if (retval != 0) { ZFCP_LOG_NORMAL("reopen of remote port 0x%016Lx " "on adapter %s failed\n", port->wwpn, @@ -485,14 +485,10 @@ zfcp_test_link(struct zfcp_port *port) * returns: 0 - initiated action successfully * <0 - failed to initiate action */ -static int -zfcp_erp_port_forced_reopen_internal(struct zfcp_port *port, int clear_mask) +static int zfcp_erp_port_forced_reopen_internal(struct zfcp_port *port, + int clear_mask, u8 id, void *ref) { int retval; - struct zfcp_adapter *adapter = port->adapter; - - debug_text_event(adapter->erp_dbf, 5, "pf_ro"); - debug_event(adapter->erp_dbf, 5, &port->wwpn, sizeof (wwn_t)); ZFCP_LOG_DEBUG("forced reopen of port 0x%016Lx on adapter %s\n", port->wwpn, zfcp_get_busid_by_port(port)); @@ -503,14 +499,12 @@ zfcp_erp_port_forced_reopen_internal(struct zfcp_port *port, int clear_mask) ZFCP_LOG_DEBUG("skipped forced reopen of failed port 0x%016Lx " "on adapter %s\n", port->wwpn, zfcp_get_busid_by_port(port)); - debug_text_event(adapter->erp_dbf, 5, "pf_ro_f"); - debug_event(adapter->erp_dbf, 5, &port->wwpn, sizeof (wwn_t)); retval = -EIO; goto out; } retval = zfcp_erp_action_enqueue(ZFCP_ERP_ACTION_REOPEN_PORT_FORCED, - port->adapter, port, NULL); + port->adapter, port, NULL, id, ref); out: return retval; @@ -525,8 +519,8 @@ zfcp_erp_port_forced_reopen_internal(struct zfcp_port *port, int clear_mask) * returns: 0 - initiated action successfully * <0 - failed to initiate action */ -int -zfcp_erp_port_forced_reopen(struct zfcp_port *port, int clear_mask) +int zfcp_erp_port_forced_reopen(struct zfcp_port *port, int clear_mask, u8 id, + void *ref) { int retval; unsigned long flags; @@ -535,7 +529,8 @@ zfcp_erp_port_forced_reopen(struct zfcp_port *port, int clear_mask) adapter = port->adapter; read_lock_irqsave(&zfcp_data.config_lock, flags); write_lock(&adapter->erp_lock); - retval = zfcp_erp_port_forced_reopen_internal(port, clear_mask); + retval = zfcp_erp_port_forced_reopen_internal(port, clear_mask, id, + ref); write_unlock(&adapter->erp_lock); read_unlock_irqrestore(&zfcp_data.config_lock, flags); @@ -552,14 +547,10 @@ zfcp_erp_port_forced_reopen(struct zfcp_port *port, int clear_mask) * returns: 0 - initiated action successfully * <0 - failed to initiate action */ -static int -zfcp_erp_port_reopen_internal(struct zfcp_port *port, int clear_mask) +static int zfcp_erp_port_reopen_internal(struct zfcp_port *port, int clear_mask, + u8 id, void *ref) { int retval; - struct zfcp_adapter *adapter = port->adapter; - - debug_text_event(adapter->erp_dbf, 5, "p_ro"); - debug_event(adapter->erp_dbf, 5, &port->wwpn, sizeof (wwn_t)); ZFCP_LOG_DEBUG("reopen of port 0x%016Lx on adapter %s\n", port->wwpn, zfcp_get_busid_by_port(port)); @@ -570,16 +561,14 @@ zfcp_erp_port_reopen_internal(struct zfcp_port *port, int clear_mask) ZFCP_LOG_DEBUG("skipped reopen of failed port 0x%016Lx " "on adapter %s\n", port->wwpn, zfcp_get_busid_by_port(port)); - debug_text_event(adapter->erp_dbf, 5, "p_ro_f"); - debug_event(adapter->erp_dbf, 5, &port->wwpn, sizeof (wwn_t)); /* ensure propagation of failed status to new devices */ - zfcp_erp_port_failed(port); + zfcp_erp_port_failed(port, 14, 0); retval = -EIO; goto out; } retval = zfcp_erp_action_enqueue(ZFCP_ERP_ACTION_REOPEN_PORT, - port->adapter, port, NULL); + port->adapter, port, NULL, id, ref); out: return retval; @@ -595,8 +584,7 @@ zfcp_erp_port_reopen_internal(struct zfcp_port *port, int clear_mask) * correct locking. An error recovery task is initiated to do the reopen. * To wait for the completion of the reopen zfcp_erp_wait should be used. */ -int -zfcp_erp_port_reopen(struct zfcp_port *port, int clear_mask) +int zfcp_erp_port_reopen(struct zfcp_port *port, int clear_mask, u8 id, void *ref) { int retval; unsigned long flags; @@ -604,7 +592,7 @@ zfcp_erp_port_reopen(struct zfcp_port *port, int clear_mask) read_lock_irqsave(&zfcp_data.config_lock, flags); write_lock(&adapter->erp_lock); - retval = zfcp_erp_port_reopen_internal(port, clear_mask); + retval = zfcp_erp_port_reopen_internal(port, clear_mask, id, ref); write_unlock(&adapter->erp_lock); read_unlock_irqrestore(&zfcp_data.config_lock, flags); @@ -621,14 +609,12 @@ zfcp_erp_port_reopen(struct zfcp_port *port, int clear_mask) * returns: 0 - initiated action successfully * <0 - failed to initiate action */ -static int -zfcp_erp_unit_reopen_internal(struct zfcp_unit *unit, int clear_mask) +static int zfcp_erp_unit_reopen_internal(struct zfcp_unit *unit, int clear_mask, + u8 id, void *ref) { int retval; struct zfcp_adapter *adapter = unit->port->adapter; - debug_text_event(adapter->erp_dbf, 5, "u_ro"); - debug_event(adapter->erp_dbf, 5, &unit->fcp_lun, sizeof (fcp_lun_t)); ZFCP_LOG_DEBUG("reopen of unit 0x%016Lx on port 0x%016Lx " "on adapter %s\n", unit->fcp_lun, unit->port->wwpn, zfcp_get_busid_by_unit(unit)); @@ -640,15 +626,12 @@ zfcp_erp_unit_reopen_internal(struct zfcp_unit *unit, int clear_mask) "on port 0x%016Lx on adapter %s\n", unit->fcp_lun, unit->port->wwpn, zfcp_get_busid_by_unit(unit)); - debug_text_event(adapter->erp_dbf, 5, "u_ro_f"); - debug_event(adapter->erp_dbf, 5, &unit->fcp_lun, - sizeof (fcp_lun_t)); retval = -EIO; goto out; } retval = zfcp_erp_action_enqueue(ZFCP_ERP_ACTION_REOPEN_UNIT, - unit->port->adapter, unit->port, unit); + adapter, unit->port, unit, id, ref); out: return retval; } @@ -663,8 +646,7 @@ zfcp_erp_unit_reopen_internal(struct zfcp_unit *unit, int clear_mask) * locking. An error recovery task is initiated to do the reopen. * To wait for the completion of the reopen zfcp_erp_wait should be used. */ -int -zfcp_erp_unit_reopen(struct zfcp_unit *unit, int clear_mask) +int zfcp_erp_unit_reopen(struct zfcp_unit *unit, int clear_mask, u8 id, void *ref) { int retval; unsigned long flags; @@ -676,7 +658,7 @@ zfcp_erp_unit_reopen(struct zfcp_unit *unit, int clear_mask) read_lock_irqsave(&zfcp_data.config_lock, flags); write_lock(&adapter->erp_lock); - retval = zfcp_erp_unit_reopen_internal(unit, clear_mask); + retval = zfcp_erp_unit_reopen_internal(unit, clear_mask, id, ref); write_unlock(&adapter->erp_lock); read_unlock_irqrestore(&zfcp_data.config_lock, flags); @@ -688,19 +670,43 @@ zfcp_erp_unit_reopen(struct zfcp_unit *unit, int clear_mask) */ static void zfcp_erp_adapter_block(struct zfcp_adapter *adapter, int clear_mask) { - debug_text_event(adapter->erp_dbf, 6, "a_bl"); - zfcp_erp_modify_adapter_status(adapter, + zfcp_erp_modify_adapter_status(adapter, 15, 0, ZFCP_STATUS_COMMON_UNBLOCKED | clear_mask, ZFCP_CLEAR); } +/* FIXME: isn't really atomic */ +/* + * returns the mask which has not been set so far, i.e. + * 0 if no bit has been changed, !0 if some bit has been changed + */ +static int atomic_test_and_set_mask(unsigned long mask, atomic_t *v) +{ + int changed_bits = (atomic_read(v) /*XOR*/^ mask) & mask; + atomic_set_mask(mask, v); + return changed_bits; +} + +/* FIXME: isn't really atomic */ +/* + * returns the mask which has not been cleared so far, i.e. + * 0 if no bit has been changed, !0 if some bit has been changed + */ +static int atomic_test_and_clear_mask(unsigned long mask, atomic_t *v) +{ + int changed_bits = atomic_read(v) & mask; + atomic_clear_mask(mask, v); + return changed_bits; +} + /** * zfcp_erp_adapter_unblock - mark adapter as unblocked, allow scsi requests */ static void zfcp_erp_adapter_unblock(struct zfcp_adapter *adapter) { - debug_text_event(adapter->erp_dbf, 6, "a_ubl"); - atomic_set_mask(ZFCP_STATUS_COMMON_UNBLOCKED, &adapter->status); + if (atomic_test_and_set_mask(ZFCP_STATUS_COMMON_UNBLOCKED, + &adapter->status)) + zfcp_rec_dbf_event_adapter(16, 0, adapter); } /* @@ -715,11 +721,7 @@ static void zfcp_erp_adapter_unblock(struct zfcp_adapter *adapter) static void zfcp_erp_port_block(struct zfcp_port *port, int clear_mask) { - struct zfcp_adapter *adapter = port->adapter; - - debug_text_event(adapter->erp_dbf, 6, "p_bl"); - debug_event(adapter->erp_dbf, 6, &port->wwpn, sizeof (wwn_t)); - zfcp_erp_modify_port_status(port, + zfcp_erp_modify_port_status(port, 17, 0, ZFCP_STATUS_COMMON_UNBLOCKED | clear_mask, ZFCP_CLEAR); } @@ -734,11 +736,9 @@ zfcp_erp_port_block(struct zfcp_port *port, int clear_mask) static void zfcp_erp_port_unblock(struct zfcp_port *port) { - struct zfcp_adapter *adapter = port->adapter; - - debug_text_event(adapter->erp_dbf, 6, "p_ubl"); - debug_event(adapter->erp_dbf, 6, &port->wwpn, sizeof (wwn_t)); - atomic_set_mask(ZFCP_STATUS_COMMON_UNBLOCKED, &port->status); + if (atomic_test_and_set_mask(ZFCP_STATUS_COMMON_UNBLOCKED, + &port->status)) + zfcp_rec_dbf_event_port(18, 0, port); } /* @@ -753,11 +753,7 @@ zfcp_erp_port_unblock(struct zfcp_port *port) static void zfcp_erp_unit_block(struct zfcp_unit *unit, int clear_mask) { - struct zfcp_adapter *adapter = unit->port->adapter; - - debug_text_event(adapter->erp_dbf, 6, "u_bl"); - debug_event(adapter->erp_dbf, 6, &unit->fcp_lun, sizeof (fcp_lun_t)); - zfcp_erp_modify_unit_status(unit, + zfcp_erp_modify_unit_status(unit, 19, 0, ZFCP_STATUS_COMMON_UNBLOCKED | clear_mask, ZFCP_CLEAR); } @@ -772,11 +768,9 @@ zfcp_erp_unit_block(struct zfcp_unit *unit, int clear_mask) static void zfcp_erp_unit_unblock(struct zfcp_unit *unit) { - struct zfcp_adapter *adapter = unit->port->adapter; - - debug_text_event(adapter->erp_dbf, 6, "u_ubl"); - debug_event(adapter->erp_dbf, 6, &unit->fcp_lun, sizeof (fcp_lun_t)); - atomic_set_mask(ZFCP_STATUS_COMMON_UNBLOCKED, &unit->status); + if (atomic_test_and_set_mask(ZFCP_STATUS_COMMON_UNBLOCKED, + &unit->status)) + zfcp_rec_dbf_event_unit(20, 0, unit); } static void @@ -784,11 +778,9 @@ zfcp_erp_action_ready(struct zfcp_erp_action *erp_action) { struct zfcp_adapter *adapter = erp_action->adapter; - debug_text_event(adapter->erp_dbf, 4, "a_ar"); - debug_event(adapter->erp_dbf, 4, &erp_action->action, sizeof (int)); - zfcp_erp_action_to_ready(erp_action); up(&adapter->erp_ready_sem); + zfcp_rec_dbf_event_thread(2, adapter, 0); } /* @@ -852,18 +844,15 @@ zfcp_erp_strategy_check_fsfreq(struct zfcp_erp_action *erp_action) if (zfcp_reqlist_find_safe(adapter, erp_action->fsf_req) && erp_action->fsf_req->erp_action == erp_action) { /* fsf_req still exists */ - debug_text_event(adapter->erp_dbf, 3, "a_ca_req"); - debug_event(adapter->erp_dbf, 3, &erp_action->fsf_req, - sizeof (unsigned long)); /* dismiss fsf_req of timed out/dismissed erp_action */ if (erp_action->status & (ZFCP_STATUS_ERP_DISMISSED | ZFCP_STATUS_ERP_TIMEDOUT)) { - debug_text_event(adapter->erp_dbf, 3, - "a_ca_disreq"); erp_action->fsf_req->status |= ZFCP_STATUS_FSFREQ_DISMISSED; + zfcp_rec_dbf_event_action(142, erp_action); } if (erp_action->status & ZFCP_STATUS_ERP_TIMEDOUT) { + zfcp_rec_dbf_event_action(143, erp_action); ZFCP_LOG_NORMAL("error: erp step timed out " "(action=%d, fsf_req=%p)\n ", erp_action->action, @@ -882,7 +871,6 @@ zfcp_erp_strategy_check_fsfreq(struct zfcp_erp_action *erp_action) erp_action->fsf_req = NULL; } } else { - debug_text_event(adapter->erp_dbf, 3, "a_ca_gonereq"); /* * even if this fsf_req has gone, forget about * association between erp_action and fsf_req @@ -890,8 +878,7 @@ zfcp_erp_strategy_check_fsfreq(struct zfcp_erp_action *erp_action) erp_action->fsf_req = NULL; } spin_unlock(&adapter->req_list_lock); - } else - debug_text_event(adapter->erp_dbf, 3, "a_ca_noreq"); + } } /** @@ -903,19 +890,11 @@ zfcp_erp_strategy_check_fsfreq(struct zfcp_erp_action *erp_action) static void zfcp_erp_async_handler_nolock(struct zfcp_erp_action *erp_action, unsigned long set_mask) { - struct zfcp_adapter *adapter = erp_action->adapter; - if (zfcp_erp_action_exists(erp_action) == ZFCP_ERP_ACTION_RUNNING) { - debug_text_event(adapter->erp_dbf, 2, "a_asyh_ex"); - debug_event(adapter->erp_dbf, 2, &erp_action->action, - sizeof (int)); erp_action->status |= set_mask; zfcp_erp_action_ready(erp_action); } else { /* action is ready or gone - nothing to do */ - debug_text_event(adapter->erp_dbf, 3, "a_asyh_gone"); - debug_event(adapter->erp_dbf, 3, &erp_action->action, - sizeof (int)); } } @@ -942,10 +921,6 @@ static void zfcp_erp_memwait_handler(unsigned long data) { struct zfcp_erp_action *erp_action = (struct zfcp_erp_action *) data; - struct zfcp_adapter *adapter = erp_action->adapter; - - debug_text_event(adapter->erp_dbf, 2, "a_mwh"); - debug_event(adapter->erp_dbf, 2, &erp_action->action, sizeof (int)); zfcp_erp_async_handler(erp_action, 0); } @@ -958,10 +933,6 @@ zfcp_erp_memwait_handler(unsigned long data) void zfcp_erp_timeout_handler(unsigned long data) { struct zfcp_erp_action *erp_action = (struct zfcp_erp_action *) data; - struct zfcp_adapter *adapter = erp_action->adapter; - - debug_text_event(adapter->erp_dbf, 2, "a_th"); - debug_event(adapter->erp_dbf, 2, &erp_action->action, sizeof (int)); zfcp_erp_async_handler(erp_action, ZFCP_STATUS_ERP_TIMEDOUT); } @@ -976,11 +947,6 @@ void zfcp_erp_timeout_handler(unsigned long data) */ static void zfcp_erp_action_dismiss(struct zfcp_erp_action *erp_action) { - struct zfcp_adapter *adapter = erp_action->adapter; - - debug_text_event(adapter->erp_dbf, 2, "a_adis"); - debug_event(adapter->erp_dbf, 2, &erp_action->action, sizeof (int)); - erp_action->status |= ZFCP_STATUS_ERP_DISMISSED; if (zfcp_erp_action_exists(erp_action) == ZFCP_ERP_ACTION_RUNNING) zfcp_erp_action_ready(erp_action); @@ -998,12 +964,10 @@ zfcp_erp_thread_setup(struct zfcp_adapter *adapter) ZFCP_LOG_NORMAL("error: creation of erp thread failed for " "adapter %s\n", zfcp_get_busid_by_adapter(adapter)); - debug_text_event(adapter->erp_dbf, 5, "a_thset_fail"); } else { wait_event(adapter->erp_thread_wqh, atomic_test_mask(ZFCP_STATUS_ADAPTER_ERP_THREAD_UP, &adapter->status)); - debug_text_event(adapter->erp_dbf, 5, "a_thset_ok"); } return (retval < 0); @@ -1030,6 +994,7 @@ zfcp_erp_thread_kill(struct zfcp_adapter *adapter) atomic_set_mask(ZFCP_STATUS_ADAPTER_ERP_THREAD_KILL, &adapter->status); up(&adapter->erp_ready_sem); + zfcp_rec_dbf_event_thread(2, adapter, 1); wait_event(adapter->erp_thread_wqh, !atomic_test_mask(ZFCP_STATUS_ADAPTER_ERP_THREAD_UP, @@ -1038,8 +1003,6 @@ zfcp_erp_thread_kill(struct zfcp_adapter *adapter) atomic_clear_mask(ZFCP_STATUS_ADAPTER_ERP_THREAD_KILL, &adapter->status); - debug_text_event(adapter->erp_dbf, 5, "a_thki_ok"); - return retval; } @@ -1062,7 +1025,6 @@ zfcp_erp_thread(void *data) /* Block all signals */ siginitsetinv(¤t->blocked, 0); atomic_set_mask(ZFCP_STATUS_ADAPTER_ERP_THREAD_UP, &adapter->status); - debug_text_event(adapter->erp_dbf, 5, "a_th_run"); wake_up(&adapter->erp_thread_wqh); while (!atomic_test_mask(ZFCP_STATUS_ADAPTER_ERP_THREAD_KILL, @@ -1087,12 +1049,12 @@ zfcp_erp_thread(void *data) * no action in 'ready' queue to be processed and * thread is not to be killed */ + zfcp_rec_dbf_event_thread(4, adapter, 1); down_interruptible(&adapter->erp_ready_sem); - debug_text_event(adapter->erp_dbf, 5, "a_th_woken"); + zfcp_rec_dbf_event_thread(5, adapter, 1); } atomic_clear_mask(ZFCP_STATUS_ADAPTER_ERP_THREAD_UP, &adapter->status); - debug_text_event(adapter->erp_dbf, 5, "a_th_stop"); wake_up(&adapter->erp_thread_wqh); return 0; @@ -1128,7 +1090,6 @@ zfcp_erp_strategy(struct zfcp_erp_action *erp_action) /* dequeue dismissed action and leave, if required */ retval = zfcp_erp_strategy_check_action(erp_action, retval); if (retval == ZFCP_ERP_DISMISSED) { - debug_text_event(adapter->erp_dbf, 4, "a_st_dis1"); goto unlock; } @@ -1179,20 +1140,17 @@ zfcp_erp_strategy(struct zfcp_erp_action *erp_action) element was timed out. */ if (adapter->erp_total_count == adapter->erp_low_mem_count) { - debug_text_event(adapter->erp_dbf, 3, "a_st_lowmem"); ZFCP_LOG_NORMAL("error: no mempool elements available, " "restarting I/O on adapter %s " "to free mempool\n", zfcp_get_busid_by_adapter(adapter)); - zfcp_erp_adapter_reopen_internal(adapter, 0); + zfcp_erp_adapter_reopen_internal(adapter, 0, 66, 0); } else { - debug_text_event(adapter->erp_dbf, 2, "a_st_memw"); retval = zfcp_erp_strategy_memwait(erp_action); } goto unlock; case ZFCP_ERP_CONTINUES: /* leave since this action runs asynchronously */ - debug_text_event(adapter->erp_dbf, 6, "a_st_cont"); if (erp_action->status & ZFCP_STATUS_ERP_LOWMEM) { --adapter->erp_low_mem_count; erp_action->status &= ~ZFCP_STATUS_ERP_LOWMEM; @@ -1221,7 +1179,6 @@ zfcp_erp_strategy(struct zfcp_erp_action *erp_action) * action is repeated in order to process state change */ if (retval == ZFCP_ERP_EXIT) { - debug_text_event(adapter->erp_dbf, 2, "a_st_exit"); goto unlock; } @@ -1247,8 +1204,6 @@ zfcp_erp_strategy(struct zfcp_erp_action *erp_action) if (retval != ZFCP_ERP_DISMISSED) zfcp_erp_strategy_check_queues(adapter); - debug_text_event(adapter->erp_dbf, 6, "a_st_done"); - return retval; } @@ -1263,17 +1218,12 @@ zfcp_erp_strategy(struct zfcp_erp_action *erp_action) static int zfcp_erp_strategy_check_action(struct zfcp_erp_action *erp_action, int retval) { - struct zfcp_adapter *adapter = erp_action->adapter; - zfcp_erp_strategy_check_fsfreq(erp_action); - debug_event(adapter->erp_dbf, 5, &erp_action->action, sizeof (int)); if (erp_action->status & ZFCP_STATUS_ERP_DISMISSED) { - debug_text_event(adapter->erp_dbf, 3, "a_stcd_dis"); zfcp_erp_action_dequeue(erp_action); retval = ZFCP_ERP_DISMISSED; - } else - debug_text_event(adapter->erp_dbf, 5, "a_stcd_nodis"); + } return retval; } @@ -1282,7 +1232,6 @@ static int zfcp_erp_strategy_do_action(struct zfcp_erp_action *erp_action) { int retval = ZFCP_ERP_FAILED; - struct zfcp_adapter *adapter = erp_action->adapter; /* * try to execute/continue action as far as possible, @@ -1312,9 +1261,6 @@ zfcp_erp_strategy_do_action(struct zfcp_erp_action *erp_action) break; default: - debug_text_exception(adapter->erp_dbf, 1, "a_stda_bug"); - debug_event(adapter->erp_dbf, 1, &erp_action->action, - sizeof (int)); ZFCP_LOG_NORMAL("bug: unknown erp action requested on " "adapter %s (action=%d)\n", zfcp_get_busid_by_adapter(erp_action->adapter), @@ -1336,10 +1282,7 @@ static int zfcp_erp_strategy_memwait(struct zfcp_erp_action *erp_action) { int retval = ZFCP_ERP_CONTINUES; - struct zfcp_adapter *adapter = erp_action->adapter; - debug_text_event(adapter->erp_dbf, 6, "a_mwinit"); - debug_event(adapter->erp_dbf, 6, &erp_action->action, sizeof (int)); init_timer(&erp_action->timer); erp_action->timer.function = zfcp_erp_memwait_handler; erp_action->timer.data = (unsigned long) erp_action; @@ -1356,13 +1299,12 @@ zfcp_erp_strategy_memwait(struct zfcp_erp_action *erp_action) * */ void -zfcp_erp_adapter_failed(struct zfcp_adapter *adapter) +zfcp_erp_adapter_failed(struct zfcp_adapter *adapter, u8 id, void *ref) { - zfcp_erp_modify_adapter_status(adapter, + zfcp_erp_modify_adapter_status(adapter, id, ref, ZFCP_STATUS_COMMON_ERP_FAILED, ZFCP_SET); ZFCP_LOG_NORMAL("adapter erp failed on adapter %s\n", zfcp_get_busid_by_adapter(adapter)); - debug_text_event(adapter->erp_dbf, 2, "a_afail"); } /* @@ -1372,9 +1314,9 @@ zfcp_erp_adapter_failed(struct zfcp_adapter *adapter) * */ void -zfcp_erp_port_failed(struct zfcp_port *port) +zfcp_erp_port_failed(struct zfcp_port *port, u8 id, void *ref) { - zfcp_erp_modify_port_status(port, + zfcp_erp_modify_port_status(port, id, ref, ZFCP_STATUS_COMMON_ERP_FAILED, ZFCP_SET); if (atomic_test_mask(ZFCP_STATUS_PORT_WKA, &port->status)) @@ -1384,9 +1326,6 @@ zfcp_erp_port_failed(struct zfcp_port *port) else ZFCP_LOG_NORMAL("port erp failed (adapter %s, wwpn=0x%016Lx)\n", zfcp_get_busid_by_port(port), port->wwpn); - - debug_text_event(port->adapter->erp_dbf, 2, "p_pfail"); - debug_event(port->adapter->erp_dbf, 2, &port->wwpn, sizeof (wwn_t)); } /* @@ -1396,17 +1335,14 @@ zfcp_erp_port_failed(struct zfcp_port *port) * */ void -zfcp_erp_unit_failed(struct zfcp_unit *unit) +zfcp_erp_unit_failed(struct zfcp_unit *unit, u8 id, void *ref) { - zfcp_erp_modify_unit_status(unit, + zfcp_erp_modify_unit_status(unit, id, ref, ZFCP_STATUS_COMMON_ERP_FAILED, ZFCP_SET); ZFCP_LOG_NORMAL("unit erp failed on unit 0x%016Lx on port 0x%016Lx " " on adapter %s\n", unit->fcp_lun, unit->port->wwpn, zfcp_get_busid_by_unit(unit)); - debug_text_event(unit->port->adapter->erp_dbf, 2, "u_ufail"); - debug_event(unit->port->adapter->erp_dbf, 2, - &unit->fcp_lun, sizeof (fcp_lun_t)); } /* @@ -1430,10 +1366,6 @@ zfcp_erp_strategy_check_target(struct zfcp_erp_action *erp_action, int result) struct zfcp_port *port = erp_action->port; struct zfcp_unit *unit = erp_action->unit; - debug_text_event(adapter->erp_dbf, 5, "a_stct_norm"); - debug_event(adapter->erp_dbf, 5, &erp_action->action, sizeof (int)); - debug_event(adapter->erp_dbf, 5, &result, sizeof (int)); - switch (erp_action->action) { case ZFCP_ERP_ACTION_REOPEN_UNIT: @@ -1460,15 +1392,14 @@ zfcp_erp_strategy_statechange(int action, struct zfcp_port *port, struct zfcp_unit *unit, int retval) { - debug_text_event(adapter->erp_dbf, 3, "a_stsc"); - debug_event(adapter->erp_dbf, 3, &action, sizeof (int)); - switch (action) { case ZFCP_ERP_ACTION_REOPEN_ADAPTER: if (zfcp_erp_strategy_statechange_detected(&adapter->status, status)) { - zfcp_erp_adapter_reopen_internal(adapter, ZFCP_STATUS_COMMON_ERP_FAILED); + zfcp_erp_adapter_reopen_internal(adapter, + ZFCP_STATUS_COMMON_ERP_FAILED, + 67, 0); retval = ZFCP_ERP_EXIT; } break; @@ -1477,7 +1408,9 @@ zfcp_erp_strategy_statechange(int action, case ZFCP_ERP_ACTION_REOPEN_PORT: if (zfcp_erp_strategy_statechange_detected(&port->status, status)) { - zfcp_erp_port_reopen_internal(port, ZFCP_STATUS_COMMON_ERP_FAILED); + zfcp_erp_port_reopen_internal(port, + ZFCP_STATUS_COMMON_ERP_FAILED, + 68, 0); retval = ZFCP_ERP_EXIT; } break; @@ -1485,7 +1418,9 @@ zfcp_erp_strategy_statechange(int action, case ZFCP_ERP_ACTION_REOPEN_UNIT: if (zfcp_erp_strategy_statechange_detected(&unit->status, status)) { - zfcp_erp_unit_reopen_internal(unit, ZFCP_STATUS_COMMON_ERP_FAILED); + zfcp_erp_unit_reopen_internal(unit, + ZFCP_STATUS_COMMON_ERP_FAILED, + 69, 0); retval = ZFCP_ERP_EXIT; } break; @@ -1509,10 +1444,6 @@ zfcp_erp_strategy_statechange_detected(atomic_t * target_status, u32 erp_status) static int zfcp_erp_strategy_check_unit(struct zfcp_unit *unit, int result) { - debug_text_event(unit->port->adapter->erp_dbf, 5, "u_stct"); - debug_event(unit->port->adapter->erp_dbf, 5, &unit->fcp_lun, - sizeof (fcp_lun_t)); - switch (result) { case ZFCP_ERP_SUCCEEDED : atomic_set(&unit->erp_counter, 0); @@ -1521,7 +1452,7 @@ zfcp_erp_strategy_check_unit(struct zfcp_unit *unit, int result) case ZFCP_ERP_FAILED : atomic_inc(&unit->erp_counter); if (atomic_read(&unit->erp_counter) > ZFCP_MAX_ERPS) - zfcp_erp_unit_failed(unit); + zfcp_erp_unit_failed(unit, 21, 0); break; case ZFCP_ERP_EXIT : /* nothing */ @@ -1539,9 +1470,6 @@ zfcp_erp_strategy_check_unit(struct zfcp_unit *unit, int result) static int zfcp_erp_strategy_check_port(struct zfcp_port *port, int result) { - debug_text_event(port->adapter->erp_dbf, 5, "p_stct"); - debug_event(port->adapter->erp_dbf, 5, &port->wwpn, sizeof (wwn_t)); - switch (result) { case ZFCP_ERP_SUCCEEDED : atomic_set(&port->erp_counter, 0); @@ -1550,7 +1478,7 @@ zfcp_erp_strategy_check_port(struct zfcp_port *port, int result) case ZFCP_ERP_FAILED : atomic_inc(&port->erp_counter); if (atomic_read(&port->erp_counter) > ZFCP_MAX_ERPS) - zfcp_erp_port_failed(port); + zfcp_erp_port_failed(port, 22, 0); break; case ZFCP_ERP_EXIT : /* nothing */ @@ -1568,8 +1496,6 @@ zfcp_erp_strategy_check_port(struct zfcp_port *port, int result) static int zfcp_erp_strategy_check_adapter(struct zfcp_adapter *adapter, int result) { - debug_text_event(adapter->erp_dbf, 5, "a_stct"); - switch (result) { case ZFCP_ERP_SUCCEEDED : atomic_set(&adapter->erp_counter, 0); @@ -1578,7 +1504,7 @@ zfcp_erp_strategy_check_adapter(struct zfcp_adapter *adapter, int result) case ZFCP_ERP_FAILED : atomic_inc(&adapter->erp_counter); if (atomic_read(&adapter->erp_counter) > ZFCP_MAX_ERPS) - zfcp_erp_adapter_failed(adapter); + zfcp_erp_adapter_failed(adapter, 23, 0); break; case ZFCP_ERP_EXIT : /* nothing */ @@ -1661,37 +1587,34 @@ zfcp_erp_strategy_followup_actions(int action, struct zfcp_port *port, struct zfcp_unit *unit, int status) { - debug_text_event(adapter->erp_dbf, 5, "a_stfol"); - debug_event(adapter->erp_dbf, 5, &action, sizeof (int)); - /* initiate follow-up actions depending on success of finished action */ switch (action) { case ZFCP_ERP_ACTION_REOPEN_ADAPTER: if (status == ZFCP_ERP_SUCCEEDED) - zfcp_erp_port_reopen_all_internal(adapter, 0); + zfcp_erp_port_reopen_all_internal(adapter, 0, 70, 0); else - zfcp_erp_adapter_reopen_internal(adapter, 0); + zfcp_erp_adapter_reopen_internal(adapter, 0, 71, 0); break; case ZFCP_ERP_ACTION_REOPEN_PORT_FORCED: if (status == ZFCP_ERP_SUCCEEDED) - zfcp_erp_port_reopen_internal(port, 0); + zfcp_erp_port_reopen_internal(port, 0, 72, 0); else - zfcp_erp_adapter_reopen_internal(adapter, 0); + zfcp_erp_adapter_reopen_internal(adapter, 0, 73, 0); break; case ZFCP_ERP_ACTION_REOPEN_PORT: if (status == ZFCP_ERP_SUCCEEDED) - zfcp_erp_unit_reopen_all_internal(port, 0); + zfcp_erp_unit_reopen_all_internal(port, 0, 74, 0); else - zfcp_erp_port_forced_reopen_internal(port, 0); + zfcp_erp_port_forced_reopen_internal(port, 0, 75, 0); break; case ZFCP_ERP_ACTION_REOPEN_UNIT: if (status == ZFCP_ERP_SUCCEEDED) ; /* no further action */ else - zfcp_erp_port_reopen_internal(unit->port, 0); + zfcp_erp_port_reopen_internal(unit->port, 0, 76, 0); break; } @@ -1707,12 +1630,10 @@ zfcp_erp_strategy_check_queues(struct zfcp_adapter *adapter) read_lock(&adapter->erp_lock); if (list_empty(&adapter->erp_ready_head) && list_empty(&adapter->erp_running_head)) { - debug_text_event(adapter->erp_dbf, 4, "a_cq_wake"); atomic_clear_mask(ZFCP_STATUS_ADAPTER_ERP_PENDING, &adapter->status); wake_up(&adapter->erp_done_wqh); - } else - debug_text_event(adapter->erp_dbf, 5, "a_cq_notempty"); + } read_unlock(&adapter->erp_lock); read_unlock_irqrestore(&zfcp_data.config_lock, flags); @@ -1736,29 +1657,27 @@ zfcp_erp_wait(struct zfcp_adapter *adapter) return retval; } -void -zfcp_erp_modify_adapter_status(struct zfcp_adapter *adapter, - u32 mask, int set_or_clear) +void zfcp_erp_modify_adapter_status(struct zfcp_adapter *adapter, u8 id, + void *ref, u32 mask, int set_or_clear) { struct zfcp_port *port; - u32 common_mask = mask & ZFCP_COMMON_FLAGS; + u32 changed, common_mask = mask & ZFCP_COMMON_FLAGS; if (set_or_clear == ZFCP_SET) { - atomic_set_mask(mask, &adapter->status); - debug_text_event(adapter->erp_dbf, 3, "a_mod_as_s"); + changed = atomic_test_and_set_mask(mask, &adapter->status); } else { - atomic_clear_mask(mask, &adapter->status); + changed = atomic_test_and_clear_mask(mask, &adapter->status); if (mask & ZFCP_STATUS_COMMON_ERP_FAILED) atomic_set(&adapter->erp_counter, 0); - debug_text_event(adapter->erp_dbf, 3, "a_mod_as_c"); } - debug_event(adapter->erp_dbf, 3, &mask, sizeof (u32)); + if (changed) + zfcp_rec_dbf_event_adapter(id, ref, adapter); /* Deal with all underlying devices, only pass common_mask */ if (common_mask) list_for_each_entry(port, &adapter->port_list_head, list) - zfcp_erp_modify_port_status(port, common_mask, - set_or_clear); + zfcp_erp_modify_port_status(port, id, ref, common_mask, + set_or_clear); } /* @@ -1767,29 +1686,27 @@ zfcp_erp_modify_adapter_status(struct zfcp_adapter *adapter, * purpose: sets the port and all underlying devices to ERP_FAILED * */ -void -zfcp_erp_modify_port_status(struct zfcp_port *port, u32 mask, int set_or_clear) +void zfcp_erp_modify_port_status(struct zfcp_port *port, u8 id, void *ref, + u32 mask, int set_or_clear) { struct zfcp_unit *unit; - u32 common_mask = mask & ZFCP_COMMON_FLAGS; + u32 changed, common_mask = mask & ZFCP_COMMON_FLAGS; if (set_or_clear == ZFCP_SET) { - atomic_set_mask(mask, &port->status); - debug_text_event(port->adapter->erp_dbf, 3, "p_mod_ps_s"); + changed = atomic_test_and_set_mask(mask, &port->status); } else { - atomic_clear_mask(mask, &port->status); + changed = atomic_test_and_clear_mask(mask, &port->status); if (mask & ZFCP_STATUS_COMMON_ERP_FAILED) atomic_set(&port->erp_counter, 0); - debug_text_event(port->adapter->erp_dbf, 3, "p_mod_ps_c"); } - debug_event(port->adapter->erp_dbf, 3, &port->wwpn, sizeof (wwn_t)); - debug_event(port->adapter->erp_dbf, 3, &mask, sizeof (u32)); + if (changed) + zfcp_rec_dbf_event_port(id, ref, port); /* Modify status of all underlying devices, only pass common mask */ if (common_mask) list_for_each_entry(unit, &port->unit_list_head, list) - zfcp_erp_modify_unit_status(unit, common_mask, - set_or_clear); + zfcp_erp_modify_unit_status(unit, id, ref, common_mask, + set_or_clear); } /* @@ -1798,22 +1715,21 @@ zfcp_erp_modify_port_status(struct zfcp_port *port, u32 mask, int set_or_clear) * purpose: sets the unit to ERP_FAILED * */ -void -zfcp_erp_modify_unit_status(struct zfcp_unit *unit, u32 mask, int set_or_clear) +void zfcp_erp_modify_unit_status(struct zfcp_unit *unit, u8 id, void *ref, + u32 mask, int set_or_clear) { + u32 changed; + if (set_or_clear == ZFCP_SET) { - atomic_set_mask(mask, &unit->status); - debug_text_event(unit->port->adapter->erp_dbf, 3, "u_mod_us_s"); + changed = atomic_test_and_set_mask(mask, &unit->status); } else { - atomic_clear_mask(mask, &unit->status); + changed = atomic_test_and_clear_mask(mask, &unit->status); if (mask & ZFCP_STATUS_COMMON_ERP_FAILED) { atomic_set(&unit->erp_counter, 0); } - debug_text_event(unit->port->adapter->erp_dbf, 3, "u_mod_us_c"); } - debug_event(unit->port->adapter->erp_dbf, 3, &unit->fcp_lun, - sizeof (fcp_lun_t)); - debug_event(unit->port->adapter->erp_dbf, 3, &mask, sizeof (u32)); + if (changed) + zfcp_rec_dbf_event_unit(id, ref, unit); } /* @@ -1825,30 +1741,32 @@ zfcp_erp_modify_unit_status(struct zfcp_unit *unit, u32 mask, int set_or_clear) * returns: 0 - initiated action successfully * <0 - failed to initiate action */ -int -zfcp_erp_port_reopen_all(struct zfcp_adapter *adapter, int clear_mask) +int zfcp_erp_port_reopen_all(struct zfcp_adapter *adapter, int clear_mask, + u8 id, void *ref) { int retval; unsigned long flags; read_lock_irqsave(&zfcp_data.config_lock, flags); write_lock(&adapter->erp_lock); - retval = zfcp_erp_port_reopen_all_internal(adapter, clear_mask); + retval = zfcp_erp_port_reopen_all_internal(adapter, clear_mask, id, + ref); write_unlock(&adapter->erp_lock); read_unlock_irqrestore(&zfcp_data.config_lock, flags); return retval; } -static int -zfcp_erp_port_reopen_all_internal(struct zfcp_adapter *adapter, int clear_mask) +static int zfcp_erp_port_reopen_all_internal(struct zfcp_adapter *adapter, + int clear_mask, u8 id, void *ref) { int retval = 0; struct zfcp_port *port; list_for_each_entry(port, &adapter->port_list_head, list) if (!atomic_test_mask(ZFCP_STATUS_PORT_WKA, &port->status)) - zfcp_erp_port_reopen_internal(port, clear_mask); + zfcp_erp_port_reopen_internal(port, clear_mask, id, + ref); return retval; } @@ -1860,14 +1778,14 @@ zfcp_erp_port_reopen_all_internal(struct zfcp_adapter *adapter, int clear_mask) * * returns: FIXME */ -static int -zfcp_erp_unit_reopen_all_internal(struct zfcp_port *port, int clear_mask) +static int zfcp_erp_unit_reopen_all_internal(struct zfcp_port *port, + int clear_mask, u8 id, void *ref) { int retval = 0; struct zfcp_unit *unit; list_for_each_entry(unit, &port->unit_list_head, list) - zfcp_erp_unit_reopen_internal(unit, clear_mask); + zfcp_erp_unit_reopen_internal(unit, clear_mask, id, ref); return retval; } @@ -1895,10 +1813,6 @@ zfcp_erp_adapter_strategy(struct zfcp_erp_action *erp_action) else retval = zfcp_erp_adapter_strategy_open(erp_action); - debug_text_event(adapter->erp_dbf, 3, "a_ast/ret"); - debug_event(adapter->erp_dbf, 3, &erp_action->action, sizeof (int)); - debug_event(adapter->erp_dbf, 3, &retval, sizeof (int)); - if (retval == ZFCP_ERP_FAILED) { ZFCP_LOG_INFO("Waiting to allow the adapter %s " "to recover itself\n", @@ -2024,7 +1938,6 @@ zfcp_erp_adapter_strategy_open_qdio(struct zfcp_erp_action *erp_action) zfcp_get_busid_by_adapter(adapter)); goto failed_qdio_establish; } - debug_text_event(adapter->erp_dbf, 3, "qdio_est"); if (qdio_activate(adapter->ccw_device, 0) != 0) { ZFCP_LOG_INFO("error: activation of QDIO queues failed " @@ -2032,7 +1945,6 @@ zfcp_erp_adapter_strategy_open_qdio(struct zfcp_erp_action *erp_action) zfcp_get_busid_by_adapter(adapter)); goto failed_qdio_activate; } - debug_text_event(adapter->erp_dbf, 3, "qdio_act"); /* * put buffers into response queue, @@ -2080,11 +1992,9 @@ zfcp_erp_adapter_strategy_open_qdio(struct zfcp_erp_action *erp_action) /* NOP */ failed_qdio_activate: - debug_text_event(adapter->erp_dbf, 3, "qdio_down1a"); while (qdio_shutdown(adapter->ccw_device, QDIO_FLAG_CLEANUP_USING_CLEAR) == -EINPROGRESS) msleep(1000); - debug_text_event(adapter->erp_dbf, 3, "qdio_down1b"); failed_qdio_establish: failed_sanity: @@ -2130,14 +2040,12 @@ zfcp_erp_adapter_strategy_open_fsf_xconfig(struct zfcp_erp_action *erp_action) write_unlock_irq(&adapter->erp_lock); if (zfcp_fsf_exchange_config_data(erp_action)) { retval = ZFCP_ERP_FAILED; - debug_text_event(adapter->erp_dbf, 5, "a_fstx_xf"); ZFCP_LOG_INFO("error: initiation of exchange of " "configuration data failed for " "adapter %s\n", zfcp_get_busid_by_adapter(adapter)); break; } - debug_text_event(adapter->erp_dbf, 6, "a_fstx_xok"); ZFCP_LOG_DEBUG("Xchange underway\n"); /* @@ -2153,7 +2061,9 @@ zfcp_erp_adapter_strategy_open_fsf_xconfig(struct zfcp_erp_action *erp_action) * _must_ be the one belonging to the 'exchange config * data' request. */ + zfcp_rec_dbf_event_thread(6, adapter, 1); down(&adapter->erp_ready_sem); + zfcp_rec_dbf_event_thread(7, adapter, 1); if (erp_action->status & ZFCP_STATUS_ERP_TIMEDOUT) { ZFCP_LOG_INFO("error: exchange of configuration data " "for adapter %s timed out\n", @@ -2201,16 +2111,15 @@ zfcp_erp_adapter_strategy_open_fsf_xport(struct zfcp_erp_action *erp_action) ret = zfcp_fsf_exchange_port_data(erp_action, adapter, NULL); if (ret == -EOPNOTSUPP) { - debug_text_event(adapter->erp_dbf, 3, "a_xport_notsupp"); return ZFCP_ERP_SUCCEEDED; } else if (ret) { - debug_text_event(adapter->erp_dbf, 3, "a_xport_failed"); return ZFCP_ERP_FAILED; } - debug_text_event(adapter->erp_dbf, 6, "a_xport_ok"); ret = ZFCP_ERP_SUCCEEDED; + zfcp_rec_dbf_event_thread(8, adapter, 1); down(&adapter->erp_ready_sem); + zfcp_rec_dbf_event_thread(9, adapter, 1); if (erp_action->status & ZFCP_STATUS_ERP_TIMEDOUT) { ZFCP_LOG_INFO("error: exchange port data timed out (adapter " "%s)\n", zfcp_get_busid_by_adapter(adapter)); @@ -2264,7 +2173,6 @@ zfcp_erp_port_forced_strategy(struct zfcp_erp_action *erp_action) { int retval = ZFCP_ERP_FAILED; struct zfcp_port *port = erp_action->port; - struct zfcp_adapter *adapter = erp_action->adapter; switch (erp_action->step) { @@ -2301,11 +2209,6 @@ zfcp_erp_port_forced_strategy(struct zfcp_erp_action *erp_action) break; } - debug_text_event(adapter->erp_dbf, 3, "p_pfst/ret"); - debug_event(adapter->erp_dbf, 3, &port->wwpn, sizeof (wwn_t)); - debug_event(adapter->erp_dbf, 3, &erp_action->action, sizeof (int)); - debug_event(adapter->erp_dbf, 3, &retval, sizeof (int)); - return retval; } @@ -2323,7 +2226,6 @@ zfcp_erp_port_strategy(struct zfcp_erp_action *erp_action) { int retval = ZFCP_ERP_FAILED; struct zfcp_port *port = erp_action->port; - struct zfcp_adapter *adapter = erp_action->adapter; switch (erp_action->step) { @@ -2356,11 +2258,6 @@ zfcp_erp_port_strategy(struct zfcp_erp_action *erp_action) retval = zfcp_erp_port_strategy_open(erp_action); out: - debug_text_event(adapter->erp_dbf, 3, "p_pst/ret"); - debug_event(adapter->erp_dbf, 3, &port->wwpn, sizeof (wwn_t)); - debug_event(adapter->erp_dbf, 3, &erp_action->action, sizeof (int)); - debug_event(adapter->erp_dbf, 3, &retval, sizeof (int)); - return retval; } @@ -2398,7 +2295,7 @@ zfcp_erp_port_strategy_open_common(struct zfcp_erp_action *erp_action) port->wwpn, zfcp_get_busid_by_adapter(adapter), adapter->peer_wwpn); - zfcp_erp_port_failed(port); + zfcp_erp_port_failed(port, 25, 0); retval = ZFCP_ERP_FAILED; break; } @@ -2424,8 +2321,8 @@ zfcp_erp_port_strategy_open_common(struct zfcp_erp_action *erp_action) /* nameserver port may live again */ atomic_set_mask(ZFCP_STATUS_COMMON_RUNNING, &adapter->nameserver_port->status); - if (zfcp_erp_port_reopen(adapter->nameserver_port, 0) - >= 0) { + if (zfcp_erp_port_reopen(adapter->nameserver_port, 0, + 77, erp_action) >= 0) { erp_action->step = ZFCP_ERP_STEP_NAMESERVER_OPEN; retval = ZFCP_ERP_CONTINUES; @@ -2456,7 +2353,7 @@ zfcp_erp_port_strategy_open_common(struct zfcp_erp_action *erp_action) "for port 0x%016Lx " "(misconfigured WWPN?)\n", port->wwpn); - zfcp_erp_port_failed(port); + zfcp_erp_port_failed(port, 26, 0); retval = ZFCP_ERP_EXIT; } else { ZFCP_LOG_DEBUG("nameserver look-up failed for " @@ -2552,17 +2449,11 @@ zfcp_erp_port_strategy_open_nameserver_wakeup(struct zfcp_erp_action read_lock_irqsave(&adapter->erp_lock, flags); list_for_each_entry_safe(erp_action, tmp, &adapter->erp_running_head, list) { - debug_text_event(adapter->erp_dbf, 4, "p_pstnsw_n"); - debug_event(adapter->erp_dbf, 4, &erp_action->port->wwpn, - sizeof (wwn_t)); if (erp_action->step == ZFCP_ERP_STEP_NAMESERVER_OPEN) { - debug_text_event(adapter->erp_dbf, 3, "p_pstnsw_w"); - debug_event(adapter->erp_dbf, 3, - &erp_action->port->wwpn, sizeof (wwn_t)); if (atomic_test_mask( ZFCP_STATUS_COMMON_ERP_FAILED, &adapter->nameserver_port->status)) - zfcp_erp_port_failed(erp_action->port); + zfcp_erp_port_failed(erp_action->port, 27, 0); zfcp_erp_action_ready(erp_action); } } @@ -2583,26 +2474,18 @@ static int zfcp_erp_port_forced_strategy_close(struct zfcp_erp_action *erp_action) { int retval; - struct zfcp_adapter *adapter = erp_action->adapter; - struct zfcp_port *port = erp_action->port; retval = zfcp_fsf_close_physical_port(erp_action); if (retval == -ENOMEM) { - debug_text_event(adapter->erp_dbf, 5, "o_pfstc_nomem"); - debug_event(adapter->erp_dbf, 5, &port->wwpn, sizeof (wwn_t)); retval = ZFCP_ERP_NOMEM; goto out; } erp_action->step = ZFCP_ERP_STEP_PHYS_PORT_CLOSING; if (retval != 0) { - debug_text_event(adapter->erp_dbf, 5, "o_pfstc_cpf"); - debug_event(adapter->erp_dbf, 5, &port->wwpn, sizeof (wwn_t)); /* could not send 'open', fail */ retval = ZFCP_ERP_FAILED; goto out; } - debug_text_event(adapter->erp_dbf, 6, "o_pfstc_cpok"); - debug_event(adapter->erp_dbf, 6, &port->wwpn, sizeof (wwn_t)); retval = ZFCP_ERP_CONTINUES; out: return retval; @@ -2612,10 +2495,6 @@ static int zfcp_erp_port_strategy_clearstati(struct zfcp_port *port) { int retval = 0; - struct zfcp_adapter *adapter = port->adapter; - - debug_text_event(adapter->erp_dbf, 5, "p_pstclst"); - debug_event(adapter->erp_dbf, 5, &port->wwpn, sizeof (wwn_t)); atomic_clear_mask(ZFCP_STATUS_COMMON_OPENING | ZFCP_STATUS_COMMON_CLOSING | @@ -2639,26 +2518,18 @@ static int zfcp_erp_port_strategy_close(struct zfcp_erp_action *erp_action) { int retval; - struct zfcp_adapter *adapter = erp_action->adapter; - struct zfcp_port *port = erp_action->port; retval = zfcp_fsf_close_port(erp_action); if (retval == -ENOMEM) { - debug_text_event(adapter->erp_dbf, 5, "p_pstc_nomem"); - debug_event(adapter->erp_dbf, 5, &port->wwpn, sizeof (wwn_t)); retval = ZFCP_ERP_NOMEM; goto out; } erp_action->step = ZFCP_ERP_STEP_PORT_CLOSING; if (retval != 0) { - debug_text_event(adapter->erp_dbf, 5, "p_pstc_cpf"); - debug_event(adapter->erp_dbf, 5, &port->wwpn, sizeof (wwn_t)); /* could not send 'close', fail */ retval = ZFCP_ERP_FAILED; goto out; } - debug_text_event(adapter->erp_dbf, 6, "p_pstc_cpok"); - debug_event(adapter->erp_dbf, 6, &port->wwpn, sizeof (wwn_t)); retval = ZFCP_ERP_CONTINUES; out: return retval; @@ -2676,26 +2547,18 @@ static int zfcp_erp_port_strategy_open_port(struct zfcp_erp_action *erp_action) { int retval; - struct zfcp_adapter *adapter = erp_action->adapter; - struct zfcp_port *port = erp_action->port; retval = zfcp_fsf_open_port(erp_action); if (retval == -ENOMEM) { - debug_text_event(adapter->erp_dbf, 5, "p_psto_nomem"); - debug_event(adapter->erp_dbf, 5, &port->wwpn, sizeof (wwn_t)); retval = ZFCP_ERP_NOMEM; goto out; } erp_action->step = ZFCP_ERP_STEP_PORT_OPENING; if (retval != 0) { - debug_text_event(adapter->erp_dbf, 5, "p_psto_opf"); - debug_event(adapter->erp_dbf, 5, &port->wwpn, sizeof (wwn_t)); /* could not send 'open', fail */ retval = ZFCP_ERP_FAILED; goto out; } - debug_text_event(adapter->erp_dbf, 6, "p_psto_opok"); - debug_event(adapter->erp_dbf, 6, &port->wwpn, sizeof (wwn_t)); retval = ZFCP_ERP_CONTINUES; out: return retval; @@ -2713,26 +2576,18 @@ static int zfcp_erp_port_strategy_open_common_lookup(struct zfcp_erp_action *erp_action) { int retval; - struct zfcp_adapter *adapter = erp_action->adapter; - struct zfcp_port *port = erp_action->port; retval = zfcp_ns_gid_pn_request(erp_action); if (retval == -ENOMEM) { - debug_text_event(adapter->erp_dbf, 5, "p_pstn_nomem"); - debug_event(adapter->erp_dbf, 5, &port->wwpn, sizeof (wwn_t)); retval = ZFCP_ERP_NOMEM; goto out; } erp_action->step = ZFCP_ERP_STEP_NAMESERVER_LOOKUP; if (retval != 0) { - debug_text_event(adapter->erp_dbf, 5, "p_pstn_ref"); - debug_event(adapter->erp_dbf, 5, &port->wwpn, sizeof (wwn_t)); /* could not send nameserver request, fail */ retval = ZFCP_ERP_FAILED; goto out; } - debug_text_event(adapter->erp_dbf, 6, "p_pstn_reok"); - debug_event(adapter->erp_dbf, 6, &port->wwpn, sizeof (wwn_t)); retval = ZFCP_ERP_CONTINUES; out: return retval; @@ -2753,7 +2608,6 @@ zfcp_erp_unit_strategy(struct zfcp_erp_action *erp_action) { int retval = ZFCP_ERP_FAILED; struct zfcp_unit *unit = erp_action->unit; - struct zfcp_adapter *adapter = erp_action->adapter; switch (erp_action->step) { @@ -2800,10 +2654,6 @@ zfcp_erp_unit_strategy(struct zfcp_erp_action *erp_action) break; } - debug_text_event(adapter->erp_dbf, 3, "u_ust/ret"); - debug_event(adapter->erp_dbf, 3, &unit->fcp_lun, sizeof (fcp_lun_t)); - debug_event(adapter->erp_dbf, 3, &erp_action->action, sizeof (int)); - debug_event(adapter->erp_dbf, 3, &retval, sizeof (int)); return retval; } @@ -2811,10 +2661,6 @@ static int zfcp_erp_unit_strategy_clearstati(struct zfcp_unit *unit) { int retval = 0; - struct zfcp_adapter *adapter = unit->port->adapter; - - debug_text_event(adapter->erp_dbf, 5, "u_ustclst"); - debug_event(adapter->erp_dbf, 5, &unit->fcp_lun, sizeof (fcp_lun_t)); atomic_clear_mask(ZFCP_STATUS_COMMON_OPENING | ZFCP_STATUS_COMMON_CLOSING | @@ -2838,28 +2684,18 @@ static int zfcp_erp_unit_strategy_close(struct zfcp_erp_action *erp_action) { int retval; - struct zfcp_adapter *adapter = erp_action->adapter; - struct zfcp_unit *unit = erp_action->unit; retval = zfcp_fsf_close_unit(erp_action); if (retval == -ENOMEM) { - debug_text_event(adapter->erp_dbf, 5, "u_ustc_nomem"); - debug_event(adapter->erp_dbf, 5, &unit->fcp_lun, - sizeof (fcp_lun_t)); retval = ZFCP_ERP_NOMEM; goto out; } erp_action->step = ZFCP_ERP_STEP_UNIT_CLOSING; if (retval != 0) { - debug_text_event(adapter->erp_dbf, 5, "u_ustc_cuf"); - debug_event(adapter->erp_dbf, 5, &unit->fcp_lun, - sizeof (fcp_lun_t)); /* could not send 'close', fail */ retval = ZFCP_ERP_FAILED; goto out; } - debug_text_event(adapter->erp_dbf, 6, "u_ustc_cuok"); - debug_event(adapter->erp_dbf, 6, &unit->fcp_lun, sizeof (fcp_lun_t)); retval = ZFCP_ERP_CONTINUES; out: @@ -2878,28 +2714,18 @@ static int zfcp_erp_unit_strategy_open(struct zfcp_erp_action *erp_action) { int retval; - struct zfcp_adapter *adapter = erp_action->adapter; - struct zfcp_unit *unit = erp_action->unit; retval = zfcp_fsf_open_unit(erp_action); if (retval == -ENOMEM) { - debug_text_event(adapter->erp_dbf, 5, "u_usto_nomem"); - debug_event(adapter->erp_dbf, 5, &unit->fcp_lun, - sizeof (fcp_lun_t)); retval = ZFCP_ERP_NOMEM; goto out; } erp_action->step = ZFCP_ERP_STEP_UNIT_OPENING; if (retval != 0) { - debug_text_event(adapter->erp_dbf, 5, "u_usto_ouf"); - debug_event(adapter->erp_dbf, 5, &unit->fcp_lun, - sizeof (fcp_lun_t)); /* could not send 'open', fail */ retval = ZFCP_ERP_FAILED; goto out; } - debug_text_event(adapter->erp_dbf, 6, "u_usto_ouok"); - debug_event(adapter->erp_dbf, 6, &unit->fcp_lun, sizeof (fcp_lun_t)); retval = ZFCP_ERP_CONTINUES; out: return retval; @@ -2921,14 +2747,12 @@ void zfcp_erp_start_timer(struct zfcp_fsf_req *fsf_req) * * returns: */ -static int -zfcp_erp_action_enqueue(int action, - struct zfcp_adapter *adapter, - struct zfcp_port *port, struct zfcp_unit *unit) +static int zfcp_erp_action_enqueue(int want, struct zfcp_adapter *adapter, + struct zfcp_port *port, + struct zfcp_unit *unit, u8 id, void *ref) { - int retval = 1; + int retval = 1, need = want; struct zfcp_erp_action *erp_action = NULL; - int stronger_action = 0; u32 status = 0; /* @@ -2947,17 +2771,11 @@ zfcp_erp_action_enqueue(int action, &adapter->status)) return -EIO; - debug_event(adapter->erp_dbf, 4, &action, sizeof (int)); /* check whether we really need this */ - switch (action) { + switch (want) { case ZFCP_ERP_ACTION_REOPEN_UNIT: if (atomic_test_mask (ZFCP_STATUS_COMMON_ERP_INUSE, &unit->status)) { - debug_text_event(adapter->erp_dbf, 4, "u_actenq_drp"); - debug_event(adapter->erp_dbf, 4, &port->wwpn, - sizeof (wwn_t)); - debug_event(adapter->erp_dbf, 4, &unit->fcp_lun, - sizeof (fcp_lun_t)); goto out; } if (!atomic_test_mask @@ -2967,18 +2785,13 @@ zfcp_erp_action_enqueue(int action, goto out; } if (!atomic_test_mask - (ZFCP_STATUS_COMMON_UNBLOCKED, &port->status)) { - stronger_action = ZFCP_ERP_ACTION_REOPEN_PORT; - unit = NULL; - } + (ZFCP_STATUS_COMMON_UNBLOCKED, &port->status)) + need = ZFCP_ERP_ACTION_REOPEN_PORT; /* fall through !!! */ case ZFCP_ERP_ACTION_REOPEN_PORT: if (atomic_test_mask (ZFCP_STATUS_COMMON_ERP_INUSE, &port->status)) { - debug_text_event(adapter->erp_dbf, 4, "p_actenq_drp"); - debug_event(adapter->erp_dbf, 4, &port->wwpn, - sizeof (wwn_t)); goto out; } /* fall through !!! */ @@ -2990,15 +2803,9 @@ zfcp_erp_action_enqueue(int action, ZFCP_ERP_ACTION_REOPEN_PORT_FORCED) { ZFCP_LOG_INFO("dropped erp action %i (port " "0x%016Lx, action in use: %i)\n", - action, port->wwpn, + want, port->wwpn, port->erp_action.action); - debug_text_event(adapter->erp_dbf, 4, - "pf_actenq_drp"); - } else - debug_text_event(adapter->erp_dbf, 4, - "pf_actenq_drpcp"); - debug_event(adapter->erp_dbf, 4, &port->wwpn, - sizeof (wwn_t)); + } goto out; } if (!atomic_test_mask @@ -3008,46 +2815,36 @@ zfcp_erp_action_enqueue(int action, goto out; } if (!atomic_test_mask - (ZFCP_STATUS_COMMON_UNBLOCKED, &adapter->status)) { - stronger_action = ZFCP_ERP_ACTION_REOPEN_ADAPTER; - port = NULL; - } + (ZFCP_STATUS_COMMON_UNBLOCKED, &adapter->status)) + need = ZFCP_ERP_ACTION_REOPEN_ADAPTER; /* fall through !!! */ case ZFCP_ERP_ACTION_REOPEN_ADAPTER: if (atomic_test_mask (ZFCP_STATUS_COMMON_ERP_INUSE, &adapter->status)) { - debug_text_event(adapter->erp_dbf, 4, "a_actenq_drp"); goto out; } break; default: - debug_text_exception(adapter->erp_dbf, 1, "a_actenq_bug"); - debug_event(adapter->erp_dbf, 1, &action, sizeof (int)); ZFCP_LOG_NORMAL("bug: unknown erp action requested " "on adapter %s (action=%d)\n", - zfcp_get_busid_by_adapter(adapter), action); + zfcp_get_busid_by_adapter(adapter), want); goto out; } /* check whether we need something stronger first */ - if (stronger_action) { - debug_text_event(adapter->erp_dbf, 4, "a_actenq_str"); - debug_event(adapter->erp_dbf, 4, &stronger_action, - sizeof (int)); + if (need) { ZFCP_LOG_DEBUG("stronger erp action %d needed before " "erp action %d on adapter %s\n", - stronger_action, action, - zfcp_get_busid_by_adapter(adapter)); - action = stronger_action; + need, want, zfcp_get_busid_by_adapter(adapter)); } /* mark adapter to have some error recovery pending */ atomic_set_mask(ZFCP_STATUS_ADAPTER_ERP_PENDING, &adapter->status); /* setup error recovery action */ - switch (action) { + switch (need) { case ZFCP_ERP_ACTION_REOPEN_UNIT: zfcp_unit_get(unit); @@ -3080,13 +2877,11 @@ zfcp_erp_action_enqueue(int action, break; } - debug_text_event(adapter->erp_dbf, 4, "a_actenq"); - memset(erp_action, 0, sizeof (struct zfcp_erp_action)); erp_action->adapter = adapter; erp_action->port = port; erp_action->unit = unit; - erp_action->action = action; + erp_action->action = need; erp_action->status = status; ++adapter->erp_total_count; @@ -3094,8 +2889,11 @@ zfcp_erp_action_enqueue(int action, /* finally put it into 'ready' queue and kick erp thread */ list_add_tail(&erp_action->list, &adapter->erp_ready_head); up(&adapter->erp_ready_sem); + zfcp_rec_dbf_event_thread(1, adapter, 0); retval = 0; out: + zfcp_rec_dbf_event_trigger(id, ref, want, need, erp_action, + adapter, port, unit); return retval; } @@ -3111,9 +2909,9 @@ zfcp_erp_action_dequeue(struct zfcp_erp_action *erp_action) erp_action->status &= ~ZFCP_STATUS_ERP_LOWMEM; } - debug_text_event(adapter->erp_dbf, 4, "a_actdeq"); - debug_event(adapter->erp_dbf, 4, &erp_action->action, sizeof (int)); list_del(&erp_action->list); + zfcp_rec_dbf_event_action(144, erp_action); + switch (erp_action->action) { case ZFCP_ERP_ACTION_REOPEN_UNIT: atomic_clear_mask(ZFCP_STATUS_COMMON_ERP_INUSE, @@ -3222,7 +3020,6 @@ static void zfcp_erp_action_dismiss_adapter(struct zfcp_adapter *adapter) { struct zfcp_port *port; - debug_text_event(adapter->erp_dbf, 5, "a_actab"); if (atomic_test_mask(ZFCP_STATUS_COMMON_ERP_INUSE, &adapter->status)) zfcp_erp_action_dismiss(&adapter->erp_action); else @@ -3233,10 +3030,7 @@ static void zfcp_erp_action_dismiss_adapter(struct zfcp_adapter *adapter) static void zfcp_erp_action_dismiss_port(struct zfcp_port *port) { struct zfcp_unit *unit; - struct zfcp_adapter *adapter = port->adapter; - debug_text_event(adapter->erp_dbf, 5, "p_actab"); - debug_event(adapter->erp_dbf, 5, &port->wwpn, sizeof (wwn_t)); if (atomic_test_mask(ZFCP_STATUS_COMMON_ERP_INUSE, &port->status)) zfcp_erp_action_dismiss(&port->erp_action); else @@ -3246,10 +3040,6 @@ static void zfcp_erp_action_dismiss_port(struct zfcp_port *port) static void zfcp_erp_action_dismiss_unit(struct zfcp_unit *unit) { - struct zfcp_adapter *adapter = unit->port->adapter; - - debug_text_event(adapter->erp_dbf, 5, "u_actab"); - debug_event(adapter->erp_dbf, 5, &unit->fcp_lun, sizeof (fcp_lun_t)); if (atomic_test_mask(ZFCP_STATUS_COMMON_ERP_INUSE, &unit->status)) zfcp_erp_action_dismiss(&unit->erp_action); } @@ -3257,83 +3047,55 @@ static void zfcp_erp_action_dismiss_unit(struct zfcp_unit *unit) static inline void zfcp_erp_action_to_running(struct zfcp_erp_action *erp_action) { - struct zfcp_adapter *adapter = erp_action->adapter; - - debug_text_event(adapter->erp_dbf, 6, "a_toru"); - debug_event(adapter->erp_dbf, 6, &erp_action->action, sizeof (int)); list_move(&erp_action->list, &erp_action->adapter->erp_running_head); + zfcp_rec_dbf_event_action(145, erp_action); } static inline void zfcp_erp_action_to_ready(struct zfcp_erp_action *erp_action) { - struct zfcp_adapter *adapter = erp_action->adapter; - - debug_text_event(adapter->erp_dbf, 6, "a_tore"); - debug_event(adapter->erp_dbf, 6, &erp_action->action, sizeof (int)); list_move(&erp_action->list, &erp_action->adapter->erp_ready_head); + zfcp_rec_dbf_event_action(146, erp_action); } -void -zfcp_erp_port_boxed(struct zfcp_port *port) +void zfcp_erp_port_boxed(struct zfcp_port *port, u8 id, void *ref) { - struct zfcp_adapter *adapter = port->adapter; unsigned long flags; - debug_text_event(adapter->erp_dbf, 3, "p_access_boxed"); - debug_event(adapter->erp_dbf, 3, &port->wwpn, sizeof(wwn_t)); read_lock_irqsave(&zfcp_data.config_lock, flags); - zfcp_erp_modify_port_status(port, - ZFCP_STATUS_COMMON_ACCESS_BOXED, - ZFCP_SET); + zfcp_erp_modify_port_status(port, id, ref, + ZFCP_STATUS_COMMON_ACCESS_BOXED, ZFCP_SET); read_unlock_irqrestore(&zfcp_data.config_lock, flags); - zfcp_erp_port_reopen(port, ZFCP_STATUS_COMMON_ERP_FAILED); + zfcp_erp_port_reopen(port, ZFCP_STATUS_COMMON_ERP_FAILED, id, ref); } -void -zfcp_erp_unit_boxed(struct zfcp_unit *unit) +void zfcp_erp_unit_boxed(struct zfcp_unit *unit, u8 id, void *ref) { - struct zfcp_adapter *adapter = unit->port->adapter; - - debug_text_event(adapter->erp_dbf, 3, "u_access_boxed"); - debug_event(adapter->erp_dbf, 3, &unit->fcp_lun, sizeof(fcp_lun_t)); - zfcp_erp_modify_unit_status(unit, - ZFCP_STATUS_COMMON_ACCESS_BOXED, - ZFCP_SET); - zfcp_erp_unit_reopen(unit, ZFCP_STATUS_COMMON_ERP_FAILED); + zfcp_erp_modify_unit_status(unit, id, ref, + ZFCP_STATUS_COMMON_ACCESS_BOXED, ZFCP_SET); + zfcp_erp_unit_reopen(unit, ZFCP_STATUS_COMMON_ERP_FAILED, id, ref); } -void -zfcp_erp_port_access_denied(struct zfcp_port *port) +void zfcp_erp_port_access_denied(struct zfcp_port *port, u8 id, void *ref) { - struct zfcp_adapter *adapter = port->adapter; unsigned long flags; - debug_text_event(adapter->erp_dbf, 3, "p_access_denied"); - debug_event(adapter->erp_dbf, 3, &port->wwpn, sizeof(wwn_t)); read_lock_irqsave(&zfcp_data.config_lock, flags); - zfcp_erp_modify_port_status(port, - ZFCP_STATUS_COMMON_ERP_FAILED | - ZFCP_STATUS_COMMON_ACCESS_DENIED, - ZFCP_SET); + zfcp_erp_modify_port_status(port, id, ref, + ZFCP_STATUS_COMMON_ERP_FAILED | + ZFCP_STATUS_COMMON_ACCESS_DENIED, ZFCP_SET); read_unlock_irqrestore(&zfcp_data.config_lock, flags); } -void -zfcp_erp_unit_access_denied(struct zfcp_unit *unit) +void zfcp_erp_unit_access_denied(struct zfcp_unit *unit, u8 id, void *ref) { - struct zfcp_adapter *adapter = unit->port->adapter; - - debug_text_event(adapter->erp_dbf, 3, "u_access_denied"); - debug_event(adapter->erp_dbf, 3, &unit->fcp_lun, sizeof(fcp_lun_t)); - zfcp_erp_modify_unit_status(unit, - ZFCP_STATUS_COMMON_ERP_FAILED | - ZFCP_STATUS_COMMON_ACCESS_DENIED, - ZFCP_SET); + zfcp_erp_modify_unit_status(unit, id, ref, + ZFCP_STATUS_COMMON_ERP_FAILED | + ZFCP_STATUS_COMMON_ACCESS_DENIED, ZFCP_SET); } -void -zfcp_erp_adapter_access_changed(struct zfcp_adapter *adapter) +void zfcp_erp_adapter_access_changed(struct zfcp_adapter *adapter, u8 id, + void *ref) { struct zfcp_port *port; unsigned long flags; @@ -3341,54 +3103,43 @@ zfcp_erp_adapter_access_changed(struct zfcp_adapter *adapter) if (adapter->connection_features & FSF_FEATURE_NPIV_MODE) return; - debug_text_event(adapter->erp_dbf, 3, "a_access_recover"); - debug_event(adapter->erp_dbf, 3, zfcp_get_busid_by_adapter(adapter), 8); - read_lock_irqsave(&zfcp_data.config_lock, flags); if (adapter->nameserver_port) - zfcp_erp_port_access_changed(adapter->nameserver_port); + zfcp_erp_port_access_changed(adapter->nameserver_port, id, ref); list_for_each_entry(port, &adapter->port_list_head, list) if (port != adapter->nameserver_port) - zfcp_erp_port_access_changed(port); + zfcp_erp_port_access_changed(port, id, ref); read_unlock_irqrestore(&zfcp_data.config_lock, flags); } -void -zfcp_erp_port_access_changed(struct zfcp_port *port) +void zfcp_erp_port_access_changed(struct zfcp_port *port, u8 id, void *ref) { struct zfcp_adapter *adapter = port->adapter; struct zfcp_unit *unit; - debug_text_event(adapter->erp_dbf, 3, "p_access_recover"); - debug_event(adapter->erp_dbf, 3, &port->wwpn, sizeof(wwn_t)); - if (!atomic_test_mask(ZFCP_STATUS_COMMON_ACCESS_DENIED, &port->status) && !atomic_test_mask(ZFCP_STATUS_COMMON_ACCESS_BOXED, &port->status)) { if (!atomic_test_mask(ZFCP_STATUS_PORT_WKA, &port->status)) list_for_each_entry(unit, &port->unit_list_head, list) - zfcp_erp_unit_access_changed(unit); + zfcp_erp_unit_access_changed(unit, id, ref); return; } ZFCP_LOG_NORMAL("reopen of port 0x%016Lx on adapter %s " "(due to ACT update)\n", port->wwpn, zfcp_get_busid_by_adapter(adapter)); - if (zfcp_erp_port_reopen(port, ZFCP_STATUS_COMMON_ERP_FAILED) != 0) + if (zfcp_erp_port_reopen(port, ZFCP_STATUS_COMMON_ERP_FAILED, id, ref)) ZFCP_LOG_NORMAL("failed reopen of port" "(adapter %s, wwpn=0x%016Lx)\n", zfcp_get_busid_by_adapter(adapter), port->wwpn); } -void -zfcp_erp_unit_access_changed(struct zfcp_unit *unit) +void zfcp_erp_unit_access_changed(struct zfcp_unit *unit, u8 id, void *ref) { struct zfcp_adapter *adapter = unit->port->adapter; - debug_text_event(adapter->erp_dbf, 3, "u_access_recover"); - debug_event(adapter->erp_dbf, 3, &unit->fcp_lun, sizeof(fcp_lun_t)); - if (!atomic_test_mask(ZFCP_STATUS_COMMON_ACCESS_DENIED, &unit->status) && !atomic_test_mask(ZFCP_STATUS_COMMON_ACCESS_BOXED, @@ -3399,7 +3150,7 @@ zfcp_erp_unit_access_changed(struct zfcp_unit *unit) " on adapter %s (due to ACT update)\n", unit->fcp_lun, unit->port->wwpn, zfcp_get_busid_by_adapter(adapter)); - if (zfcp_erp_unit_reopen(unit, ZFCP_STATUS_COMMON_ERP_FAILED) != 0) + if (zfcp_erp_unit_reopen(unit, ZFCP_STATUS_COMMON_ERP_FAILED, id, ref)) ZFCP_LOG_NORMAL("failed reopen of unit (adapter %s, " "wwpn=0x%016Lx, fcp_lun=0x%016Lx)\n", zfcp_get_busid_by_adapter(adapter), diff --git a/drivers/s390/scsi/zfcp_ext.h b/drivers/s390/scsi/zfcp_ext.h index 6a559d5..4d83a82 100644 --- a/drivers/s390/scsi/zfcp_ext.h +++ b/drivers/s390/scsi/zfcp_ext.h @@ -133,22 +133,25 @@ extern struct scsi_transport_template *zfcp_transport_template; extern struct fc_function_template zfcp_transport_functions; /******************************** ERP ****************************************/ -extern void zfcp_erp_modify_adapter_status(struct zfcp_adapter *, u32, int); -extern int zfcp_erp_adapter_reopen(struct zfcp_adapter *, int); -extern int zfcp_erp_adapter_shutdown(struct zfcp_adapter *, int); -extern void zfcp_erp_adapter_failed(struct zfcp_adapter *); - -extern void zfcp_erp_modify_port_status(struct zfcp_port *, u32, int); -extern int zfcp_erp_port_reopen(struct zfcp_port *, int); -extern int zfcp_erp_port_shutdown(struct zfcp_port *, int); -extern int zfcp_erp_port_forced_reopen(struct zfcp_port *, int); -extern void zfcp_erp_port_failed(struct zfcp_port *); -extern int zfcp_erp_port_reopen_all(struct zfcp_adapter *, int); - -extern void zfcp_erp_modify_unit_status(struct zfcp_unit *, u32, int); -extern int zfcp_erp_unit_reopen(struct zfcp_unit *, int); -extern int zfcp_erp_unit_shutdown(struct zfcp_unit *, int); -extern void zfcp_erp_unit_failed(struct zfcp_unit *); +extern void zfcp_erp_modify_adapter_status(struct zfcp_adapter *, u8, void *, + u32, int); +extern int zfcp_erp_adapter_reopen(struct zfcp_adapter *, int, u8, void *); +extern int zfcp_erp_adapter_shutdown(struct zfcp_adapter *, int, u8, void *); +extern void zfcp_erp_adapter_failed(struct zfcp_adapter *, u8, void *); + +extern void zfcp_erp_modify_port_status(struct zfcp_port *, u8, void *, u32, + int); +extern int zfcp_erp_port_reopen(struct zfcp_port *, int, u8, void *); +extern int zfcp_erp_port_shutdown(struct zfcp_port *, int, u8, void *); +extern int zfcp_erp_port_forced_reopen(struct zfcp_port *, int, u8, void *); +extern void zfcp_erp_port_failed(struct zfcp_port *, u8, void *); +extern int zfcp_erp_port_reopen_all(struct zfcp_adapter *, int, u8, void *); + +extern void zfcp_erp_modify_unit_status(struct zfcp_unit *, u8, void *, u32, + int); +extern int zfcp_erp_unit_reopen(struct zfcp_unit *, int, u8, void *); +extern int zfcp_erp_unit_shutdown(struct zfcp_unit *, int, u8, void *); +extern void zfcp_erp_unit_failed(struct zfcp_unit *, u8, void *); extern int zfcp_erp_thread_setup(struct zfcp_adapter *); extern int zfcp_erp_thread_kill(struct zfcp_adapter *); @@ -157,15 +160,25 @@ extern void zfcp_erp_async_handler(struct zfcp_erp_action *, unsigned long); extern int zfcp_test_link(struct zfcp_port *); -extern void zfcp_erp_port_boxed(struct zfcp_port *); -extern void zfcp_erp_unit_boxed(struct zfcp_unit *); -extern void zfcp_erp_port_access_denied(struct zfcp_port *); -extern void zfcp_erp_unit_access_denied(struct zfcp_unit *); -extern void zfcp_erp_adapter_access_changed(struct zfcp_adapter *); -extern void zfcp_erp_port_access_changed(struct zfcp_port *); -extern void zfcp_erp_unit_access_changed(struct zfcp_unit *); +extern void zfcp_erp_port_boxed(struct zfcp_port *, u8 id, void *ref); +extern void zfcp_erp_unit_boxed(struct zfcp_unit *, u8 id, void *ref); +extern void zfcp_erp_port_access_denied(struct zfcp_port *, u8 id, void *ref); +extern void zfcp_erp_unit_access_denied(struct zfcp_unit *, u8 id, void *ref); +extern void zfcp_erp_adapter_access_changed(struct zfcp_adapter *, u8, void *); +extern void zfcp_erp_port_access_changed(struct zfcp_port *, u8, void *); +extern void zfcp_erp_unit_access_changed(struct zfcp_unit *, u8, void *); /******************************** AUX ****************************************/ +extern void zfcp_rec_dbf_event_thread(u8 id, struct zfcp_adapter *adapter, + int lock); +extern void zfcp_rec_dbf_event_adapter(u8 id, void* ref, struct zfcp_adapter *); +extern void zfcp_rec_dbf_event_port(u8 id, void *ref, struct zfcp_port *port); +extern void zfcp_rec_dbf_event_unit(u8 id, void *ref, struct zfcp_unit *unit); +extern void zfcp_rec_dbf_event_trigger(u8 id, void *ref, u8 want, u8 need, + void *action, struct zfcp_adapter *, + struct zfcp_port *, struct zfcp_unit *); +extern void zfcp_rec_dbf_event_action(u8 id, struct zfcp_erp_action *); + extern void zfcp_hba_dbf_event_fsf_response(struct zfcp_fsf_req *); extern void zfcp_hba_dbf_event_fsf_unsol(const char *, struct zfcp_adapter *, struct fsf_status_read_buffer *); diff --git a/drivers/s390/scsi/zfcp_fsf.c b/drivers/s390/scsi/zfcp_fsf.c index 09a405b..a9507ef 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 *); static int zfcp_fsf_protstatus_eval(struct zfcp_fsf_req *); static int zfcp_fsf_fsfstatus_eval(struct zfcp_fsf_req *); static int zfcp_fsf_fsfstatus_qual_eval(struct zfcp_fsf_req *); -static void zfcp_fsf_link_down_info_eval(struct zfcp_adapter *, +static void zfcp_fsf_link_down_info_eval(struct zfcp_fsf_req *, u8, struct fsf_link_down_info *); static int zfcp_fsf_req_dispatch(struct zfcp_fsf_req *); @@ -156,7 +156,6 @@ static void zfcp_fsf_req_dismiss(struct zfcp_adapter *adapter, dbg_tmp[0] = (u64) atomic_read(&adapter->reqs_active); dbg_tmp[1] = (u64) counter; - debug_event(adapter->erp_dbf, 4, (void *) dbg_tmp, 16); list_del(&fsf_req->list); fsf_req->status |= ZFCP_STATUS_FSFREQ_DISMISSED; zfcp_fsf_req_complete(fsf_req); @@ -287,35 +286,6 @@ zfcp_fsf_protstatus_eval(struct zfcp_fsf_req *fsf_req) goto skip_protstatus; } - /* log additional information provided by FSF (if any) */ - if (unlikely(qtcb->header.log_length)) { - /* do not trust them ;-) */ - if (qtcb->header.log_start > sizeof(struct fsf_qtcb)) { - ZFCP_LOG_NORMAL - ("bug: ULP (FSF logging) log data starts " - "beyond end of packet header. Ignored. " - "(start=%i, size=%li)\n", - qtcb->header.log_start, - sizeof(struct fsf_qtcb)); - goto forget_log; - } - if ((size_t) (qtcb->header.log_start + qtcb->header.log_length) - > sizeof(struct fsf_qtcb)) { - ZFCP_LOG_NORMAL("bug: ULP (FSF logging) log data ends " - "beyond end of packet header. Ignored. " - "(start=%i, length=%i, size=%li)\n", - qtcb->header.log_start, - qtcb->header.log_length, - sizeof(struct fsf_qtcb)); - goto forget_log; - } - ZFCP_LOG_TRACE("ULP log data: \n"); - ZFCP_HEX_DUMP(ZFCP_LOG_LEVEL_TRACE, - (char *) qtcb + qtcb->header.log_start, - qtcb->header.log_length); - } - forget_log: - /* evaluate FSF Protocol Status */ switch (qtcb->prefix.prot_status) { @@ -330,7 +300,7 @@ zfcp_fsf_protstatus_eval(struct zfcp_fsf_req *fsf_req) zfcp_get_busid_by_adapter(adapter), prot_status_qual->version_error.fsf_version, ZFCP_QTCB_VERSION); - zfcp_erp_adapter_shutdown(adapter, 0); + zfcp_erp_adapter_shutdown(adapter, 0, 117, fsf_req); fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR; break; @@ -341,7 +311,7 @@ zfcp_fsf_protstatus_eval(struct zfcp_fsf_req *fsf_req) qtcb->prefix.req_seq_no, zfcp_get_busid_by_adapter(adapter), prot_status_qual->sequence_error.exp_req_seq_no); - zfcp_erp_adapter_reopen(adapter, 0); + zfcp_erp_adapter_reopen(adapter, 0, 98, fsf_req); fsf_req->status |= ZFCP_STATUS_FSFREQ_RETRY; fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR; break; @@ -352,7 +322,7 @@ zfcp_fsf_protstatus_eval(struct zfcp_fsf_req *fsf_req) "that used on adapter %s. " "Stopping all operations on this adapter.\n", zfcp_get_busid_by_adapter(adapter)); - zfcp_erp_adapter_shutdown(adapter, 0); + zfcp_erp_adapter_shutdown(adapter, 0, 118, fsf_req); fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR; break; @@ -369,14 +339,15 @@ zfcp_fsf_protstatus_eval(struct zfcp_fsf_req *fsf_req) *(unsigned long long*) (&qtcb->bottom.support.req_handle), zfcp_get_busid_by_adapter(adapter)); - zfcp_erp_adapter_shutdown(adapter, 0); + zfcp_erp_adapter_shutdown(adapter, 0, 78, fsf_req); fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR; break; case FSF_PROT_LINK_DOWN: - zfcp_fsf_link_down_info_eval(adapter, + zfcp_fsf_link_down_info_eval(fsf_req, 37, &prot_status_qual->link_down_info); - zfcp_erp_adapter_reopen(adapter, 0); + /* FIXME: reopening adapter now? better wait for link up */ + zfcp_erp_adapter_reopen(adapter, 0, 79, fsf_req); fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR; break; @@ -386,12 +357,13 @@ zfcp_fsf_protstatus_eval(struct zfcp_fsf_req *fsf_req) "Re-starting operations on this adapter.\n", zfcp_get_busid_by_adapter(adapter)); /* All ports should be marked as ready to run again */ - zfcp_erp_modify_adapter_status(adapter, - ZFCP_STATUS_COMMON_RUNNING, + zfcp_erp_modify_adapter_status(adapter, 28, + 0, ZFCP_STATUS_COMMON_RUNNING, ZFCP_SET); zfcp_erp_adapter_reopen(adapter, ZFCP_STATUS_ADAPTER_LINK_UNPLUGGED - | ZFCP_STATUS_COMMON_ERP_FAILED); + | ZFCP_STATUS_COMMON_ERP_FAILED, + 99, fsf_req); fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR; break; @@ -401,7 +373,7 @@ zfcp_fsf_protstatus_eval(struct zfcp_fsf_req *fsf_req) "Restarting all operations on this " "adapter.\n", zfcp_get_busid_by_adapter(adapter)); - zfcp_erp_adapter_reopen(adapter, 0); + zfcp_erp_adapter_reopen(adapter, 0, 100, fsf_req); fsf_req->status |= ZFCP_STATUS_FSFREQ_RETRY; fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR; break; @@ -414,7 +386,7 @@ zfcp_fsf_protstatus_eval(struct zfcp_fsf_req *fsf_req) "(debug info 0x%x).\n", zfcp_get_busid_by_adapter(adapter), qtcb->prefix.prot_status); - zfcp_erp_adapter_shutdown(adapter, 0); + zfcp_erp_adapter_shutdown(adapter, 0, 119, fsf_req); fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR; } @@ -453,7 +425,7 @@ zfcp_fsf_fsfstatus_eval(struct zfcp_fsf_req *fsf_req) "(debug info 0x%x).\n", zfcp_get_busid_by_adapter(fsf_req->adapter), fsf_req->qtcb->header.fsf_command); - zfcp_erp_adapter_shutdown(fsf_req->adapter, 0); + zfcp_erp_adapter_shutdown(fsf_req->adapter, 0, 120, fsf_req); fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR; break; @@ -507,7 +479,7 @@ zfcp_fsf_fsfstatus_qual_eval(struct zfcp_fsf_req *fsf_req) "problem on the adapter %s " "Stopping all operations on this adapter. ", zfcp_get_busid_by_adapter(fsf_req->adapter)); - zfcp_erp_adapter_shutdown(fsf_req->adapter, 0); + zfcp_erp_adapter_shutdown(fsf_req->adapter, 0, 121, fsf_req); fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR; break; case FSF_SQ_ULP_PROGRAMMING_ERROR: @@ -538,9 +510,11 @@ zfcp_fsf_fsfstatus_qual_eval(struct zfcp_fsf_req *fsf_req) * zfcp_fsf_link_down_info_eval - evaluate link down information block */ static void -zfcp_fsf_link_down_info_eval(struct zfcp_adapter *adapter, +zfcp_fsf_link_down_info_eval(struct zfcp_fsf_req *fsf_req, u8 id, struct fsf_link_down_info *link_down) { + struct zfcp_adapter *adapter = fsf_req->adapter; + if (atomic_test_mask(ZFCP_STATUS_ADAPTER_LINK_UNPLUGGED, &adapter->status)) return; @@ -631,7 +605,7 @@ zfcp_fsf_link_down_info_eval(struct zfcp_adapter *adapter, link_down->vendor_specific_code); out: - zfcp_erp_adapter_failed(adapter); + zfcp_erp_adapter_failed(adapter, id, fsf_req); } /* @@ -825,19 +799,14 @@ zfcp_fsf_status_read_port_closed(struct zfcp_fsf_req *fsf_req) switch (status_buffer->status_subtype) { case FSF_STATUS_READ_SUB_CLOSE_PHYS_PORT: - debug_text_event(adapter->erp_dbf, 3, "unsol_pc_phys:"); - zfcp_erp_port_reopen(port, 0); + zfcp_erp_port_reopen(port, 0, 101, fsf_req); break; case FSF_STATUS_READ_SUB_ERROR_PORT: - debug_text_event(adapter->erp_dbf, 1, "unsol_pc_err:"); - zfcp_erp_port_shutdown(port, 0); + zfcp_erp_port_shutdown(port, 0, 122, fsf_req); break; default: - debug_text_event(adapter->erp_dbf, 0, "unsol_unk_sub:"); - debug_exception(adapter->erp_dbf, 0, - &status_buffer->status_subtype, sizeof (u32)); ZFCP_LOG_NORMAL("bug: Undefined status subtype received " "for a reopen indication on port with " "d_id 0x%08x on the adapter %s. " @@ -929,7 +898,7 @@ zfcp_fsf_status_read_handler(struct zfcp_fsf_req *fsf_req) case FSF_STATUS_READ_SUB_NO_PHYSICAL_LINK: ZFCP_LOG_INFO("Physical link to adapter %s is down\n", zfcp_get_busid_by_adapter(adapter)); - zfcp_fsf_link_down_info_eval(adapter, + zfcp_fsf_link_down_info_eval(fsf_req, 38, (struct fsf_link_down_info *) &status_buffer->payload); break; @@ -937,7 +906,7 @@ zfcp_fsf_status_read_handler(struct zfcp_fsf_req *fsf_req) ZFCP_LOG_INFO("Local link to adapter %s is down " "due to failed FDISC login\n", zfcp_get_busid_by_adapter(adapter)); - zfcp_fsf_link_down_info_eval(adapter, + zfcp_fsf_link_down_info_eval(fsf_req, 39, (struct fsf_link_down_info *) &status_buffer->payload); break; @@ -945,13 +914,13 @@ zfcp_fsf_status_read_handler(struct zfcp_fsf_req *fsf_req) ZFCP_LOG_INFO("Local link to adapter %s is down " "due to firmware update on adapter\n", zfcp_get_busid_by_adapter(adapter)); - zfcp_fsf_link_down_info_eval(adapter, NULL); + zfcp_fsf_link_down_info_eval(fsf_req, 40, NULL); break; default: ZFCP_LOG_INFO("Local link to adapter %s is down " "due to unknown reason\n", zfcp_get_busid_by_adapter(adapter)); - zfcp_fsf_link_down_info_eval(adapter, NULL); + zfcp_fsf_link_down_info_eval(fsf_req, 41, NULL); }; break; @@ -960,12 +929,13 @@ zfcp_fsf_status_read_handler(struct zfcp_fsf_req *fsf_req) "Restarting operations on this adapter\n", zfcp_get_busid_by_adapter(adapter)); /* All ports should be marked as ready to run again */ - zfcp_erp_modify_adapter_status(adapter, + zfcp_erp_modify_adapter_status(adapter, 30, 0, ZFCP_STATUS_COMMON_RUNNING, ZFCP_SET); zfcp_erp_adapter_reopen(adapter, ZFCP_STATUS_ADAPTER_LINK_UNPLUGGED - | ZFCP_STATUS_COMMON_ERP_FAILED); + | ZFCP_STATUS_COMMON_ERP_FAILED, + 102, fsf_req); break; case FSF_STATUS_READ_NOTIFICATION_LOST: @@ -999,13 +969,13 @@ zfcp_fsf_status_read_handler(struct zfcp_fsf_req *fsf_req) if (status_buffer->status_subtype & FSF_STATUS_READ_SUB_ACT_UPDATED) - zfcp_erp_adapter_access_changed(adapter); + zfcp_erp_adapter_access_changed(adapter, 135, fsf_req); break; case FSF_STATUS_READ_CFDC_UPDATED: ZFCP_LOG_NORMAL("CFDC has been updated on the adapter %s\n", zfcp_get_busid_by_adapter(adapter)); - zfcp_erp_adapter_access_changed(adapter); + zfcp_erp_adapter_access_changed(adapter, 136, fsf_req); break; case FSF_STATUS_READ_CFDC_HARDENED: @@ -1026,7 +996,6 @@ zfcp_fsf_status_read_handler(struct zfcp_fsf_req *fsf_req) break; case FSF_STATUS_READ_FEATURE_UPDATE_ALERT: - debug_text_event(adapter->erp_dbf, 2, "unsol_features:"); ZFCP_LOG_INFO("List of supported features on adapter %s has " "been changed from 0x%08X to 0x%08X\n", zfcp_get_busid_by_adapter(adapter), @@ -1074,7 +1043,7 @@ zfcp_fsf_status_read_handler(struct zfcp_fsf_req *fsf_req) ZFCP_LOG_INFO("restart adapter %s due to status read " "buffer shortage\n", zfcp_get_busid_by_adapter(adapter)); - zfcp_erp_adapter_reopen(adapter, 0); + zfcp_erp_adapter_reopen(adapter, 0, 103, fsf_req); } } out: @@ -1175,8 +1144,6 @@ zfcp_fsf_abort_fcp_command_handler(struct zfcp_fsf_req *new_fsf_req) case FSF_PORT_HANDLE_NOT_VALID: if (status_qual >> 4 != status_qual % 0xf) { - debug_text_event(new_fsf_req->adapter->erp_dbf, 3, - "fsf_s_phand_nv0"); /* * In this case a command that was sent prior to a port * reopen was aborted (handles are different). This is @@ -1195,9 +1162,8 @@ zfcp_fsf_abort_fcp_command_handler(struct zfcp_fsf_req *new_fsf_req) fsf_status_qual, sizeof (union fsf_status_qual)); /* Let's hope this sorts out the mess */ - debug_text_event(new_fsf_req->adapter->erp_dbf, 1, - "fsf_s_phand_nv1"); - zfcp_erp_adapter_reopen(unit->port->adapter, 0); + zfcp_erp_adapter_reopen(unit->port->adapter, 0, 104, + new_fsf_req); new_fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR; } break; @@ -1205,8 +1171,6 @@ zfcp_fsf_abort_fcp_command_handler(struct zfcp_fsf_req *new_fsf_req) case FSF_LUN_HANDLE_NOT_VALID: if (status_qual >> 4 != status_qual % 0xf) { /* 2 */ - debug_text_event(new_fsf_req->adapter->erp_dbf, 3, - "fsf_s_lhand_nv0"); /* * In this case a command that was sent prior to a unit * reopen was aborted (handles are different). @@ -1228,17 +1192,13 @@ zfcp_fsf_abort_fcp_command_handler(struct zfcp_fsf_req *new_fsf_req) fsf_status_qual, sizeof (union fsf_status_qual)); /* Let's hope this sorts out the mess */ - debug_text_event(new_fsf_req->adapter->erp_dbf, 1, - "fsf_s_lhand_nv1"); - zfcp_erp_port_reopen(unit->port, 0); + zfcp_erp_port_reopen(unit->port, 0, 105, new_fsf_req); new_fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR; } break; case FSF_FCP_COMMAND_DOES_NOT_EXIST: retval = 0; - debug_text_event(new_fsf_req->adapter->erp_dbf, 3, - "fsf_s_no_exist"); new_fsf_req->status |= ZFCP_STATUS_FSFREQ_ABORTNOTNEEDED; break; @@ -1246,9 +1206,7 @@ zfcp_fsf_abort_fcp_command_handler(struct zfcp_fsf_req *new_fsf_req) ZFCP_LOG_INFO("Remote port 0x%016Lx on adapter %s needs to " "be reopened\n", unit->port->wwpn, zfcp_get_busid_by_unit(unit)); - debug_text_event(new_fsf_req->adapter->erp_dbf, 2, - "fsf_s_pboxed"); - zfcp_erp_port_boxed(unit->port); + zfcp_erp_port_boxed(unit->port, 47, new_fsf_req); new_fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR | ZFCP_STATUS_FSFREQ_RETRY; break; @@ -1259,8 +1217,7 @@ zfcp_fsf_abort_fcp_command_handler(struct zfcp_fsf_req *new_fsf_req) "to be reopened\n", unit->fcp_lun, unit->port->wwpn, zfcp_get_busid_by_unit(unit)); - debug_text_event(new_fsf_req->adapter->erp_dbf, 1, "fsf_s_lboxed"); - zfcp_erp_unit_boxed(unit); + zfcp_erp_unit_boxed(unit, 48, new_fsf_req); new_fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR | ZFCP_STATUS_FSFREQ_RETRY; break; @@ -1268,26 +1225,17 @@ zfcp_fsf_abort_fcp_command_handler(struct zfcp_fsf_req *new_fsf_req) case FSF_ADAPTER_STATUS_AVAILABLE: switch (new_fsf_req->qtcb->header.fsf_status_qual.word[0]) { case FSF_SQ_INVOKE_LINK_TEST_PROCEDURE: - debug_text_event(new_fsf_req->adapter->erp_dbf, 1, - "fsf_sq_ltest"); zfcp_test_link(unit->port); new_fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR; break; case FSF_SQ_ULP_DEPENDENT_ERP_REQUIRED: /* SCSI stack will escalate */ - debug_text_event(new_fsf_req->adapter->erp_dbf, 1, - "fsf_sq_ulp"); new_fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR; break; default: ZFCP_LOG_NORMAL ("bug: Wrong status qualifier 0x%x arrived.\n", new_fsf_req->qtcb->header.fsf_status_qual.word[0]); - debug_text_event(new_fsf_req->adapter->erp_dbf, 0, - "fsf_sq_inval:"); - debug_exception(new_fsf_req->adapter->erp_dbf, 0, - &new_fsf_req->qtcb->header. - fsf_status_qual.word[0], sizeof (u32)); break; } break; @@ -1301,11 +1249,6 @@ zfcp_fsf_abort_fcp_command_handler(struct zfcp_fsf_req *new_fsf_req) ZFCP_LOG_NORMAL("bug: An unknown FSF Status was presented " "(debug info 0x%x)\n", new_fsf_req->qtcb->header.fsf_status); - debug_text_event(new_fsf_req->adapter->erp_dbf, 0, - "fsf_s_inval:"); - debug_exception(new_fsf_req->adapter->erp_dbf, 0, - &new_fsf_req->qtcb->header.fsf_status, - sizeof (u32)); break; } skip_fsfstatus: @@ -1508,8 +1451,7 @@ zfcp_fsf_send_ct_handler(struct zfcp_fsf_req *fsf_req) zfcp_get_busid_by_port(port), ZFCP_FC_SERVICE_CLASS_DEFAULT); /* stop operation for this adapter */ - debug_text_exception(adapter->erp_dbf, 0, "fsf_s_class_nsup"); - zfcp_erp_adapter_shutdown(adapter, 0); + zfcp_erp_adapter_shutdown(adapter, 0, 123, fsf_req); fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR; break; @@ -1517,13 +1459,11 @@ zfcp_fsf_send_ct_handler(struct zfcp_fsf_req *fsf_req) switch (header->fsf_status_qual.word[0]){ case FSF_SQ_INVOKE_LINK_TEST_PROCEDURE: /* reopening link to port */ - debug_text_event(adapter->erp_dbf, 1, "fsf_sq_ltest"); zfcp_test_link(port); fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR; break; case FSF_SQ_ULP_DEPENDENT_ERP_REQUIRED: /* ERP strategy will escalate */ - debug_text_event(adapter->erp_dbf, 1, "fsf_sq_ulp"); fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR; break; default: @@ -1551,8 +1491,7 @@ zfcp_fsf_send_ct_handler(struct zfcp_fsf_req *fsf_req) break; } } - debug_text_event(adapter->erp_dbf, 1, "fsf_s_access"); - zfcp_erp_port_access_denied(port); + zfcp_erp_port_access_denied(port, 55, fsf_req); fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR; break; @@ -1564,7 +1503,6 @@ zfcp_fsf_send_ct_handler(struct zfcp_fsf_req *fsf_req) ZFCP_HEX_DUMP(ZFCP_LOG_LEVEL_INFO, (char *) &header->fsf_status_qual, sizeof (union fsf_status_qual)); - debug_text_event(adapter->erp_dbf, 1, "fsf_s_gcom_rej"); fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR; break; @@ -1577,8 +1515,7 @@ zfcp_fsf_send_ct_handler(struct zfcp_fsf_req *fsf_req) ZFCP_HEX_DUMP(ZFCP_LOG_LEVEL_INFO, (char *) &header->fsf_status_qual, sizeof (union fsf_status_qual)); - debug_text_event(adapter->erp_dbf, 1, "fsf_s_phandle_nv"); - zfcp_erp_adapter_reopen(adapter, 0); + zfcp_erp_adapter_reopen(adapter, 0, 106, fsf_req); fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR; break; @@ -1586,8 +1523,7 @@ zfcp_fsf_send_ct_handler(struct zfcp_fsf_req *fsf_req) ZFCP_LOG_INFO("port needs to be reopened " "(adapter %s, port d_id=0x%08x)\n", zfcp_get_busid_by_port(port), port->d_id); - debug_text_event(adapter->erp_dbf, 2, "fsf_s_pboxed"); - zfcp_erp_port_boxed(port); + zfcp_erp_port_boxed(port, 49, fsf_req); fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR | ZFCP_STATUS_FSFREQ_RETRY; break; @@ -1626,9 +1562,6 @@ zfcp_fsf_send_ct_handler(struct zfcp_fsf_req *fsf_req) default: ZFCP_LOG_NORMAL("bug: An unknown FSF Status was presented " "(debug info 0x%x)\n", header->fsf_status); - debug_text_event(adapter->erp_dbf, 0, "fsf_sq_inval:"); - debug_exception(adapter->erp_dbf, 0, - &header->fsf_status_qual.word[0], sizeof (u32)); break; } @@ -1812,21 +1745,18 @@ static int zfcp_fsf_send_els_handler(struct zfcp_fsf_req *fsf_req) zfcp_get_busid_by_adapter(adapter), ZFCP_FC_SERVICE_CLASS_DEFAULT); /* stop operation for this adapter */ - debug_text_exception(adapter->erp_dbf, 0, "fsf_s_class_nsup"); - zfcp_erp_adapter_shutdown(adapter, 0); + zfcp_erp_adapter_shutdown(adapter, 0, 124, fsf_req); fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR; break; case FSF_ADAPTER_STATUS_AVAILABLE: switch (header->fsf_status_qual.word[0]){ case FSF_SQ_INVOKE_LINK_TEST_PROCEDURE: - debug_text_event(adapter->erp_dbf, 1, "fsf_sq_ltest"); if (port && (send_els->ls_code != ZFCP_LS_ADISC)) zfcp_test_link(port); fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR; break; case FSF_SQ_ULP_DEPENDENT_ERP_REQUIRED: - debug_text_event(adapter->erp_dbf, 1, "fsf_sq_ulp"); fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR; retval = zfcp_handle_els_rjt(header->fsf_status_qual.word[1], @@ -1834,7 +1764,6 @@ static int zfcp_fsf_send_els_handler(struct zfcp_fsf_req *fsf_req) &header->fsf_status_qual.word[2]); break; case FSF_SQ_RETRY_IF_POSSIBLE: - debug_text_event(adapter->erp_dbf, 1, "fsf_sq_retry"); fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR; break; default: @@ -1911,9 +1840,8 @@ static int zfcp_fsf_send_els_handler(struct zfcp_fsf_req *fsf_req) break; } } - debug_text_event(adapter->erp_dbf, 1, "fsf_s_access"); if (port != NULL) - zfcp_erp_port_access_denied(port); + zfcp_erp_port_access_denied(port, 56, fsf_req); fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR; break; @@ -1923,9 +1851,6 @@ static int zfcp_fsf_send_els_handler(struct zfcp_fsf_req *fsf_req) "(adapter: %s, fsf_status=0x%08x)\n", zfcp_get_busid_by_adapter(adapter), header->fsf_status); - debug_text_event(adapter->erp_dbf, 0, "fsf_sq_inval"); - debug_exception(adapter->erp_dbf, 0, - &header->fsf_status_qual.word[0], sizeof(u32)); fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR; break; } @@ -2076,8 +2001,7 @@ zfcp_fsf_exchange_config_evaluate(struct zfcp_fsf_req *fsf_req, int xchg_ok) "versions in comparison to this device " "driver (try updated device driver)\n", zfcp_get_busid_by_adapter(adapter)); - debug_text_event(adapter->erp_dbf, 0, "low_qtcb_ver"); - zfcp_erp_adapter_shutdown(adapter, 0); + zfcp_erp_adapter_shutdown(adapter, 0, 125, fsf_req); return -EIO; } if (ZFCP_QTCB_VERSION > bottom->high_qtcb_version) { @@ -2086,8 +2010,7 @@ zfcp_fsf_exchange_config_evaluate(struct zfcp_fsf_req *fsf_req, int xchg_ok) "versions than this device driver uses" "(consider a microcode upgrade)\n", zfcp_get_busid_by_adapter(adapter)); - debug_text_event(adapter->erp_dbf, 0, "high_qtcb_ver"); - zfcp_erp_adapter_shutdown(adapter, 0); + zfcp_erp_adapter_shutdown(adapter, 0, 126, fsf_req); return -EIO; } return 0; @@ -2127,17 +2050,13 @@ zfcp_fsf_exchange_config_data_handler(struct zfcp_fsf_req *fsf_req) adapter->peer_wwnn, adapter->peer_wwpn, adapter->peer_d_id); - debug_text_event(fsf_req->adapter->erp_dbf, 0, - "top-p-to-p"); break; case FC_PORTTYPE_NLPORT: ZFCP_LOG_NORMAL("error: Arbitrated loop fibrechannel " "topology detected at adapter %s " "unsupported, shutting down adapter\n", zfcp_get_busid_by_adapter(adapter)); - debug_text_event(fsf_req->adapter->erp_dbf, 0, - "top-al"); - zfcp_erp_adapter_shutdown(adapter, 0); + zfcp_erp_adapter_shutdown(adapter, 0, 127, fsf_req); return -EIO; case FC_PORTTYPE_NPORT: ZFCP_LOG_NORMAL("Switched fabric fibrechannel " @@ -2152,9 +2071,7 @@ zfcp_fsf_exchange_config_data_handler(struct zfcp_fsf_req *fsf_req) "of a type known to the zfcp " "driver, shutting down adapter\n", zfcp_get_busid_by_adapter(adapter)); - debug_text_exception(fsf_req->adapter->erp_dbf, 0, - "unknown-topo"); - zfcp_erp_adapter_shutdown(adapter, 0); + zfcp_erp_adapter_shutdown(adapter, 0, 128, fsf_req); return -EIO; } bottom = &qtcb->bottom.config; @@ -2166,32 +2083,23 @@ zfcp_fsf_exchange_config_data_handler(struct zfcp_fsf_req *fsf_req) bottom->max_qtcb_size, zfcp_get_busid_by_adapter(adapter), sizeof(struct fsf_qtcb)); - debug_text_event(fsf_req->adapter->erp_dbf, 0, - "qtcb-size"); - debug_event(fsf_req->adapter->erp_dbf, 0, - &bottom->max_qtcb_size, sizeof (u32)); - zfcp_erp_adapter_shutdown(adapter, 0); + zfcp_erp_adapter_shutdown(adapter, 0, 129, fsf_req); return -EIO; } atomic_set_mask(ZFCP_STATUS_ADAPTER_XCONFIG_OK, &adapter->status); break; case FSF_EXCHANGE_CONFIG_DATA_INCOMPLETE: - debug_text_event(adapter->erp_dbf, 0, "xchg-inco"); - if (zfcp_fsf_exchange_config_evaluate(fsf_req, 0)) return -EIO; atomic_set_mask(ZFCP_STATUS_ADAPTER_XCONFIG_OK, &adapter->status); - zfcp_fsf_link_down_info_eval(adapter, + zfcp_fsf_link_down_info_eval(fsf_req, 42, &qtcb->header.fsf_status_qual.link_down_info); break; default: - debug_text_event(fsf_req->adapter->erp_dbf, 0, "fsf-stat-ng"); - debug_event(fsf_req->adapter->erp_dbf, 0, - &fsf_req->qtcb->header.fsf_status, sizeof (u32)); - zfcp_erp_adapter_shutdown(adapter, 0); + zfcp_erp_adapter_shutdown(adapter, 0, 130, fsf_req); return -EIO; } return 0; @@ -2325,13 +2233,9 @@ zfcp_fsf_exchange_port_data_handler(struct zfcp_fsf_req *fsf_req) case FSF_EXCHANGE_CONFIG_DATA_INCOMPLETE: zfcp_fsf_exchange_port_evaluate(fsf_req, 0); atomic_set_mask(ZFCP_STATUS_ADAPTER_XPORT_OK, &adapter->status); - zfcp_fsf_link_down_info_eval(adapter, + zfcp_fsf_link_down_info_eval(fsf_req, 43, &qtcb->header.fsf_status_qual.link_down_info); break; - default: - debug_text_event(adapter->erp_dbf, 0, "xchg-port-ng"); - debug_event(adapter->erp_dbf, 0, - &fsf_req->qtcb->header.fsf_status, sizeof(u32)); } } @@ -2429,8 +2333,6 @@ zfcp_fsf_open_port_handler(struct zfcp_fsf_req *fsf_req) ZFCP_LOG_NORMAL("bug: remote port 0x%016Lx on adapter %s " "is already open.\n", port->wwpn, zfcp_get_busid_by_port(port)); - debug_text_exception(fsf_req->adapter->erp_dbf, 0, - "fsf_s_popen"); /* * This is a bug, however operation should continue normally * if it is simply ignored @@ -2454,8 +2356,7 @@ zfcp_fsf_open_port_handler(struct zfcp_fsf_req *fsf_req) break; } } - debug_text_event(fsf_req->adapter->erp_dbf, 1, "fsf_s_access"); - zfcp_erp_port_access_denied(port); + zfcp_erp_port_access_denied(port, 57, fsf_req); fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR; break; @@ -2464,24 +2365,18 @@ zfcp_fsf_open_port_handler(struct zfcp_fsf_req *fsf_req) "The remote port 0x%016Lx on adapter %s " "could not be opened. Disabling it.\n", port->wwpn, zfcp_get_busid_by_port(port)); - debug_text_event(fsf_req->adapter->erp_dbf, 1, - "fsf_s_max_ports"); - zfcp_erp_port_failed(port); + zfcp_erp_port_failed(port, 31, fsf_req); fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR; break; case FSF_ADAPTER_STATUS_AVAILABLE: switch (header->fsf_status_qual.word[0]) { case FSF_SQ_INVOKE_LINK_TEST_PROCEDURE: - debug_text_event(fsf_req->adapter->erp_dbf, 1, - "fsf_sq_ltest"); /* ERP strategy will escalate */ fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR; break; case FSF_SQ_ULP_DEPENDENT_ERP_REQUIRED: /* ERP strategy will escalate */ - debug_text_event(fsf_req->adapter->erp_dbf, 1, - "fsf_sq_ulp"); fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR; break; case FSF_SQ_NO_RETRY_POSSIBLE: @@ -2490,21 +2385,13 @@ zfcp_fsf_open_port_handler(struct zfcp_fsf_req *fsf_req) "Disabling it.\n", port->wwpn, zfcp_get_busid_by_port(port)); - debug_text_exception(fsf_req->adapter->erp_dbf, 0, - "fsf_sq_no_retry"); - zfcp_erp_port_failed(port); + zfcp_erp_port_failed(port, 32, fsf_req); fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR; break; default: ZFCP_LOG_NORMAL ("bug: Wrong status qualifier 0x%x arrived.\n", header->fsf_status_qual.word[0]); - debug_text_event(fsf_req->adapter->erp_dbf, 0, - "fsf_sq_inval:"); - debug_exception( - fsf_req->adapter->erp_dbf, 0, - &header->fsf_status_qual.word[0], - sizeof (u32)); break; } break; @@ -2547,17 +2434,12 @@ zfcp_fsf_open_port_handler(struct zfcp_fsf_req *fsf_req) "warning: insufficient length of " "PLOGI payload (%i)\n", fsf_req->qtcb->bottom.support.els1_length); - debug_text_event(fsf_req->adapter->erp_dbf, 0, - "fsf_s_short_plogi:"); /* skip sanity check and assume wwpn is ok */ } else { if (plogi->serv_param.wwpn != port->wwpn) { ZFCP_LOG_INFO("warning: d_id of port " "0x%016Lx changed during " "open\n", port->wwpn); - debug_text_event( - fsf_req->adapter->erp_dbf, 0, - "fsf_s_did_change:"); atomic_clear_mask( ZFCP_STATUS_PORT_DID_DID, &port->status); @@ -2582,9 +2464,6 @@ zfcp_fsf_open_port_handler(struct zfcp_fsf_req *fsf_req) ZFCP_LOG_NORMAL("bug: An unknown FSF Status was presented " "(debug info 0x%x)\n", header->fsf_status); - debug_text_event(fsf_req->adapter->erp_dbf, 0, "fsf_s_inval:"); - debug_exception(fsf_req->adapter->erp_dbf, 0, - &header->fsf_status, sizeof (u32)); break; } @@ -2688,9 +2567,7 @@ zfcp_fsf_close_port_handler(struct zfcp_fsf_req *fsf_req) ZFCP_HEX_DUMP(ZFCP_LOG_LEVEL_DEBUG, (char *) &fsf_req->qtcb->header.fsf_status_qual, sizeof (union fsf_status_qual)); - debug_text_event(fsf_req->adapter->erp_dbf, 1, - "fsf_s_phand_nv"); - zfcp_erp_adapter_reopen(port->adapter, 0); + zfcp_erp_adapter_reopen(port->adapter, 0, 107, fsf_req); fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR; break; @@ -2705,7 +2582,7 @@ zfcp_fsf_close_port_handler(struct zfcp_fsf_req *fsf_req) ZFCP_LOG_TRACE("remote port 0x016%Lx on adapter %s closed, " "port handle 0x%x\n", port->wwpn, zfcp_get_busid_by_port(port), port->handle); - zfcp_erp_modify_port_status(port, + zfcp_erp_modify_port_status(port, 33, fsf_req, ZFCP_STATUS_COMMON_OPEN, ZFCP_CLEAR); retval = 0; @@ -2715,10 +2592,6 @@ zfcp_fsf_close_port_handler(struct zfcp_fsf_req *fsf_req) ZFCP_LOG_NORMAL("bug: An unknown FSF Status was presented " "(debug info 0x%x)\n", fsf_req->qtcb->header.fsf_status); - debug_text_event(fsf_req->adapter->erp_dbf, 0, "fsf_s_inval:"); - debug_exception(fsf_req->adapter->erp_dbf, 0, - &fsf_req->qtcb->header.fsf_status, - sizeof (u32)); break; } @@ -2831,9 +2704,7 @@ zfcp_fsf_close_physical_port_handler(struct zfcp_fsf_req *fsf_req) ZFCP_HEX_DUMP(ZFCP_LOG_LEVEL_DEBUG, (char *) &header->fsf_status_qual, sizeof (union fsf_status_qual)); - debug_text_event(fsf_req->adapter->erp_dbf, 1, - "fsf_s_phand_nv"); - zfcp_erp_adapter_reopen(port->adapter, 0); + zfcp_erp_adapter_reopen(port->adapter, 0, 108, fsf_req); fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR; break; @@ -2854,8 +2725,7 @@ zfcp_fsf_close_physical_port_handler(struct zfcp_fsf_req *fsf_req) break; } } - debug_text_event(fsf_req->adapter->erp_dbf, 1, "fsf_s_access"); - zfcp_erp_port_access_denied(port); + zfcp_erp_port_access_denied(port, 58, fsf_req); fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR; break; @@ -2865,8 +2735,7 @@ zfcp_fsf_close_physical_port_handler(struct zfcp_fsf_req *fsf_req) "to close it physically.\n", port->wwpn, zfcp_get_busid_by_port(port)); - debug_text_event(fsf_req->adapter->erp_dbf, 1, "fsf_s_pboxed"); - zfcp_erp_port_boxed(port); + zfcp_erp_port_boxed(port, 50, fsf_req); fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR | ZFCP_STATUS_FSFREQ_RETRY; @@ -2881,26 +2750,17 @@ zfcp_fsf_close_physical_port_handler(struct zfcp_fsf_req *fsf_req) case FSF_ADAPTER_STATUS_AVAILABLE: switch (header->fsf_status_qual.word[0]) { case FSF_SQ_INVOKE_LINK_TEST_PROCEDURE: - debug_text_event(fsf_req->adapter->erp_dbf, 1, - "fsf_sq_ltest"); /* This will now be escalated by ERP */ fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR; break; case FSF_SQ_ULP_DEPENDENT_ERP_REQUIRED: /* ERP strategy will escalate */ - debug_text_event(fsf_req->adapter->erp_dbf, 1, - "fsf_sq_ulp"); fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR; break; default: ZFCP_LOG_NORMAL ("bug: Wrong status qualifier 0x%x arrived.\n", header->fsf_status_qual.word[0]); - debug_text_event(fsf_req->adapter->erp_dbf, 0, - "fsf_sq_inval:"); - debug_exception( - fsf_req->adapter->erp_dbf, 0, - &header->fsf_status_qual.word[0], sizeof (u32)); break; } break; @@ -2923,9 +2783,6 @@ zfcp_fsf_close_physical_port_handler(struct zfcp_fsf_req *fsf_req) ZFCP_LOG_NORMAL("bug: An unknown FSF Status was presented " "(debug info 0x%x)\n", header->fsf_status); - debug_text_event(fsf_req->adapter->erp_dbf, 0, "fsf_s_inval:"); - debug_exception(fsf_req->adapter->erp_dbf, 0, - &header->fsf_status, sizeof (u32)); break; } @@ -3057,8 +2914,7 @@ zfcp_fsf_open_unit_handler(struct zfcp_fsf_req *fsf_req) ZFCP_HEX_DUMP(ZFCP_LOG_LEVEL_DEBUG, (char *) &header->fsf_status_qual, sizeof (union fsf_status_qual)); - debug_text_event(adapter->erp_dbf, 1, "fsf_s_ph_nv"); - zfcp_erp_adapter_reopen(unit->port->adapter, 0); + zfcp_erp_adapter_reopen(unit->port->adapter, 0, 109, fsf_req); fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR; break; @@ -3067,8 +2923,6 @@ zfcp_fsf_open_unit_handler(struct zfcp_fsf_req *fsf_req) "remote port 0x%016Lx on adapter %s twice.\n", unit->fcp_lun, unit->port->wwpn, zfcp_get_busid_by_unit(unit)); - debug_text_exception(adapter->erp_dbf, 0, - "fsf_s_uopen"); fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR; break; @@ -3090,8 +2944,7 @@ zfcp_fsf_open_unit_handler(struct zfcp_fsf_req *fsf_req) break; } } - debug_text_event(adapter->erp_dbf, 1, "fsf_s_access"); - zfcp_erp_unit_access_denied(unit); + zfcp_erp_unit_access_denied(unit, 59, fsf_req); atomic_clear_mask(ZFCP_STATUS_UNIT_SHARED, &unit->status); atomic_clear_mask(ZFCP_STATUS_UNIT_READONLY, &unit->status); fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR; @@ -3101,8 +2954,7 @@ zfcp_fsf_open_unit_handler(struct zfcp_fsf_req *fsf_req) ZFCP_LOG_DEBUG("The remote port 0x%016Lx on adapter %s " "needs to be reopened\n", unit->port->wwpn, zfcp_get_busid_by_unit(unit)); - debug_text_event(adapter->erp_dbf, 2, "fsf_s_pboxed"); - zfcp_erp_port_boxed(unit->port); + zfcp_erp_port_boxed(unit->port, 51, fsf_req); fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR | ZFCP_STATUS_FSFREQ_RETRY; break; @@ -3142,9 +2994,7 @@ zfcp_fsf_open_unit_handler(struct zfcp_fsf_req *fsf_req) ZFCP_HEX_DUMP(ZFCP_LOG_LEVEL_DEBUG, (char *) &header->fsf_status_qual, sizeof (union fsf_status_qual)); - debug_text_event(adapter->erp_dbf, 2, - "fsf_s_l_sh_vio"); - zfcp_erp_unit_access_denied(unit); + zfcp_erp_unit_access_denied(unit, 60, fsf_req); atomic_clear_mask(ZFCP_STATUS_UNIT_SHARED, &unit->status); atomic_clear_mask(ZFCP_STATUS_UNIT_READONLY, &unit->status); fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR; @@ -3158,9 +3008,7 @@ zfcp_fsf_open_unit_handler(struct zfcp_fsf_req *fsf_req) unit->fcp_lun, unit->port->wwpn, zfcp_get_busid_by_unit(unit)); - debug_text_event(adapter->erp_dbf, 1, - "fsf_s_max_units"); - zfcp_erp_unit_failed(unit); + zfcp_erp_unit_failed(unit, 34, fsf_req); fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR; break; @@ -3168,26 +3016,17 @@ zfcp_fsf_open_unit_handler(struct zfcp_fsf_req *fsf_req) switch (header->fsf_status_qual.word[0]) { case FSF_SQ_INVOKE_LINK_TEST_PROCEDURE: /* Re-establish link to port */ - debug_text_event(adapter->erp_dbf, 1, - "fsf_sq_ltest"); zfcp_test_link(unit->port); fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR; break; case FSF_SQ_ULP_DEPENDENT_ERP_REQUIRED: /* ERP strategy will escalate */ - debug_text_event(adapter->erp_dbf, 1, - "fsf_sq_ulp"); fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR; break; default: ZFCP_LOG_NORMAL ("bug: Wrong status qualifier 0x%x arrived.\n", header->fsf_status_qual.word[0]); - debug_text_event(adapter->erp_dbf, 0, - "fsf_sq_inval:"); - debug_exception(adapter->erp_dbf, 0, - &header->fsf_status_qual.word[0], - sizeof (u32)); } break; @@ -3239,15 +3078,15 @@ zfcp_fsf_open_unit_handler(struct zfcp_fsf_req *fsf_req) if (exclusive && !readwrite) { ZFCP_LOG_NORMAL("exclusive access of read-only " "unit not supported\n"); - zfcp_erp_unit_failed(unit); + zfcp_erp_unit_failed(unit, 35, fsf_req); fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR; - zfcp_erp_unit_shutdown(unit, 0); + zfcp_erp_unit_shutdown(unit, 0, 80, fsf_req); } else if (!exclusive && readwrite) { ZFCP_LOG_NORMAL("shared access of read-write " "unit not supported\n"); - zfcp_erp_unit_failed(unit); + zfcp_erp_unit_failed(unit, 36, fsf_req); fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR; - zfcp_erp_unit_shutdown(unit, 0); + zfcp_erp_unit_shutdown(unit, 0, 81, fsf_req); } } @@ -3258,9 +3097,6 @@ zfcp_fsf_open_unit_handler(struct zfcp_fsf_req *fsf_req) ZFCP_LOG_NORMAL("bug: An unknown FSF Status was presented " "(debug info 0x%x)\n", header->fsf_status); - debug_text_event(adapter->erp_dbf, 0, "fsf_s_inval:"); - debug_exception(adapter->erp_dbf, 0, - &header->fsf_status, sizeof (u32)); break; } @@ -3373,9 +3209,7 @@ zfcp_fsf_close_unit_handler(struct zfcp_fsf_req *fsf_req) ZFCP_HEX_DUMP(ZFCP_LOG_LEVEL_DEBUG, (char *) &fsf_req->qtcb->header.fsf_status_qual, sizeof (union fsf_status_qual)); - debug_text_event(fsf_req->adapter->erp_dbf, 1, - "fsf_s_phand_nv"); - zfcp_erp_adapter_reopen(unit->port->adapter, 0); + zfcp_erp_adapter_reopen(unit->port->adapter, 0, 110, fsf_req); fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR; break; @@ -3391,9 +3225,7 @@ zfcp_fsf_close_unit_handler(struct zfcp_fsf_req *fsf_req) ZFCP_HEX_DUMP(ZFCP_LOG_LEVEL_DEBUG, (char *) &fsf_req->qtcb->header.fsf_status_qual, sizeof (union fsf_status_qual)); - debug_text_event(fsf_req->adapter->erp_dbf, 1, - "fsf_s_lhand_nv"); - zfcp_erp_port_reopen(unit->port, 0); + zfcp_erp_port_reopen(unit->port, 0, 111, fsf_req); fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR; break; @@ -3402,8 +3234,7 @@ zfcp_fsf_close_unit_handler(struct zfcp_fsf_req *fsf_req) "needs to be reopened\n", unit->port->wwpn, zfcp_get_busid_by_unit(unit)); - debug_text_event(fsf_req->adapter->erp_dbf, 2, "fsf_s_pboxed"); - zfcp_erp_port_boxed(unit->port); + zfcp_erp_port_boxed(unit->port, 52, fsf_req); fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR | ZFCP_STATUS_FSFREQ_RETRY; break; @@ -3412,27 +3243,17 @@ zfcp_fsf_close_unit_handler(struct zfcp_fsf_req *fsf_req) switch (fsf_req->qtcb->header.fsf_status_qual.word[0]) { case FSF_SQ_INVOKE_LINK_TEST_PROCEDURE: /* re-establish link to port */ - debug_text_event(fsf_req->adapter->erp_dbf, 1, - "fsf_sq_ltest"); zfcp_test_link(unit->port); fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR; break; case FSF_SQ_ULP_DEPENDENT_ERP_REQUIRED: /* ERP strategy will escalate */ - debug_text_event(fsf_req->adapter->erp_dbf, 1, - "fsf_sq_ulp"); fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR; break; default: ZFCP_LOG_NORMAL ("bug: Wrong status qualifier 0x%x arrived.\n", fsf_req->qtcb->header.fsf_status_qual.word[0]); - debug_text_event(fsf_req->adapter->erp_dbf, 0, - "fsf_sq_inval:"); - debug_exception( - fsf_req->adapter->erp_dbf, 0, - &fsf_req->qtcb->header.fsf_status_qual.word[0], - sizeof (u32)); break; } break; @@ -3453,10 +3274,6 @@ zfcp_fsf_close_unit_handler(struct zfcp_fsf_req *fsf_req) ZFCP_LOG_NORMAL("bug: An unknown FSF Status was presented " "(debug info 0x%x)\n", fsf_req->qtcb->header.fsf_status); - debug_text_event(fsf_req->adapter->erp_dbf, 0, "fsf_s_inval:"); - debug_exception(fsf_req->adapter->erp_dbf, 0, - &fsf_req->qtcb->header.fsf_status, - sizeof (u32)); break; } @@ -3611,7 +3428,7 @@ zfcp_fsf_send_fcp_command_task(struct zfcp_adapter *adapter, zfcp_get_busid_by_unit(unit), unit->port->wwpn, unit->fcp_lun); - zfcp_erp_unit_shutdown(unit, 0); + zfcp_erp_unit_shutdown(unit, 0, 131, fsf_req); retval = -EINVAL; } goto no_fit; @@ -3769,9 +3586,7 @@ zfcp_fsf_send_fcp_command_handler(struct zfcp_fsf_req *fsf_req) ZFCP_HEX_DUMP(ZFCP_LOG_LEVEL_DEBUG, (char *) &header->fsf_status_qual, sizeof (union fsf_status_qual)); - debug_text_event(fsf_req->adapter->erp_dbf, 1, - "fsf_s_phand_nv"); - zfcp_erp_adapter_reopen(unit->port->adapter, 0); + zfcp_erp_adapter_reopen(unit->port->adapter, 0, 112, fsf_req); fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR; break; @@ -3787,9 +3602,7 @@ zfcp_fsf_send_fcp_command_handler(struct zfcp_fsf_req *fsf_req) ZFCP_HEX_DUMP(ZFCP_LOG_LEVEL_NORMAL, (char *) &header->fsf_status_qual, sizeof (union fsf_status_qual)); - debug_text_event(fsf_req->adapter->erp_dbf, 1, - "fsf_s_uhand_nv"); - zfcp_erp_port_reopen(unit->port, 0); + zfcp_erp_port_reopen(unit->port, 0, 113, fsf_req); fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR; break; @@ -3805,9 +3618,7 @@ zfcp_fsf_send_fcp_command_handler(struct zfcp_fsf_req *fsf_req) ZFCP_HEX_DUMP(ZFCP_LOG_LEVEL_NORMAL, (char *) &header->fsf_status_qual, sizeof (union fsf_status_qual)); - debug_text_event(fsf_req->adapter->erp_dbf, 1, - "fsf_s_hand_mis"); - zfcp_erp_adapter_reopen(unit->port->adapter, 0); + zfcp_erp_adapter_reopen(unit->port->adapter, 0, 114, fsf_req); fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR; break; @@ -3817,9 +3628,7 @@ zfcp_fsf_send_fcp_command_handler(struct zfcp_fsf_req *fsf_req) zfcp_get_busid_by_unit(unit), ZFCP_FC_SERVICE_CLASS_DEFAULT); /* stop operation for this adapter */ - debug_text_exception(fsf_req->adapter->erp_dbf, 0, - "fsf_s_class_nsup"); - zfcp_erp_adapter_shutdown(unit->port->adapter, 0); + zfcp_erp_adapter_shutdown(unit->port->adapter, 0, 132, fsf_req); fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR; break; @@ -3835,9 +3644,7 @@ zfcp_fsf_send_fcp_command_handler(struct zfcp_fsf_req *fsf_req) ZFCP_HEX_DUMP(ZFCP_LOG_LEVEL_DEBUG, (char *) &header->fsf_status_qual, sizeof (union fsf_status_qual)); - debug_text_event(fsf_req->adapter->erp_dbf, 1, - "fsf_s_fcp_lun_nv"); - zfcp_erp_port_reopen(unit->port, 0); + zfcp_erp_port_reopen(unit->port, 0, 115, fsf_req); fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR; break; @@ -3859,8 +3666,7 @@ zfcp_fsf_send_fcp_command_handler(struct zfcp_fsf_req *fsf_req) break; } } - debug_text_event(fsf_req->adapter->erp_dbf, 1, "fsf_s_access"); - zfcp_erp_unit_access_denied(unit); + zfcp_erp_unit_access_denied(unit, 61, fsf_req); fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR; break; @@ -3873,9 +3679,7 @@ zfcp_fsf_send_fcp_command_handler(struct zfcp_fsf_req *fsf_req) zfcp_get_busid_by_unit(unit), fsf_req->qtcb->bottom.io.data_direction); /* stop operation for this adapter */ - debug_text_event(fsf_req->adapter->erp_dbf, 0, - "fsf_s_dir_ind_nv"); - zfcp_erp_adapter_shutdown(unit->port->adapter, 0); + zfcp_erp_adapter_shutdown(unit->port->adapter, 0, 133, fsf_req); fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR; break; @@ -3888,9 +3692,7 @@ zfcp_fsf_send_fcp_command_handler(struct zfcp_fsf_req *fsf_req) zfcp_get_busid_by_unit(unit), fsf_req->qtcb->bottom.io.fcp_cmnd_length); /* stop operation for this adapter */ - debug_text_event(fsf_req->adapter->erp_dbf, 0, - "fsf_s_cmd_len_nv"); - zfcp_erp_adapter_shutdown(unit->port->adapter, 0); + zfcp_erp_adapter_shutdown(unit->port->adapter, 0, 134, fsf_req); fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR; break; @@ -3898,8 +3700,7 @@ zfcp_fsf_send_fcp_command_handler(struct zfcp_fsf_req *fsf_req) ZFCP_LOG_DEBUG("The remote port 0x%016Lx on adapter %s " "needs to be reopened\n", unit->port->wwpn, zfcp_get_busid_by_unit(unit)); - debug_text_event(fsf_req->adapter->erp_dbf, 2, "fsf_s_pboxed"); - zfcp_erp_port_boxed(unit->port); + zfcp_erp_port_boxed(unit->port, 53, fsf_req); fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR | ZFCP_STATUS_FSFREQ_RETRY; break; @@ -3909,8 +3710,7 @@ zfcp_fsf_send_fcp_command_handler(struct zfcp_fsf_req *fsf_req) "wwpn=0x%016Lx, fcp_lun=0x%016Lx)\n", zfcp_get_busid_by_unit(unit), unit->port->wwpn, unit->fcp_lun); - debug_text_event(fsf_req->adapter->erp_dbf, 1, "fsf_s_lboxed"); - zfcp_erp_unit_boxed(unit); + zfcp_erp_unit_boxed(unit, 54, fsf_req); fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR | ZFCP_STATUS_FSFREQ_RETRY; break; @@ -3919,25 +3719,16 @@ zfcp_fsf_send_fcp_command_handler(struct zfcp_fsf_req *fsf_req) switch (header->fsf_status_qual.word[0]) { case FSF_SQ_INVOKE_LINK_TEST_PROCEDURE: /* re-establish link to port */ - debug_text_event(fsf_req->adapter->erp_dbf, 1, - "fsf_sq_ltest"); zfcp_test_link(unit->port); break; case FSF_SQ_ULP_DEPENDENT_ERP_REQUIRED: /* FIXME(hw) need proper specs for proper action */ /* let scsi stack deal with retries and escalation */ - debug_text_event(fsf_req->adapter->erp_dbf, 1, - "fsf_sq_ulp"); break; default: ZFCP_LOG_NORMAL ("Unknown status qualifier 0x%x arrived.\n", header->fsf_status_qual.word[0]); - debug_text_event(fsf_req->adapter->erp_dbf, 0, - "fsf_sq_inval:"); - debug_exception(fsf_req->adapter->erp_dbf, 0, - &header->fsf_status_qual.word[0], - sizeof(u32)); break; } fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR; @@ -3948,12 +3739,6 @@ zfcp_fsf_send_fcp_command_handler(struct zfcp_fsf_req *fsf_req) case FSF_FCP_RSP_AVAILABLE: break; - - default: - debug_text_event(fsf_req->adapter->erp_dbf, 0, "fsf_s_inval:"); - debug_exception(fsf_req->adapter->erp_dbf, 0, - &header->fsf_status, sizeof(u32)); - break; } skip_fsfstatus: @@ -4532,9 +4317,6 @@ zfcp_fsf_control_file_handler(struct zfcp_fsf_req *fsf_req) "was presented on the adapter %s\n", header->fsf_status, zfcp_get_busid_by_adapter(adapter)); - debug_text_event(fsf_req->adapter->erp_dbf, 0, "fsf_sq_inval"); - debug_exception(fsf_req->adapter->erp_dbf, 0, - &header->fsf_status_qual.word[0], sizeof(u32)); fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR; retval = -EINVAL; break; @@ -4724,7 +4506,6 @@ static int zfcp_fsf_req_send(struct zfcp_fsf_req *fsf_req) volatile struct qdio_buffer_element *sbale; int inc_seq_no; int new_distance_from_int; - u64 dbg_tmp[2]; int retval = 0; adapter = fsf_req->adapter; @@ -4774,10 +4555,6 @@ static int zfcp_fsf_req_send(struct zfcp_fsf_req *fsf_req) QDIO_FLAG_SYNC_OUTPUT, 0, fsf_req->sbal_first, fsf_req->sbal_number, NULL); - dbg_tmp[0] = (unsigned long) sbale[0].addr; - dbg_tmp[1] = (u64) retval; - debug_event(adapter->erp_dbf, 4, (void *) dbg_tmp, 16); - if (unlikely(retval)) { /* Queues are down..... */ retval = -EIO; @@ -4792,7 +4569,7 @@ static int zfcp_fsf_req_send(struct zfcp_fsf_req *fsf_req) req_queue->free_index -= fsf_req->sbal_number; req_queue->free_index += QDIO_MAX_BUFFERS_PER_Q; req_queue->free_index %= QDIO_MAX_BUFFERS_PER_Q; /* wrap */ - zfcp_erp_adapter_reopen(adapter, 0); + zfcp_erp_adapter_reopen(adapter, 0, 116, fsf_req); } else { req_queue->distance_from_int = new_distance_from_int; /* diff --git a/drivers/s390/scsi/zfcp_qdio.c b/drivers/s390/scsi/zfcp_qdio.c index 390d9b0..3297684 100644 --- a/drivers/s390/scsi/zfcp_qdio.c +++ b/drivers/s390/scsi/zfcp_qdio.c @@ -225,10 +225,9 @@ zfcp_qdio_handler_error_check(struct zfcp_adapter *adapter, unsigned int status, * That is why we need to clear the the link-down flag * which is set again in case we have missed by a mile. */ - zfcp_erp_adapter_reopen( - adapter, - ZFCP_STATUS_ADAPTER_LINK_UNPLUGGED | - ZFCP_STATUS_COMMON_ERP_FAILED); + zfcp_erp_adapter_reopen(adapter, + ZFCP_STATUS_ADAPTER_LINK_UNPLUGGED | + ZFCP_STATUS_COMMON_ERP_FAILED, 140, 0); } return retval; } @@ -291,8 +290,6 @@ static void zfcp_qdio_reqid_check(struct zfcp_adapter *adapter, struct zfcp_fsf_req *fsf_req; unsigned long flags; - debug_long_event(adapter->erp_dbf, 4, req_id); - spin_lock_irqsave(&adapter->req_list_lock, flags); fsf_req = zfcp_reqlist_ismember(adapter, req_id); diff --git a/drivers/s390/scsi/zfcp_scsi.c b/drivers/s390/scsi/zfcp_scsi.c index 2139c8f..d97cb3e 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) atomic_clear_mask(ZFCP_STATUS_UNIT_REGISTERED, &unit->status); sdpnt->hostdata = NULL; unit->device = NULL; - zfcp_erp_unit_failed(unit); + zfcp_erp_unit_failed(unit, 12, 0); zfcp_unit_put(unit); } else { ZFCP_LOG_NORMAL("bug: no unit associated with SCSI device at " @@ -553,7 +553,7 @@ int zfcp_scsi_eh_host_reset_handler(struct scsi_cmnd *scpnt) ZFCP_LOG_NORMAL("host/bus reset because of problems with " "unit 0x%016Lx\n", unit->fcp_lun); - zfcp_erp_adapter_reopen(adapter, 0); + zfcp_erp_adapter_reopen(adapter, 0, 141, scpnt); zfcp_erp_wait(adapter); return SUCCESS; diff --git a/drivers/s390/scsi/zfcp_sysfs_adapter.c b/drivers/s390/scsi/zfcp_sysfs_adapter.c index 705c6d4..e0bbcc4 100644 --- a/drivers/s390/scsi/zfcp_sysfs_adapter.c +++ b/drivers/s390/scsi/zfcp_sysfs_adapter.c @@ -89,7 +89,7 @@ zfcp_sysfs_port_add_store(struct device *dev, struct device_attribute *attr, con retval = 0; - zfcp_erp_port_reopen(port, 0); + zfcp_erp_port_reopen(port, 0, 91, 0); zfcp_erp_wait(port->adapter); zfcp_port_put(port); out: @@ -147,7 +147,7 @@ zfcp_sysfs_port_remove_store(struct device *dev, struct device_attribute *attr, goto out; } - zfcp_erp_port_shutdown(port, 0); + zfcp_erp_port_shutdown(port, 0, 92, 0); zfcp_erp_wait(adapter); zfcp_port_put(port); zfcp_port_dequeue(port); @@ -191,9 +191,9 @@ zfcp_sysfs_adapter_failed_store(struct device *dev, struct device_attribute *att goto out; } - zfcp_erp_modify_adapter_status(adapter, ZFCP_STATUS_COMMON_RUNNING, - ZFCP_SET); - zfcp_erp_adapter_reopen(adapter, ZFCP_STATUS_COMMON_ERP_FAILED); + zfcp_erp_modify_adapter_status(adapter, 44, 0, + ZFCP_STATUS_COMMON_RUNNING, ZFCP_SET); + zfcp_erp_adapter_reopen(adapter, ZFCP_STATUS_COMMON_ERP_FAILED, 93, 0); zfcp_erp_wait(adapter); out: up(&zfcp_data.config_sema); diff --git a/drivers/s390/scsi/zfcp_sysfs_port.c b/drivers/s390/scsi/zfcp_sysfs_port.c index 1320c05..5381950 100644 --- a/drivers/s390/scsi/zfcp_sysfs_port.c +++ b/drivers/s390/scsi/zfcp_sysfs_port.c @@ -94,7 +94,7 @@ zfcp_sysfs_unit_add_store(struct device *dev, struct device_attribute *attr, con retval = 0; - zfcp_erp_unit_reopen(unit, 0); + zfcp_erp_unit_reopen(unit, 0, 94, 0); zfcp_erp_wait(unit->port->adapter); zfcp_unit_put(unit); out: @@ -150,7 +150,7 @@ zfcp_sysfs_unit_remove_store(struct device *dev, struct device_attribute *attr, goto out; } - zfcp_erp_unit_shutdown(unit, 0); + zfcp_erp_unit_shutdown(unit, 0, 95, 0); zfcp_erp_wait(unit->port->adapter); zfcp_unit_put(unit); zfcp_unit_dequeue(unit); @@ -193,8 +193,9 @@ zfcp_sysfs_port_failed_store(struct device *dev, struct device_attribute *attr, goto out; } - zfcp_erp_modify_port_status(port, ZFCP_STATUS_COMMON_RUNNING, ZFCP_SET); - zfcp_erp_port_reopen(port, ZFCP_STATUS_COMMON_ERP_FAILED); + zfcp_erp_modify_port_status(port, 45, 0, + ZFCP_STATUS_COMMON_RUNNING, ZFCP_SET); + zfcp_erp_port_reopen(port, ZFCP_STATUS_COMMON_ERP_FAILED, 96, 0); zfcp_erp_wait(port->adapter); out: up(&zfcp_data.config_sema); diff --git a/drivers/s390/scsi/zfcp_sysfs_unit.c b/drivers/s390/scsi/zfcp_sysfs_unit.c index 81a4841..0858bcc 100644 --- a/drivers/s390/scsi/zfcp_sysfs_unit.c +++ b/drivers/s390/scsi/zfcp_sysfs_unit.c @@ -94,8 +94,9 @@ zfcp_sysfs_unit_failed_store(struct device *dev, struct device_attribute *attr, goto out; } - zfcp_erp_modify_unit_status(unit, ZFCP_STATUS_COMMON_RUNNING, ZFCP_SET); - zfcp_erp_unit_reopen(unit, ZFCP_STATUS_COMMON_ERP_FAILED); + zfcp_erp_modify_unit_status(unit, 46, 0, + ZFCP_STATUS_COMMON_RUNNING, ZFCP_SET); + zfcp_erp_unit_reopen(unit, ZFCP_STATUS_COMMON_ERP_FAILED, 97, 0); zfcp_erp_wait(unit->port->adapter); out: up(&zfcp_data.config_sema);