diff mbox

[02/10] zfcp: fix ELS/GS request&response length for hardware data router

Message ID 1470846653-90691-3-git-send-email-maier@linux.vnet.ibm.com (mailing list archive)
State Accepted, archived
Headers show

Commit Message

Steffen Maier Aug. 10, 2016, 4:30 p.m. UTC
In the hardware data router case, introduced with kernel 3.2
commit 86a9668a8d29 ("[SCSI] zfcp: support for hardware data router")
the ELS/GS request&response length needs to be initialized
as in the chained SBAL case.

Otherwise, the FCP channel rejects ELS requests with
FSF_REQUEST_SIZE_TOO_LARGE.

Such ELS requests can be issued by user space through BSG / HBA API,
or zfcp itself uses ADISC ELS for remote port link test on RSCN.
The latter can cause a short path outage due to
unnecessary remote target port recovery because the always
failing ADISC cannot detect extremely short path interruptions
beyond the local FCP channel.

Below example is decoded with zfcpdbf from s390-tools:

Timestamp      : ...
Area           : SAN
Subarea        : 00
Level          : 1
Exception      : -
CPU id         : ..
Caller         : zfcp_dbf_san_req+0408
Record id      : 1
Tag            : fssels1
Request id     : 0x<reqid>
Destination ID : 0x00<target d_id>
Payload info   : 52000000 00000000 <our wwpn       >           [ADISC]
                 <our wwnn       > 00<s_id> 00000000
                 00000000 00000000 00000000 00000000

Timestamp      : ...
Area           : HBA
Subarea        : 00
Level          : 1
Exception      : -
CPU id         : ..
Caller         : zfcp_dbf_hba_fsf_res+0740
Record id      : 1
Tag            : fs_ferr
Request id     : 0x<reqid>
Request status : 0x00000010
FSF cmnd       : 0x0000000b               [FSF_QTCB_SEND_ELS]
FSF sequence no: 0x...
FSF issued     : ...
FSF stat       : 0x00000061		  [FSF_REQUEST_SIZE_TOO_LARGE]
FSF stat qual  : 00000000 00000000 00000000 00000000
Prot stat      : 0x00000100
Prot stat qual : 00000000 00000000 00000000 00000000

Signed-off-by: Steffen Maier <maier@linux.vnet.ibm.com>
Fixes: 86a9668a8d29 ("[SCSI] zfcp: support for hardware data router")
Cc: <stable@vger.kernel.org> # 3.2+
Reviewed-by: Benjamin Block <bblock@linux.vnet.ibm.com>
---
 drivers/s390/scsi/zfcp_fsf.c | 4 ++++
 1 file changed, 4 insertions(+)

Comments

Hannes Reinecke Aug. 11, 2016, 11:20 a.m. UTC | #1
On 08/10/2016 06:30 PM, Steffen Maier wrote:
> In the hardware data router case, introduced with kernel 3.2
> commit 86a9668a8d29 ("[SCSI] zfcp: support for hardware data router")
> the ELS/GS request&response length needs to be initialized
> as in the chained SBAL case.
> 
> Otherwise, the FCP channel rejects ELS requests with
> FSF_REQUEST_SIZE_TOO_LARGE.
> 
> Such ELS requests can be issued by user space through BSG / HBA API,
> or zfcp itself uses ADISC ELS for remote port link test on RSCN.
> The latter can cause a short path outage due to
> unnecessary remote target port recovery because the always
> failing ADISC cannot detect extremely short path interruptions
> beyond the local FCP channel.
> 
> Below example is decoded with zfcpdbf from s390-tools:
> 
> Timestamp      : ...
> Area           : SAN
> Subarea        : 00
> Level          : 1
> Exception      : -
> CPU id         : ..
> Caller         : zfcp_dbf_san_req+0408
> Record id      : 1
> Tag            : fssels1
> Request id     : 0x<reqid>
> Destination ID : 0x00<target d_id>
> Payload info   : 52000000 00000000 <our wwpn       >           [ADISC]
>                  <our wwnn       > 00<s_id> 00000000
>                  00000000 00000000 00000000 00000000
> 
> Timestamp      : ...
> Area           : HBA
> Subarea        : 00
> Level          : 1
> Exception      : -
> CPU id         : ..
> Caller         : zfcp_dbf_hba_fsf_res+0740
> Record id      : 1
> Tag            : fs_ferr
> Request id     : 0x<reqid>
> Request status : 0x00000010
> FSF cmnd       : 0x0000000b               [FSF_QTCB_SEND_ELS]
> FSF sequence no: 0x...
> FSF issued     : ...
> FSF stat       : 0x00000061		  [FSF_REQUEST_SIZE_TOO_LARGE]
> FSF stat qual  : 00000000 00000000 00000000 00000000
> Prot stat      : 0x00000100
> Prot stat qual : 00000000 00000000 00000000 00000000
> 
> Signed-off-by: Steffen Maier <maier@linux.vnet.ibm.com>
> Fixes: 86a9668a8d29 ("[SCSI] zfcp: support for hardware data router")
> Cc: <stable@vger.kernel.org> # 3.2+
> Reviewed-by: Benjamin Block <bblock@linux.vnet.ibm.com>
> ---
>  drivers/s390/scsi/zfcp_fsf.c | 4 ++++
>  1 file changed, 4 insertions(+)
> 
Reviewed-by: Hannes Reinecke <hare@suse.com>

Cheers,

Hannes
diff mbox

Patch

diff --git a/drivers/s390/scsi/zfcp_fsf.c b/drivers/s390/scsi/zfcp_fsf.c
index 84353f45cfe6..96d35a7209fa 100644
--- a/drivers/s390/scsi/zfcp_fsf.c
+++ b/drivers/s390/scsi/zfcp_fsf.c
@@ -984,8 +984,12 @@  static int zfcp_fsf_setup_ct_els_sbals(struct zfcp_fsf_req *req,
 	if (zfcp_adapter_multi_buffer_active(adapter)) {
 		if (zfcp_qdio_sbals_from_sg(qdio, &req->qdio_req, sg_req))
 			return -EIO;
+		qtcb->bottom.support.req_buf_length =
+			zfcp_qdio_real_bytes(sg_req);
 		if (zfcp_qdio_sbals_from_sg(qdio, &req->qdio_req, sg_resp))
 			return -EIO;
+		qtcb->bottom.support.resp_buf_length =
+			zfcp_qdio_real_bytes(sg_resp);
 
 		zfcp_qdio_set_data_div(qdio, &req->qdio_req,
 					zfcp_qdio_sbale_count(sg_req));