|
@@ -572,19 +572,32 @@ void zfcp_dbf_scsi(char *tag, int level, struct scsi_cmnd *sc,
|
|
|
|
|
|
if (fsf) {
|
|
|
rec->fsf_req_id = fsf->req_id;
|
|
|
+ rec->pl_len = FCP_RESP_WITH_EXT;
|
|
|
fcp_rsp = (struct fcp_resp_with_ext *)
|
|
|
&(fsf->qtcb->bottom.io.fcp_rsp);
|
|
|
+ /* 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 = min((u16)SCSI_SENSE_BUFFERSIZE,
|
|
|
- (u16)ZFCP_DBF_PAY_MAX_REC);
|
|
|
- zfcp_dbf_pl_write(dbf, sc->sense_buffer, rec->pl_len,
|
|
|
- "fcp_sns", fsf->req_id);
|
|
|
+ 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);
|
|
|
}
|
|
|
|
|
|
debug_event(dbf->scsi, level, rec, sizeof(*rec));
|