[SCSI] qla2xxx: Correct NULL pointer bug in cpu affinity mode.
authorAnirban Chakraborty <anirban.chakraborty@qlogic.com>
Wed, 3 Jun 2009 16:55:19 +0000 (09:55 -0700)
committerJames Bottomley <James.Bottomley@HansenPartnership.com>
Mon, 8 Jun 2009 19:46:44 +0000 (14:46 -0500)
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>
drivers/scsi/qla2xxx/qla_attr.c
drivers/scsi/qla2xxx/qla_iocb.c

index 2bd017ffb084472c4d73bd06f6acf705b4a96055..74e69703ef989c0e887a10061b2aa8a74e9cc08b 100644 (file)
@@ -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,14 +1651,16 @@ 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++) {
                if (memcmp(ha->npiv_info[cnt].port_name, vha->port_name, 8) == 0
                        && memcmp(ha->npiv_info[cnt].node_name, vha->node_name,
-                       8) == 0) {
+                                       8) == 0) {
                        qos = ha->npiv_info[cnt].q_qos;
                        break;
                }
@@ -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:
index b4c6010ee5fa443b65ce9e37b395495a36fd6eb0..13396beae2cedcde63b00c6156b44696168e6cc0 100644 (file)
@@ -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];
-       }
 }