/** * zfcp_dbf_hba_fsf_res - trace event for fsf responses * @tag: tag indicating which kind of FSF response has been received * @level: trace level to be used for event * @req: request for which a response was received
*/ void zfcp_dbf_hba_fsf_res(char *tag, int level, struct zfcp_fsf_req *req)
{ struct zfcp_dbf *dbf = req->adapter->dbf; struct fsf_qtcb_prefix *q_pref = &req->qtcb->prefix; struct fsf_qtcb_header *q_head = &req->qtcb->header; struct zfcp_dbf_hba *rec = &dbf->hba_buf; unsignedlong flags;
/** * zfcp_dbf_hba_fsf_fces - trace event for fsf responses related to * FC Endpoint Security (FCES) * @tag: tag indicating which kind of FC Endpoint Security event has occurred * @req: request for which a response was received * @wwpn: remote port or ZFCP_DBF_INVALID_WWPN * @fc_security_old: old FC Endpoint Security of FCP device or connection * @fc_security_new: new FC Endpoint Security of FCP device or connection
*/ void zfcp_dbf_hba_fsf_fces(char *tag, conststruct zfcp_fsf_req *req, u64 wwpn,
u32 fc_security_old, u32 fc_security_new)
{ struct zfcp_dbf *dbf = req->adapter->dbf; struct fsf_qtcb_prefix *q_pref = &req->qtcb->prefix; struct fsf_qtcb_header *q_head = &req->qtcb->header; struct zfcp_dbf_hba *rec = &dbf->hba_buf; staticintconst level = 3; unsignedlong flags;
if (unlikely(!debug_level_enabled(dbf->hba, level))) return;
/** * zfcp_dbf_hba_fsf_reqid - trace only the tag and a request ID * @tag: tag documenting the source * @level: trace level * @adapter: adapter instance the request ID belongs to * @req_id: the request ID to trace
*/ void zfcp_dbf_hba_fsf_reqid(constchar *const tag, constint level, struct zfcp_adapter *const adapter, const u64 req_id)
{ struct zfcp_dbf *const dbf = adapter->dbf; struct zfcp_dbf_hba *const rec = &dbf->hba_buf; struct zfcp_dbf_hba_res *const res = &rec->u.res; unsignedlong flags;
if (unlikely(!debug_level_enabled(dbf->hba, level))) return;
/** * zfcp_dbf_hba_fsf_uss - trace event for an unsolicited status buffer * @tag: tag indicating which kind of unsolicited status has been received * @req: request providing the unsolicited status
*/ void zfcp_dbf_hba_fsf_uss(char *tag, struct zfcp_fsf_req *req)
{ struct zfcp_dbf *dbf = req->adapter->dbf; struct fsf_status_read_buffer *srb = req->data; struct zfcp_dbf_hba *rec = &dbf->hba_buf; staticintconst level = 2; unsignedlong flags;
if (unlikely(!debug_level_enabled(dbf->hba, level))) return;
/** * zfcp_dbf_rec_trig_lock - trace event related to triggered recovery with lock * @tag: identifier for event * @adapter: adapter on which the erp_action should run * @port: remote port involved in the erp_action * @sdev: scsi device involved in the erp_action * @want: wanted erp_action * @need: required erp_action * * The adapter->erp_lock must not be held.
*/ void zfcp_dbf_rec_trig_lock(char *tag, struct zfcp_adapter *adapter, struct zfcp_port *port, struct scsi_device *sdev,
u8 want, u8 need)
{ unsignedlong flags;
rec->id = id;
rec->fsf_req_id = req_id;
rec->d_id = d_id;
memcpy(rec->tag, tag, ZFCP_DBF_TAG_LEN);
rec->pl_len = len; /* full length even if we cap pay below */ if (!sg) goto out;
rec_len = min_t(unsignedint, sg->length, ZFCP_DBF_SAN_MAX_PAYLOAD);
memcpy(rec->payload, sg_virt(sg), rec_len); /* part of 1st sg entry */ if (len <= rec_len) goto out; /* skip pay record if full content in rec->payload */
/* if (len > rec_len): * dump data up to cap_len ignoring small duplicate in rec->payload
*/
spin_lock(&dbf->pay_lock);
memset(payload, 0, sizeof(*payload));
memcpy(payload->area, paytag, ZFCP_DBF_TAG_LEN);
payload->fsf_req_id = req_id;
payload->counter = 0; for (; sg && pay_sum < cap_len; sg = sg_next(sg)) {
u16 pay_len, offset = 0;
/** * zfcp_dbf_san_req - trace event for issued SAN request * @tag: identifier for event * @fsf: request containing issued CT or ELS data * @d_id: N_Port_ID where SAN request is sent to * d_id: destination ID
*/ void zfcp_dbf_san_req(char *tag, struct zfcp_fsf_req *fsf, u32 d_id)
{ struct zfcp_dbf *dbf = fsf->adapter->dbf; struct zfcp_fsf_ct_els *ct_els = fsf->data;
u16 length;
if (unlikely(!debug_level_enabled(dbf->san, ZFCP_DBF_SAN_LEVEL))) return;
if (!(memcmp(tag, "fsscth2", 7) == 0
&& ct_els->d_id == FC_FID_DIR_SERV
&& reqh->ct_rev == FC_CT_REV
&& reqh->ct_in_id[0] == 0
&& reqh->ct_in_id[1] == 0
&& reqh->ct_in_id[2] == 0
&& reqh->ct_fs_type == FC_FST_DIR
&& reqh->ct_fs_subtype == FC_NS_SUBTYPE
&& reqh->ct_options == 0
&& reqh->_ct_resvd1 == 0
&& reqh->ct_cmd == cpu_to_be16(FC_NS_GPN_FT) /* reqh->ct_mr_size can vary so do not match but read below */
&& reqh->_ct_resvd2 == 0
&& reqh->ct_reason == 0
&& reqh->ct_explan == 0
&& reqh->ct_vendor == 0
&& reqn->fn_resvd == 0
&& reqn->fn_domain_id_scope == 0
&& reqn->fn_area_id_scope == 0
&& reqn->fn_fc4_type == FC_TYPE_FCP)) return len; /* not GPN_FT response so do not cap */
acc = sg_virt(resp_entry);
/* cap all but accept CT responses to at least the CT header */
resph = (struct fc_ct_hdr *)acc; if ((ct_els->status) ||
(resph->ct_cmd != cpu_to_be16(FC_FS_ACC))) return max(FC_CT_HDR_LEN, ZFCP_DBF_SAN_MAX_PAYLOAD);
max_entries = (be16_to_cpu(reqh->ct_mr_size) * 4 / sizeof(struct fc_gpn_ft_resp))
+ 1 /* zfcp_fc_scan_ports: bytes correct, entries off-by-one
* to account for header as 1st pseudo "entry" */
/* the basic CT_IU preamble is the same size as one entry in the GPN_FT * response, allowing us to skip special handling for it - just skip it
*/ for (x = 1; x < max_entries && !last; x++) { if (x % (ZFCP_FC_GPN_FT_ENT_PAGE + 1))
acc++; else
acc = sg_virt(++resp_entry);
last = acc->fp_flags & FC_NS_FID_LAST;
}
len = min(len, (u16)(x * sizeof(struct fc_gpn_ft_resp))); return len; /* cap after last entry */
}
/** * zfcp_dbf_san_res - trace event for received SAN request * @tag: identifier for event * @fsf: request containing received CT or ELS data
*/ void zfcp_dbf_san_res(char *tag, struct zfcp_fsf_req *fsf)
{ struct zfcp_dbf *dbf = fsf->adapter->dbf; struct zfcp_fsf_ct_els *ct_els = fsf->data;
u16 length;
if (unlikely(!debug_level_enabled(dbf->san, ZFCP_DBF_SAN_LEVEL))) return;
if (fsf) {
rec->fsf_req_id = fsf->req_id;
rec->pl_len = FCP_RESP_WITH_EXT;
fcp_rsp = &(fsf->qtcb->bottom.io.fcp_rsp.iu); /* mandatory parts of FCP_RSP IU in this SCSI record */
memcpy(&rec->fcp_rsp, fcp_rsp, FCP_RESP_WITH_EXT); if (fcp_rsp->resp.fr_flags & FCP_RSP_LEN_VAL) {
fcp_rsp_info = (struct fcp_resp_rsp_info *) &fcp_rsp[1];
rec->fcp_rsp_info = fcp_rsp_info->rsp_code;
rec->pl_len += be32_to_cpu(fcp_rsp->ext.fr_rsp_len);
} if (fcp_rsp->resp.fr_flags & FCP_SNS_LEN_VAL) {
rec->pl_len += be32_to_cpu(fcp_rsp->ext.fr_sns_len);
} /* complete FCP_RSP IU in associated PAYload record * but only if there are optional parts
*/ if (fcp_rsp->resp.fr_flags != 0)
zfcp_dbf_pl_write(
dbf, fcp_rsp, /* at least one full PAY record * but not beyond hardware response field
*/
min_t(u16, max_t(u16, rec->pl_len,
ZFCP_DBF_PAY_MAX_REC),
FSF_FCP_RSP_SIZE), "fcp_riu", fsf->req_id);
}
/** * zfcp_dbf_scsi_eh() - Trace event for special cases of scsi_eh callbacks. * @tag: Identifier for event. * @adapter: Pointer to zfcp adapter as context for this event. * @scsi_id: SCSI ID/target to indicate scope of task management function (TMF). * @ret: Return value of calling function. * * This SCSI trace variant does not depend on any of: * scsi_cmnd, zfcp_fsf_req, scsi_device.
*/ void zfcp_dbf_scsi_eh(char *tag, struct zfcp_adapter *adapter, unsignedint scsi_id, int ret)
{ struct zfcp_dbf *dbf = adapter->dbf; struct zfcp_dbf_scsi *rec = &dbf->scsi_buf; unsignedlong flags; staticintconst level = 1;
if (unlikely(!debug_level_enabled(adapter->dbf->scsi, level))) return;
/** * zfcp_dbf_adapter_register - registers debug feature for an adapter * @adapter: pointer to adapter for which debug features should be registered * return: -ENOMEM on error, 0 otherwise
*/ int zfcp_dbf_adapter_register(struct zfcp_adapter *adapter)
{ char name[DEBUG_MAX_NAME_LEN]; struct zfcp_dbf *dbf;
dbf = kzalloc(sizeof(struct zfcp_dbf), GFP_KERNEL); if (!dbf) return -ENOMEM;
/* debug feature area which records recovery activity */
sprintf(name, "zfcp_%s_rec", dev_name(&adapter->ccw_device->dev));
dbf->rec = zfcp_dbf_reg(name, dbfsize, sizeof(struct zfcp_dbf_rec)); if (!dbf->rec) goto err_out;
/* debug feature area which records HBA (FSF and QDIO) conditions */
sprintf(name, "zfcp_%s_hba", dev_name(&adapter->ccw_device->dev));
dbf->hba = zfcp_dbf_reg(name, dbfsize, sizeof(struct zfcp_dbf_hba)); if (!dbf->hba) goto err_out;
/* debug feature area which records payload info */
sprintf(name, "zfcp_%s_pay", dev_name(&adapter->ccw_device->dev));
dbf->pay = zfcp_dbf_reg(name, dbfsize * 2, sizeof(struct zfcp_dbf_pay)); if (!dbf->pay) goto err_out;
/* debug feature area which records SAN command failures and recovery */
sprintf(name, "zfcp_%s_san", dev_name(&adapter->ccw_device->dev));
dbf->san = zfcp_dbf_reg(name, dbfsize, sizeof(struct zfcp_dbf_san)); if (!dbf->san) goto err_out;
/* debug feature area which records SCSI command failures and recovery */
sprintf(name, "zfcp_%s_scsi", dev_name(&adapter->ccw_device->dev));
dbf->scsi = zfcp_dbf_reg(name, dbfsize, sizeof(struct zfcp_dbf_scsi)); if (!dbf->scsi) goto err_out;
/** * zfcp_dbf_adapter_unregister - unregisters debug feature for an adapter * @adapter: pointer to adapter for which debug features should be unregistered
*/ void zfcp_dbf_adapter_unregister(struct zfcp_adapter *adapter)
{ struct zfcp_dbf *dbf = adapter->dbf;
adapter->dbf = NULL;
zfcp_dbf_unregister(dbf);
}
Messung V0.5
¤ Dauer der Verarbeitung: 0.12 Sekunden
(vorverarbeitet)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.