Commit 59e0b8b0 authored by Anirban Chakraborty's avatar Anirban Chakraborty Committed by James Bottomley

[SCSI] qla2xxx: Correct NULL pointer bug in cpu affinity mode.

This patch fixes a NULL pointer bug that occurs when IO is being
carried out on a vport for which the cpu affinity mode is turned on.
Signed-off-by: default avatarAnirban Chakraborty <anirban.chakraborty@qlogic.com>
Signed-off-by: default avatarJames Bottomley <James.Bottomley@HansenPartnership.com>
parent 94b3aa47
...@@ -1595,6 +1595,7 @@ qla24xx_vport_create(struct fc_vport *fc_vport, bool disable) ...@@ -1595,6 +1595,7 @@ qla24xx_vport_create(struct fc_vport *fc_vport, bool disable)
struct qla_hw_data *ha = base_vha->hw; struct qla_hw_data *ha = base_vha->hw;
uint16_t options = 0; uint16_t options = 0;
int cnt; int cnt;
struct req_que *req = ha->req_q_map[0];
ret = qla24xx_vport_create_req_sanity_check(fc_vport); ret = qla24xx_vport_create_req_sanity_check(fc_vport);
if (ret) { if (ret) {
...@@ -1650,14 +1651,16 @@ qla24xx_vport_create(struct fc_vport *fc_vport, bool disable) ...@@ -1650,14 +1651,16 @@ qla24xx_vport_create(struct fc_vport *fc_vport, bool disable)
qla24xx_vport_disable(fc_vport, disable); qla24xx_vport_disable(fc_vport, disable);
ret = 0; if (ql2xmultique_tag) {
if (ql2xmaxqueues == 1 || ql2xmultique_tag || !ha->npiv_info) req = ha->req_q_map[1];
goto vport_queue;
} else if (ql2xmaxqueues == 1 || !ha->npiv_info)
goto vport_queue; goto vport_queue;
/* Create a request queue in QoS mode for the vport */ /* Create a request queue in QoS mode for the vport */
for (cnt = 0; cnt < ha->nvram_npiv_size; cnt++) { for (cnt = 0; cnt < ha->nvram_npiv_size; cnt++) {
if (memcmp(ha->npiv_info[cnt].port_name, vha->port_name, 8) == 0 if (memcmp(ha->npiv_info[cnt].port_name, vha->port_name, 8) == 0
&& memcmp(ha->npiv_info[cnt].node_name, vha->node_name, && memcmp(ha->npiv_info[cnt].node_name, vha->node_name,
8) == 0) { 8) == 0) {
qos = ha->npiv_info[cnt].q_qos; qos = ha->npiv_info[cnt].q_qos;
break; break;
} }
...@@ -1669,14 +1672,16 @@ qla24xx_vport_create(struct fc_vport *fc_vport, bool disable) ...@@ -1669,14 +1672,16 @@ qla24xx_vport_create(struct fc_vport *fc_vport, bool disable)
qla_printk(KERN_WARNING, ha, qla_printk(KERN_WARNING, ha,
"Can't create request queue for vp_idx:%d\n", "Can't create request queue for vp_idx:%d\n",
vha->vp_idx); vha->vp_idx);
else else {
DEBUG2(qla_printk(KERN_INFO, ha, DEBUG2(qla_printk(KERN_INFO, ha,
"Request Que:%d (QoS: %d) created for vp_idx:%d\n", "Request Que:%d (QoS: %d) created for vp_idx:%d\n",
ret, qos, vha->vp_idx)); ret, qos, vha->vp_idx));
req = ha->req_q_map[ret];
}
} }
vport_queue: vport_queue:
vha->req = ha->req_q_map[ret]; vha->req = req;
return 0; return 0;
vport_create_failed_2: vport_create_failed_2:
......
...@@ -15,7 +15,7 @@ static request_t *qla2x00_req_pkt(struct scsi_qla_host *, struct req_que *, ...@@ -15,7 +15,7 @@ static request_t *qla2x00_req_pkt(struct scsi_qla_host *, struct req_que *,
struct rsp_que *rsp); struct rsp_que *rsp);
static void qla2x00_isp_cmd(struct scsi_qla_host *, struct req_que *); static void qla2x00_isp_cmd(struct scsi_qla_host *, struct req_que *);
static void qla25xx_set_que(srb_t *, struct req_que **, struct rsp_que **); static void qla25xx_set_que(srb_t *, struct rsp_que **);
/** /**
* qla2x00_get_cmd_direction() - Determine control_flag data direction. * qla2x00_get_cmd_direction() - Determine control_flag data direction.
* @cmd: SCSI command * @cmd: SCSI command
...@@ -722,7 +722,8 @@ qla24xx_start_scsi(srb_t *sp) ...@@ -722,7 +722,8 @@ qla24xx_start_scsi(srb_t *sp)
/* Setup device pointers. */ /* Setup device pointers. */
ret = 0; ret = 0;
qla25xx_set_que(sp, &req, &rsp); qla25xx_set_que(sp, &rsp);
req = vha->req;
/* So we know we haven't pci_map'ed anything yet */ /* So we know we haven't pci_map'ed anything yet */
tot_dsds = 0; tot_dsds = 0;
...@@ -845,20 +846,15 @@ qla24xx_start_scsi(srb_t *sp) ...@@ -845,20 +846,15 @@ qla24xx_start_scsi(srb_t *sp)
return QLA_FUNCTION_FAILED; return QLA_FUNCTION_FAILED;
} }
static void qla25xx_set_que(srb_t *sp, struct req_que **req, static void qla25xx_set_que(srb_t *sp, struct rsp_que **rsp)
struct rsp_que **rsp)
{ {
struct scsi_cmnd *cmd = sp->cmd; struct scsi_cmnd *cmd = sp->cmd;
struct scsi_qla_host *vha = sp->fcport->vha;
struct qla_hw_data *ha = sp->fcport->vha->hw; struct qla_hw_data *ha = sp->fcport->vha->hw;
int affinity = cmd->request->cpu; int affinity = cmd->request->cpu;
if (ql2xmultique_tag && affinity >= 0 && if (ql2xmultique_tag && affinity >= 0 &&
affinity < ha->max_rsp_queues - 1) { affinity < ha->max_rsp_queues - 1)
*rsp = ha->rsp_q_map[affinity + 1]; *rsp = ha->rsp_q_map[affinity + 1];
*req = ha->req_q_map[1]; else
} else {
*req = vha->req;
*rsp = ha->rsp_q_map[0]; *rsp = ha->rsp_q_map[0];
}
} }
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment