|
Daniel Wagner |
9b8299 |
From: Quinn Tran <qutran@marvell.com>
|
|
Daniel Wagner |
9b8299 |
Date: Tue, 26 Oct 2021 04:54:11 -0700
|
|
Daniel Wagner |
9b8299 |
Subject: scsi: qla2xxx: edif: Fix EDIF bsg
|
|
Daniel Wagner |
9b8299 |
Patch-mainline: v5.16-rc1
|
|
Daniel Wagner |
9b8299 |
Git-commit: 9fd26c633e8ab5a291c0241533efff161bbe5570
|
|
Daniel Wagner |
9b8299 |
References: git-fixes
|
|
Daniel Wagner |
9b8299 |
|
|
Daniel Wagner |
9b8299 |
Various EDIF bsgs did not properly fill out the reply_payload_rcv_len
|
|
Daniel Wagner |
9b8299 |
field. This causes app to parse empty data in the return payload.
|
|
Daniel Wagner |
9b8299 |
|
|
Daniel Wagner |
9b8299 |
Link: https://lore.kernel.org/r/20211026115412.27691-13-njavali@marvell.com
|
|
Daniel Wagner |
9b8299 |
Fixes: 7ebb336e45ef ("scsi: qla2xxx: edif: Add start + stop bsgs")
|
|
Daniel Wagner |
9b8299 |
Reviewed-by: Himanshu Madhani <himanshu.madhani@oracle.com>
|
|
Daniel Wagner |
9b8299 |
Signed-off-by: Quinn Tran <qutran@marvell.com>
|
|
Daniel Wagner |
9b8299 |
Signed-off-by: Nilesh Javali <njavali@marvell.com>
|
|
Daniel Wagner |
9b8299 |
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
|
|
Daniel Wagner |
9b8299 |
Acked-by: Daniel Wagner <dwagner@suse.de>
|
|
Daniel Wagner |
9b8299 |
---
|
|
Daniel Wagner |
9b8299 |
drivers/scsi/qla2xxx/qla_edif.c | 49 ++++++++++++++++++----------------------
|
|
Daniel Wagner |
9b8299 |
1 file changed, 23 insertions(+), 26 deletions(-)
|
|
Daniel Wagner |
9b8299 |
|
|
Daniel Wagner |
9b8299 |
--- a/drivers/scsi/qla2xxx/qla_edif.c
|
|
Daniel Wagner |
9b8299 |
+++ b/drivers/scsi/qla2xxx/qla_edif.c
|
|
Daniel Wagner |
9b8299 |
@@ -544,14 +544,14 @@ qla_edif_app_start(scsi_qla_host_t *vha,
|
|
Daniel Wagner |
9b8299 |
appreply.edif_enode_active = vha->pur_cinfo.enode_flags;
|
|
Daniel Wagner |
9b8299 |
appreply.edif_edb_active = vha->e_dbell.db_flags;
|
|
Daniel Wagner |
9b8299 |
|
|
Daniel Wagner |
9b8299 |
- bsg_job->reply_len = sizeof(struct fc_bsg_reply) +
|
|
Daniel Wagner |
9b8299 |
- sizeof(struct app_start_reply);
|
|
Daniel Wagner |
9b8299 |
+ bsg_job->reply_len = sizeof(struct fc_bsg_reply);
|
|
Daniel Wagner |
9b8299 |
|
|
Daniel Wagner |
9b8299 |
SET_DID_STATUS(bsg_reply->result, DID_OK);
|
|
Daniel Wagner |
9b8299 |
|
|
Daniel Wagner |
9b8299 |
- sg_copy_from_buffer(bsg_job->reply_payload.sg_list,
|
|
Daniel Wagner |
9b8299 |
- bsg_job->reply_payload.sg_cnt, &appreply,
|
|
Daniel Wagner |
9b8299 |
- sizeof(struct app_start_reply));
|
|
Daniel Wagner |
9b8299 |
+ bsg_reply->reply_payload_rcv_len = sg_copy_from_buffer(bsg_job->reply_payload.sg_list,
|
|
Daniel Wagner |
9b8299 |
+ bsg_job->reply_payload.sg_cnt,
|
|
Daniel Wagner |
9b8299 |
+ &appreply,
|
|
Daniel Wagner |
9b8299 |
+ sizeof(struct app_start_reply));
|
|
Daniel Wagner |
9b8299 |
|
|
Daniel Wagner |
9b8299 |
ql_dbg(ql_dbg_edif, vha, 0x911d,
|
|
Daniel Wagner |
9b8299 |
"%s app start completed with 0x%x\n",
|
|
Daniel Wagner |
9b8299 |
@@ -748,9 +748,10 @@ qla_edif_app_authok(scsi_qla_host_t *vha
|
|
Daniel Wagner |
9b8299 |
|
|
Daniel Wagner |
9b8299 |
errstate_exit:
|
|
Daniel Wagner |
9b8299 |
bsg_job->reply_len = sizeof(struct fc_bsg_reply);
|
|
Daniel Wagner |
9b8299 |
- sg_copy_from_buffer(bsg_job->reply_payload.sg_list,
|
|
Daniel Wagner |
9b8299 |
- bsg_job->reply_payload.sg_cnt, &appplogireply,
|
|
Daniel Wagner |
9b8299 |
- sizeof(struct app_plogi_reply));
|
|
Daniel Wagner |
9b8299 |
+ bsg_reply->reply_payload_rcv_len = sg_copy_from_buffer(bsg_job->reply_payload.sg_list,
|
|
Daniel Wagner |
9b8299 |
+ bsg_job->reply_payload.sg_cnt,
|
|
Daniel Wagner |
9b8299 |
+ &appplogireply,
|
|
Daniel Wagner |
9b8299 |
+ sizeof(struct app_plogi_reply));
|
|
Daniel Wagner |
9b8299 |
|
|
Daniel Wagner |
9b8299 |
return rval;
|
|
Daniel Wagner |
9b8299 |
}
|
|
Daniel Wagner |
9b8299 |
@@ -833,7 +834,7 @@ static int
|
|
Daniel Wagner |
9b8299 |
qla_edif_app_getfcinfo(scsi_qla_host_t *vha, struct bsg_job *bsg_job)
|
|
Daniel Wagner |
9b8299 |
{
|
|
Daniel Wagner |
9b8299 |
int32_t rval = 0;
|
|
Daniel Wagner |
9b8299 |
- int32_t num_cnt;
|
|
Daniel Wagner |
9b8299 |
+ int32_t pcnt = 0;
|
|
Daniel Wagner |
9b8299 |
struct fc_bsg_reply *bsg_reply = bsg_job->reply;
|
|
Daniel Wagner |
9b8299 |
struct app_pinfo_req app_req;
|
|
Daniel Wagner |
9b8299 |
struct app_pinfo_reply *app_reply;
|
|
Daniel Wagner |
9b8299 |
@@ -845,16 +846,14 @@ qla_edif_app_getfcinfo(scsi_qla_host_t *
|
|
Daniel Wagner |
9b8299 |
bsg_job->request_payload.sg_cnt, &app_req,
|
|
Daniel Wagner |
9b8299 |
sizeof(struct app_pinfo_req));
|
|
Daniel Wagner |
9b8299 |
|
|
Daniel Wagner |
9b8299 |
- num_cnt = app_req.num_ports; /* num of ports alloc'd by app */
|
|
Daniel Wagner |
9b8299 |
-
|
|
Daniel Wagner |
9b8299 |
app_reply = kzalloc((sizeof(struct app_pinfo_reply) +
|
|
Daniel Wagner |
9b8299 |
- sizeof(struct app_pinfo) * num_cnt), GFP_KERNEL);
|
|
Daniel Wagner |
9b8299 |
+ sizeof(struct app_pinfo) * app_req.num_ports), GFP_KERNEL);
|
|
Daniel Wagner |
9b8299 |
+
|
|
Daniel Wagner |
9b8299 |
if (!app_reply) {
|
|
Daniel Wagner |
9b8299 |
SET_DID_STATUS(bsg_reply->result, DID_ERROR);
|
|
Daniel Wagner |
9b8299 |
rval = -1;
|
|
Daniel Wagner |
9b8299 |
} else {
|
|
Daniel Wagner |
9b8299 |
struct fc_port *fcport = NULL, *tf;
|
|
Daniel Wagner |
9b8299 |
- uint32_t pcnt = 0;
|
|
Daniel Wagner |
9b8299 |
|
|
Daniel Wagner |
9b8299 |
list_for_each_entry_safe(fcport, tf, &vha->vp_fcports, list) {
|
|
Daniel Wagner |
9b8299 |
if (!(fcport->flags & FCF_FCSP_DEVICE))
|
|
Daniel Wagner |
9b8299 |
@@ -923,9 +922,11 @@ qla_edif_app_getfcinfo(scsi_qla_host_t *
|
|
Daniel Wagner |
9b8299 |
SET_DID_STATUS(bsg_reply->result, DID_OK);
|
|
Daniel Wagner |
9b8299 |
}
|
|
Daniel Wagner |
9b8299 |
|
|
Daniel Wagner |
9b8299 |
- sg_copy_from_buffer(bsg_job->reply_payload.sg_list,
|
|
Daniel Wagner |
9b8299 |
- bsg_job->reply_payload.sg_cnt, app_reply,
|
|
Daniel Wagner |
9b8299 |
- sizeof(struct app_pinfo_reply) + sizeof(struct app_pinfo) * num_cnt);
|
|
Daniel Wagner |
9b8299 |
+ bsg_job->reply_len = sizeof(struct fc_bsg_reply);
|
|
Daniel Wagner |
9b8299 |
+ bsg_reply->reply_payload_rcv_len = sg_copy_from_buffer(bsg_job->reply_payload.sg_list,
|
|
Daniel Wagner |
9b8299 |
+ bsg_job->reply_payload.sg_cnt,
|
|
Daniel Wagner |
9b8299 |
+ app_reply,
|
|
Daniel Wagner |
9b8299 |
+ sizeof(struct app_pinfo_reply) + sizeof(struct app_pinfo) * pcnt);
|
|
Daniel Wagner |
9b8299 |
|
|
Daniel Wagner |
9b8299 |
kfree(app_reply);
|
|
Daniel Wagner |
9b8299 |
|
|
Daniel Wagner |
9b8299 |
@@ -942,10 +943,11 @@ qla_edif_app_getstats(scsi_qla_host_t *v
|
|
Daniel Wagner |
9b8299 |
{
|
|
Daniel Wagner |
9b8299 |
int32_t rval = 0;
|
|
Daniel Wagner |
9b8299 |
struct fc_bsg_reply *bsg_reply = bsg_job->reply;
|
|
Daniel Wagner |
9b8299 |
- uint32_t ret_size, size;
|
|
Daniel Wagner |
9b8299 |
+ uint32_t size;
|
|
Daniel Wagner |
9b8299 |
|
|
Daniel Wagner |
9b8299 |
struct app_sinfo_req app_req;
|
|
Daniel Wagner |
9b8299 |
struct app_stats_reply *app_reply;
|
|
Daniel Wagner |
9b8299 |
+ uint32_t pcnt = 0;
|
|
Daniel Wagner |
9b8299 |
|
|
Daniel Wagner |
9b8299 |
sg_copy_to_buffer(bsg_job->request_payload.sg_list,
|
|
Daniel Wagner |
9b8299 |
bsg_job->request_payload.sg_cnt, &app_req,
|
|
Daniel Wagner |
9b8299 |
@@ -961,18 +963,12 @@ qla_edif_app_getstats(scsi_qla_host_t *v
|
|
Daniel Wagner |
9b8299 |
size = sizeof(struct app_stats_reply) +
|
|
Daniel Wagner |
9b8299 |
(sizeof(struct app_sinfo) * app_req.num_ports);
|
|
Daniel Wagner |
9b8299 |
|
|
Daniel Wagner |
9b8299 |
- if (size > bsg_job->reply_payload.payload_len)
|
|
Daniel Wagner |
9b8299 |
- ret_size = bsg_job->reply_payload.payload_len;
|
|
Daniel Wagner |
9b8299 |
- else
|
|
Daniel Wagner |
9b8299 |
- ret_size = size;
|
|
Daniel Wagner |
9b8299 |
-
|
|
Daniel Wagner |
9b8299 |
app_reply = kzalloc(size, GFP_KERNEL);
|
|
Daniel Wagner |
9b8299 |
if (!app_reply) {
|
|
Daniel Wagner |
9b8299 |
SET_DID_STATUS(bsg_reply->result, DID_ERROR);
|
|
Daniel Wagner |
9b8299 |
rval = -1;
|
|
Daniel Wagner |
9b8299 |
} else {
|
|
Daniel Wagner |
9b8299 |
struct fc_port *fcport = NULL, *tf;
|
|
Daniel Wagner |
9b8299 |
- uint32_t pcnt = 0;
|
|
Daniel Wagner |
9b8299 |
|
|
Daniel Wagner |
9b8299 |
list_for_each_entry_safe(fcport, tf, &vha->vp_fcports, list) {
|
|
Daniel Wagner |
9b8299 |
if (fcport->edif.enable) {
|
|
Daniel Wagner |
9b8299 |
@@ -996,9 +992,11 @@ qla_edif_app_getstats(scsi_qla_host_t *v
|
|
Daniel Wagner |
9b8299 |
SET_DID_STATUS(bsg_reply->result, DID_OK);
|
|
Daniel Wagner |
9b8299 |
}
|
|
Daniel Wagner |
9b8299 |
|
|
Daniel Wagner |
9b8299 |
+ bsg_job->reply_len = sizeof(struct fc_bsg_reply);
|
|
Daniel Wagner |
9b8299 |
bsg_reply->reply_payload_rcv_len =
|
|
Daniel Wagner |
9b8299 |
sg_copy_from_buffer(bsg_job->reply_payload.sg_list,
|
|
Daniel Wagner |
9b8299 |
- bsg_job->reply_payload.sg_cnt, app_reply, ret_size);
|
|
Daniel Wagner |
9b8299 |
+ bsg_job->reply_payload.sg_cnt, app_reply,
|
|
Daniel Wagner |
9b8299 |
+ sizeof(struct app_stats_reply) + (sizeof(struct app_sinfo) * pcnt));
|
|
Daniel Wagner |
9b8299 |
|
|
Daniel Wagner |
9b8299 |
kfree(app_reply);
|
|
Daniel Wagner |
9b8299 |
|
|
Daniel Wagner |
9b8299 |
@@ -1072,8 +1070,7 @@ qla_edif_app_mgmt(struct bsg_job *bsg_jo
|
|
Daniel Wagner |
9b8299 |
__func__,
|
|
Daniel Wagner |
9b8299 |
bsg_request->rqst_data.h_vendor.vendor_cmd[1]);
|
|
Daniel Wagner |
9b8299 |
rval = EXT_STATUS_INVALID_PARAM;
|
|
Daniel Wagner |
9b8299 |
- bsg_job->reply_len = sizeof(struct fc_bsg_reply);
|
|
Daniel Wagner |
9b8299 |
- SET_DID_STATUS(bsg_reply->result, DID_ERROR);
|
|
Daniel Wagner |
9b8299 |
+ done = false;
|
|
Daniel Wagner |
9b8299 |
break;
|
|
Daniel Wagner |
9b8299 |
}
|
|
Daniel Wagner |
9b8299 |
|