Blob Blame History Raw
From: Steffen Maier <maier@linux.vnet.ibm.com>
Subject: scsi: zfcp: trace high part of "new" 64 bit SCSI LUN
Patch-mainline: v4.14-rc1
Git-commit: 5d4a3d0a2ff23799b956e5962b886287614e7fad
References: bnc#1066983, LTC#158495

Description:  zfcp: fix tracing regressions, part 2-2
Symptom:      Cannot uniquely identify a 3 or 4 level LUN in SCSI trace
              records. Cannot distinguish 3 or 4 level FCP LUNs which have
              the same lower 32 bits in level 1 and 2.
Problem:      Upstream v3.17 commit 9cb78c16f5da ("scsi: use 64-bit LUNs")
              introduced functionally complete support for full 64 bit
              LUNs, but kept only the low 32 bits of an FCP LUN in the zfcp
              SCSI trace record which is thus no longer necessarily unique.
Solution:     Add new SCSI trace record field for the high 32 bits of a 64
              bit SCSI LUN.
Reproduction: Attach a LUN from a storage target that exports a 3 or 4
              level FCP LUN instead of just 1 or 2 levels. Alternatively,
              increase the trace level of area SCSI and HBA to 6:
              $ cd /sys/kernel/debug/s390dbf/
              $ echo 6 > zfcp_<devbusid>_scsi/level
              $ echo 6 > zfcp_<devbusid>_hba/level
              Then attach a 4 level LUN not necessarily exported by the
              storage to an otherwise operational remote target port:
              $ cd /sys/bus/ccw/drivers/zfcp/<devbusid>/
              $ echo 0x4011402240334044 > 0x<wwpn>/unit_add

Upstream-Description:

              scsi: zfcp: trace high part of "new" 64 bit SCSI LUN

              Complements debugging aspects of the otherwise functionally complete
              v3.17 commit 9cb78c16f5da ("scsi: use 64-bit LUNs").

              While I don't have access to a target exporting 3 or 4 level LUNs,
              I did test it by explicitly attaching a non-existent fake 4 level LUN
              by means of zfcp sysfs attribute "unit_add".
              In order to see corresponding trace records of otherwise successful
              events, we had to increase the trace level of area SCSI and HBA to 6.

              $ echo 6 > /sys/kernel/debug/s390dbf/zfcp_0.0.1880_scsi/level
              $ echo 6 > /sys/kernel/debug/s390dbf/zfcp_0.0.1880_hba/level

              $ echo 0x4011402240334044 > \
                /sys/bus/ccw/drivers/zfcp/0.0.1880/0x50050763031bd327/unit_add

              Example output formatted by an updated zfcpdbf from the s390-tools
              package interspersed with kernel messages at scsi_logging_level=4605:

              Timestamp      : ...
              Area           : REC
              Subarea        : 00
              Level          : 1
              Exception      : -
              CPU ID         : ..
              Caller         : 0x...
              Record ID      : 1
              Tag            : scsla_1
              LUN            : 0x4011402240334044
              WWPN           : 0x50050763031bd327
              D_ID           : 0x00......
              Adapter status : 0x5400050b
              Port status    : 0x54000001
              LUN status     : 0x41000000
              Ready count    : 0x00000001
              Running count  : 0x00000000
              ERP want       : 0x01
              ERP need       : 0x01

              scsi 2:0:0:4630896905707208721: scsi scan: INQUIRY pass 1 length 36
              scsi 2:0:0:4630896905707208721: scsi scan: INQUIRY successful with code 0x0

              Timestamp      : ...
              Area           : HBA
              Subarea        : 00
              Level          : 6
              Exception      : -
              CPU ID         : ..
              Caller         : 0x...
              Record ID      : 1
              Tag            : fs_norm
              Request ID     : 0x<inquiry2-req-id>
              Request status : 0x00000010
              FSF cmnd       : 0x00000001
              FSF sequence no: 0x...
              FSF issued     : ...
              FSF stat       : 0x00000000
              FSF stat qual  : 00000000 00000000 00000000 00000000
              Prot stat      : 0x00000001
              Prot stat qual : ........ ........ 00000000 00000000
              Port handle    : 0x...
              LUN handle     : 0x...
              |
              Timestamp      : ...
              Area           : SCSI
              Subarea        : 00
              Level          : 6
              Exception      : -
              CPU ID         : ..
              Caller         : 0x...
              Record ID      : 1
              Tag            : rsl_nor
              Request ID     : 0x<inquiry2-req-id>
              SCSI ID        : 0x00000000
              SCSI LUN       : 0x40224011
              SCSI LUN high  : 0x40444033 <=======================
              SCSI result    : 0x00000000
              SCSI retries   : 0x00
              SCSI allowed   : 0x03
              SCSI scribble  : 0x<inquiry2-req-id>
              SCSI opcode    : 12000000 a4000000 00000000 00000000
              FCP rsp inf cod: 0x00
              FCP rsp IU     : 00000000 00000000 00000000 00000000
                               00000000 00000000

              scsi 2:0:0:4630896905707208721: scsi scan: INQUIRY pass 2 length 164
              scsi 2:0:0:4630896905707208721: scsi scan: INQUIRY successful with code 0x0
              scsi 2:0:0:4630896905707208721: scsi scan: peripheral device type of 31, \
              no device added

              Signed-off-by: Steffen Maier <maier@linux.vnet.ibm.com>
              Fixes: 9cb78c16f5da ("scsi: use 64-bit LUNs")
              Cc: <stable@vger.kernel.org> #3.17+
              Reviewed-by: Benjamin Block <bblock@linux.vnet.ibm.com>
              Reviewed-by: Jens Remus <jremus@linux.vnet.ibm.com>
              Signed-off-by: Benjamin Block <bblock@linux.vnet.ibm.com>
              Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>


