Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

[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
Loading
Loading
Loading
Loading
+10 −5
Original line number Diff line number Diff line
@@ -1595,6 +1595,7 @@ qla24xx_vport_create(struct fc_vport *fc_vport, bool disable)
	struct qla_hw_data *ha = base_vha->hw;
	uint16_t options = 0;
	int	cnt;
	struct req_que *req = ha->req_q_map[0];

	ret = qla24xx_vport_create_req_sanity_check(fc_vport);
	if (ret) {
@@ -1650,8 +1651,10 @@ qla24xx_vport_create(struct fc_vport *fc_vport, bool disable)

	qla24xx_vport_disable(fc_vport, disable);

	ret = 0;
	if (ql2xmaxqueues == 1 || ql2xmultique_tag || !ha->npiv_info)
	if (ql2xmultique_tag) {
		req = ha->req_q_map[1];
		goto vport_queue;
	} else if (ql2xmaxqueues == 1 || !ha->npiv_info)
		goto vport_queue;
	/* Create a request queue in QoS mode for the vport */
	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,
			"Can't create request queue for vp_idx:%d\n",
			vha->vp_idx);
		else
		else {
			DEBUG2(qla_printk(KERN_INFO, ha,
			"Request Que:%d (QoS: %d) created for vp_idx:%d\n",
			ret, qos, vha->vp_idx));
			req = ha->req_q_map[ret];
		}
	}

vport_queue:
	vha->req = ha->req_q_map[ret];
	vha->req = req;
	return 0;

vport_create_failed_2:
+6 −10
Original line number Diff line number Diff line
@@ -15,7 +15,7 @@ static request_t *qla2x00_req_pkt(struct scsi_qla_host *, struct req_que *,
							struct rsp_que *rsp);
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.
 * @cmd: SCSI command
@@ -722,7 +722,8 @@ qla24xx_start_scsi(srb_t *sp)
	/* Setup device pointers. */
	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 */
	tot_dsds = 0;
@@ -845,20 +846,15 @@ queuing_error:
	return QLA_FUNCTION_FAILED;
}

static void qla25xx_set_que(srb_t *sp, struct req_que **req,
	struct rsp_que **rsp)
static void qla25xx_set_que(srb_t *sp, struct rsp_que **rsp)
{
	struct scsi_cmnd *cmd = sp->cmd;
	struct scsi_qla_host *vha = sp->fcport->vha;
	struct qla_hw_data *ha = sp->fcport->vha->hw;
	int affinity = cmd->request->cpu;

	if (ql2xmultique_tag && affinity >= 0 &&
		affinity < ha->max_rsp_queues - 1) {
		affinity < ha->max_rsp_queues - 1)
		*rsp = ha->rsp_q_map[affinity + 1];
		*req = ha->req_q_map[1];
	} else {
		*req = vha->req;
	 else
		*rsp = ha->rsp_q_map[0];
}
}