Patch "scsi: zfcp: fix payload with full FCP_RSP IU in SCSI trace records" has been added to the 3.18-stable tree
Subsystems (3)
This is a note to let you know that I've just added the patch titled
scsi: zfcp: fix payload with full FCP_RSP IU in SCSI trace records
to the 3.18-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
scsi-zfcp-fix-payload-with-full-fcp_rsp-iu-in-scsi-trace-records.patch
and it can be found in the queue-3.18 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
12c3e5754c8022a4f2fd1e9f00d19e99ee0d3cc1Mon Sep 17 00:00:00 2001
From: Steffen Maier <[email protected]>
Date: Fri, 28 Jul 2017 12:30:56 +0200
Subject: scsi: zfcp: fix payload with full FCP_RSP IU in SCSI trace records
From: Steffen Maier <[email protected]>
commit 12c3e5754c8022a4f2fd1e9f00d19e99ee0d3cc1 upstream.
If the FCP_RSP UI has optional parts (FCP_SNS_INFO or FCP_RSP_INFO) and thus does not fit into the fsp_rsp field built into a SCSI trace record, trace the full FCP_RSP UI with all optional parts as payload record instead of just FCP_SNS_INFO as payload and
a 1 byte RSP_INFO_CODE part of FCP_RSP_INFO built into the SCSI record.
That way we would also get the full FCP_SNS_INFO in case a target would ever send more than min(SCSI_SENSE_BUFFERSIZE==96, ZFCP_DBF_PAY_MAX_REC==256)==96.
The mandatory part of FCP_RSP IU is only 24 bytes.
PAYload costs at least one full PAY record of 256 bytes anyway. We cap to the hardware response size which is only FSF_FCP_RSP_SIZE==128. So we can just put the whole FCP_RSP IU with any optional parts into PAYload similarly as we do for SAN PAY since v4.9 commit aceeffbb59bb ("zfcp: trace full payload of all SAN records (req,resp,iels)"). This does not cause any additional trace records wasting memory.
Decoded trace records were confusing because they showed a hard-coded sense data length of 96 even if the FCP_RSP_IU field FCP_SNS_LEN showed actually less.
Since the same commit, we set pl_len for SAN traces to the full length of a request/response even if we cap the corresponding trace.
In contrast, here for SCSI traces we set pl_len to the pre-computed length of FCP_RSP IU considering SNS_LEN or RSP_LEN if valid. Nonetheless we trace a hardcoded payload of length FSF_FCP_RSP_SIZE==128 if there were optional parts.
This makes it easier for the zfcpdbf tool to format only the relevant part of the long FCP_RSP UI buffer. And any trailing information is still available in the payload trace record just in case.
Rename the payload record tag from "fcp_sns" to "fcp_riu" to make the new content explicit to zfcpdbf which can then pick a suitable field name such as "FCP rsp IU all:" instead of "Sense info :"
Also, the same zfcpdbf can still be backwards compatible with "fcp_sns".
Old example trace record before this fix, formatted with the tool zfcpdbf from s390-tools:
Timestamp : ...
Area : SCSI
Subarea : 00
Level : 3
Exception : -
CPU id : ..
Caller : 0x...
Record id : 1
Tag : rsl_err
Request id : 0x<request_id>
SCSI ID : 0x...
SCSI LUN : 0x...
SCSI result : 0x00000002
SCSI retries : 0x00
SCSI allowed : 0x05
SCSI scribble : 0x<request_id>
SCSI opcode : 00000000 00000000 00000000 00000000
FCP rsp inf cod: 0x00
FCP rsp IU : 00000000 00000000 00000202 00000000
^^==FCP_SNS_LEN_VALID
00000020 00000000
^^^^^^^^==FCP_SNS_LEN==32
Sense len : 96 <==min(SCSI_SENSE_BUFFERSIZE,ZFCP_DBF_PAY_MAX_REC)
Sense info : 70000600 00000018 00000000 29000000
00000400 00000000 00000000 00000000
00000000 00000000 00000000 00000000<==superfluous
00000000 00000000 00000000 00000000<==superfluous
00000000 00000000 00000000 00000000<==superfluous
00000000 00000000 00000000 00000000<==superfluousNew example trace records with this fix:
Timestamp : ...
Area : SCSI
Subarea : 00
Level : 3
Exception : -
CPU ID : ..
Caller : 0x...
Record ID : 1
Tag : rsl_err
Request ID : 0x<request_id>
SCSI ID : 0x...
SCSI LUN : 0x...
SCSI result : 0x00000002
SCSI retries : 0x00
SCSI allowed : 0x03
SCSI scribble : 0x<request_id>
SCSI opcode : a30c0112 00000000 02000000 00000000
FCP rsp inf cod: 0x00
FCP rsp IU : 00000000 00000000 00000a02 00000200
00000020 00000000
FCP rsp IU len : 56
FCP rsp IU all : 00000000 00000000 00000a02 00000200
^^=FCP_RESID_UNDER|FCP_SNS_LEN_VALID
00000020 00000000 70000500 00000018
^^^^^^^^==FCP_SNS_LEN
^^^^^^^^^^^^^^^^^
00000000 240000cb 00011100 00000000
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
00000000 00000000
^^^^^^^^^^^^^^^^^==FCP_SNS_INFOTimestamp : ...
Area : SCSI
Subarea : 00
Level : 1
Exception : -
CPU ID : ..
Caller : 0x...
Record ID : 1
Tag : lr_okay
Request ID : 0x<request_id>
SCSI ID : 0x...
SCSI LUN : 0x...
SCSI result : 0x00000000
SCSI retries : 0x00
SCSI allowed : 0x05
SCSI scribble : 0x<request_id>
SCSI opcode : <CDB of unrelated SCSI command passed to eh handler>
FCP rsp inf cod: 0x00
FCP rsp IU : 00000000 00000000 00000100 00000000
00000000 00000008
FCP rsp IU len : 32
FCP rsp IU all : 00000000 00000000 00000100 00000000
^^==FCP_RSP_LEN_VALID
00000000 00000008 00000000 00000000
^^^^^^^^==FCP_RSP_LEN
^^^^^^^^^^^^^^^^^==FCP_RSP_INFO--- drivers/s390/scsi/zfcp_dbf.c | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-)
drivers/s390/scsi/zfcp_dbf.c +17 -4
@@ -427,19 +427,32 @@ void zfcp_dbf_scsi(char *tag, struct scsif (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,1 , rec,sizeof (*rec));
Patches currently in stable-queue which might be from [email protected] are
queue-3.18/scsi-zfcp-add-handling-for-fcp_resid_over-to-the-fcp-ingress-path.patch queue-3.18/scsi-zfcp-trace-high-part-of-new-64-bit-scsi-lun.patch queue-3.18/scsi-zfcp-fix-queuecommand-for-scsi_eh-commands-when-dix-enabled.patch queue-3.18/scsi-zfcp-fix-payload-with-full-fcp_rsp-iu-in-scsi-trace-records.patch queue-3.18/scsi-zfcp-trace-hba-fsf-response-by-default-on-dismiss-or-timedout-late-response.patch queue-3.18/scsi-zfcp-fix-missing-trace-records-for-early-returns-in-tmf-eh-handlers.patch