mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-31 04:01:48 -04:00
[SCSI] libfc: fix lun reset failure bugs in fc_fcp_resp handling of FCP_RSP_INFO
In LUN RESET testing involving NetApp targets, it is observed that LUN RESET is failing. The fc_fcp_resp() is not completing the completion for the LUN RESET task since fc_fcp_resp assumes that the FCP_RSP_INFO is 8 bytes with the 4 byte reserved field, where in case of NetApp targets the FCP_RSP to LUN RESET only has 4 bytes of FCP_RSP_INFO. This leads fc_fcp_resp to error out w/o completing the task completion, eventually causing LUN RESET to be escalated to host reset, which is not very nice. Per FCP-3 r04, clause 9.5.15 and Table 23, the FCP_RSP_INFO field can be either 4 bytes or 8 bytes, with the last 4 bytes as "Reserved (if any)". Therefore it is valid to have 4 bytes FCP_RSP_INFO like some of the NetApp targets behave. Fixing this by validating the FCP_RSP_INFO against both the two spec allowed length. Reported-by: Frank Zhang <[email protected]> Signed-off-by: Yi Zou <[email protected]> Tested-by: Ross Brattain <[email protected]> Signed-off-by: Robert Love <[email protected]> Signed-off-by: James Bottomley <[email protected]>
This commit is contained in:
parent
31c37a6f21
commit
3b64b18811
2 changed files with 8 additions and 1 deletions
|
|
@ -851,7 +851,8 @@ static void fc_fcp_resp(struct fc_fcp_pkt *fsp, struct fc_frame *fp)
|
|||
fc_rp_info = (struct fcp_resp_rsp_info *)(rp_ex + 1);
|
||||
if (flags & FCP_RSP_LEN_VAL) {
|
||||
respl = ntohl(rp_ex->fr_rsp_len);
|
||||
if (respl != sizeof(*fc_rp_info))
|
||||
if ((respl != FCP_RESP_RSP_INFO_LEN4) &&
|
||||
(respl != FCP_RESP_RSP_INFO_LEN8))
|
||||
goto len_err;
|
||||
if (fsp->wait_for_comp) {
|
||||
/* Abuse cdb_status for rsp code */
|
||||
|
|
|
|||
Loading…
Reference in a new issue