• Steffen Maier's avatar
    scsi: zfcp: fix payload with full FCP_RSP IU in SCSI trace records · 12c3e575
    Steffen Maier authored
    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 aceeffbb
    ("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<==superfluous
    
    New 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_INFO
    
    Timestamp      : ...
    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
    Signed-off-by: default avatarSteffen Maier <maier@linux.vnet.ibm.com>
    Fixes: 250a1352 ("[SCSI] zfcp: Redesign of the debug tracing for SCSI records.")
    Cc: <stable@vger.kernel.org> #2.6.38+
    Reviewed-by: default avatarBenjamin Block <bblock@linux.vnet.ibm.com>
    Signed-off-by: default avatarBenjamin Block <bblock@linux.vnet.ibm.com>
    Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
    12c3e575
zfcp_dbf.c 20.3 KB