Signed-off-by: Steffen Maier <maier@linux.vnet.ibm.com>
Acked-by: Hannes Reinecke <hare@suse.com>
---
 drivers/s390/scsi/zfcp_dbf.c |    2 +-
 drivers/s390/scsi/zfcp_dbf.h |    4 +++-
 2 files changed, 4 insertions(+), 2 deletions(-)

--- a/drivers/s390/scsi/zfcp_dbf.c
+++ b/drivers/s390/scsi/zfcp_dbf.c
@@ -563,8 +563,8 @@ void zfcp_dbf_scsi(char *tag, int level,
 	rec->scsi_retries = sc->retries;
 	rec->scsi_allowed = sc->allowed;
 	rec->scsi_id = sc->device->id;
-	/* struct zfcp_dbf_scsi needs to be updated to handle 64bit LUNs */
 	rec->scsi_lun = (u32)sc->device->lun;
+	rec->scsi_lun_64_hi = (u32)(sc->device->lun >> 32);
 	rec->host_scribble = (unsigned long)sc->host_scribble;
 
 	memcpy(rec->scsi_opcode, sc->cmnd,
--- a/drivers/s390/scsi/zfcp_dbf.h
+++ b/drivers/s390/scsi/zfcp_dbf.h
@@ -204,7 +204,7 @@ enum zfcp_dbf_scsi_id {
  * @id: unique number of recovery record type
  * @tag: identifier string specifying the location of initiation
  * @scsi_id: scsi device id
- * @scsi_lun: scsi device logical unit number
+ * @scsi_lun: scsi device logical unit number, low part of 64 bit, old 32 bit
  * @scsi_result: scsi result
  * @scsi_retries: current retry number of scsi request
  * @scsi_allowed: allowed retries
@@ -214,6 +214,7 @@ enum zfcp_dbf_scsi_id {
  * @host_scribble: LLD specific data attached to SCSI request
  * @pl_len: length of paload stored as zfcp_dbf_pay
  * @fsf_rsp: response for fsf request
+ * @scsi_lun_64_hi: scsi device logical unit number, high part of 64 bit
  */
 struct zfcp_dbf_scsi {
 	u8 id;
@@ -230,6 +231,7 @@ struct zfcp_dbf_scsi {
 	u64 host_scribble;
 	u16 pl_len;
 	struct fcp_resp_with_ext fcp_rsp;
+	u32 scsi_lun_64_hi;
 } __packed;
 
 /**