[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: Anirban Chakraborty <anirban.chakraborty@qlogic.com> Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com>
This commit is contained in:
Родитель
94b3aa47ac
Коммит
59e0b8b088
|
@ -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,8 +1651,10 @@ 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++) {
|
||||||
|
@ -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 *,
|
||||||
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)
|
||||||
/* 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 @@ queuing_error:
|
||||||
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];
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
Загрузка…
Ссылка в новой задаче