Message ID | 1470846653-90691-3-git-send-email-maier@linux.vnet.ibm.com (mailing list archive) |
---|---|
State | Accepted, archived |
Headers | show |
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 --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));