[SCSI] qla2xxx: Properly set result field of bsg_job reply structure for success...
authorArmen Baloyan <armen.baloyan@qlogic.com>
Wed, 21 Nov 2012 07:39:53 +0000 (02:39 -0500)
committerJames Bottomley <JBottomley@Parallels.com>
Fri, 30 Nov 2012 09:34:44 +0000 (09:34 +0000)
FC transport on receiving bsg_job submission failure, calls bsg_job->job_done()
and sets the bsg_job->reply->result the returned value. In contrast, when the
success code (0) is returned fc transport doesn't call bsg_job->job_done() and
doesn't populate bsg_job->reply->result.

Signed-off-by: Steve Hodgson <steve@purestorage.com>
Signed-off-by: Armen Baloyan <armen.baloyan@qlogic.com>
Signed-off-by: Saurav Kashyap <saurav.kashyap@qlogic.com>
Cc: <stable@vger.kernel.org> #3.7
Signed-off-by: James Bottomley <JBottomley@Parallels.com>
drivers/scsi/qla2xxx/qla_bsg.c

index 2f9bddd3c616d810303b39dc6f7cb5f22af14828..05520be511b6a7a94508c6e4e61ee12213bd738e 100644 (file)
@@ -219,7 +219,8 @@ qla24xx_proc_fcp_prio_cfg_cmd(struct fc_bsg_job *bsg_job)
                break;
        }
 exit_fcp_prio_cfg:
-       bsg_job->job_done(bsg_job);
+       if (!ret)
+               bsg_job->job_done(bsg_job);
        return ret;
 }
 
@@ -741,7 +742,6 @@ qla2x00_process_loopback(struct fc_bsg_job *bsg_job)
                        if (qla81xx_get_port_config(vha, config)) {
                                ql_log(ql_log_warn, vha, 0x701f,
                                    "Get port config failed.\n");
-                               bsg_job->reply->result = (DID_ERROR << 16);
                                rval = -EPERM;
                                goto done_free_dma_req;
                        }
@@ -761,7 +761,6 @@ qla2x00_process_loopback(struct fc_bsg_job *bsg_job)
                                    new_config, elreq.options);
 
                        if (rval) {
-                               bsg_job->reply->result = (DID_ERROR << 16);
                                rval = -EPERM;
                                goto done_free_dma_req;
                        }
@@ -795,7 +794,6 @@ qla2x00_process_loopback(struct fc_bsg_job *bsg_job)
                                            "MPI reset failed.\n");
                                }
 
-                               bsg_job->reply->result = (DID_ERROR << 16);
                                rval = -EIO;
                                goto done_free_dma_req;
                        }
@@ -812,33 +810,25 @@ qla2x00_process_loopback(struct fc_bsg_job *bsg_job)
                ql_log(ql_log_warn, vha, 0x702c,
                    "Vendor request %s failed.\n", type);
 
-               fw_sts_ptr = ((uint8_t *)bsg_job->req->sense) +
-                   sizeof(struct fc_bsg_reply);
-
-               memcpy(fw_sts_ptr, response, sizeof(response));
-               fw_sts_ptr += sizeof(response);
-               *fw_sts_ptr = command_sent;
                rval = 0;
                bsg_job->reply->result = (DID_ERROR << 16);
+               bsg_job->reply->reply_payload_rcv_len = 0;
        } else {
                ql_dbg(ql_dbg_user, vha, 0x702d,
                    "Vendor request %s completed.\n", type);
-
-               bsg_job->reply_len = sizeof(struct fc_bsg_reply) +
-                       sizeof(response) + sizeof(uint8_t);
-               bsg_job->reply->reply_payload_rcv_len =
-                       bsg_job->reply_payload.payload_len;
-               fw_sts_ptr = ((uint8_t *)bsg_job->req->sense) +
-                       sizeof(struct fc_bsg_reply);
-               memcpy(fw_sts_ptr, response, sizeof(response));
-               fw_sts_ptr += sizeof(response);
-               *fw_sts_ptr = command_sent;
-               bsg_job->reply->result = DID_OK;
+               bsg_job->reply->result = (DID_OK << 16);
                sg_copy_from_buffer(bsg_job->reply_payload.sg_list,
                        bsg_job->reply_payload.sg_cnt, rsp_data,
                        rsp_data_len);
        }
-       bsg_job->job_done(bsg_job);
+
+       bsg_job->reply_len = sizeof(struct fc_bsg_reply) +
+           sizeof(response) + sizeof(uint8_t);
+       fw_sts_ptr = ((uint8_t *)bsg_job->req->sense) +
+           sizeof(struct fc_bsg_reply);
+       memcpy(fw_sts_ptr, response, sizeof(response));
+       fw_sts_ptr += sizeof(response);
+       *fw_sts_ptr = command_sent;
 
        dma_free_coherent(&ha->pdev->dev, rsp_data_len,
                rsp_data, rsp_data_dma);
@@ -853,6 +843,8 @@ done_unmap_req_sg:
        dma_unmap_sg(&ha->pdev->dev,
            bsg_job->request_payload.sg_list,
            bsg_job->request_payload.sg_cnt, DMA_TO_DEVICE);
+       if (!rval)
+               bsg_job->job_done(bsg_job);
        return rval;
 }
 
@@ -877,16 +869,15 @@ qla84xx_reset(struct fc_bsg_job *bsg_job)
        if (rval) {
                ql_log(ql_log_warn, vha, 0x7030,
                    "Vendor request 84xx reset failed.\n");
-               rval = 0;
-               bsg_job->reply->result = (DID_ERROR << 16);
+               rval = (DID_ERROR << 16);
 
        } else {
                ql_dbg(ql_dbg_user, vha, 0x7031,
                    "Vendor request 84xx reset completed.\n");
                bsg_job->reply->result = DID_OK;
+               bsg_job->job_done(bsg_job);
        }
 
-       bsg_job->job_done(bsg_job);
        return rval;
 }
 
@@ -976,8 +967,7 @@ qla84xx_updatefw(struct fc_bsg_job *bsg_job)
                ql_log(ql_log_warn, vha, 0x7037,
                    "Vendor request 84xx updatefw failed.\n");
 
-               rval = 0;
-               bsg_job->reply->result = (DID_ERROR << 16);
+               rval = (DID_ERROR << 16);
        } else {
                ql_dbg(ql_dbg_user, vha, 0x7038,
                    "Vendor request 84xx updatefw completed.\n");
@@ -986,7 +976,6 @@ qla84xx_updatefw(struct fc_bsg_job *bsg_job)
                bsg_job->reply->result = DID_OK;
        }
 
-       bsg_job->job_done(bsg_job);
        dma_pool_free(ha->s_dma_pool, mn, mn_dma);
 
 done_free_fw_buf:
@@ -996,6 +985,8 @@ done_unmap_sg:
        dma_unmap_sg(&ha->pdev->dev, bsg_job->request_payload.sg_list,
                bsg_job->request_payload.sg_cnt, DMA_TO_DEVICE);
 
+       if (!rval)
+               bsg_job->job_done(bsg_job);
        return rval;
 }
 
@@ -1163,8 +1154,7 @@ qla84xx_mgmt_cmd(struct fc_bsg_job *bsg_job)
                ql_log(ql_log_warn, vha, 0x7043,
                    "Vendor request 84xx mgmt failed.\n");
 
-               rval = 0;
-               bsg_job->reply->result = (DID_ERROR << 16);
+               rval = (DID_ERROR << 16);
 
        } else {
                ql_dbg(ql_dbg_user, vha, 0x7044,
@@ -1184,8 +1174,6 @@ qla84xx_mgmt_cmd(struct fc_bsg_job *bsg_job)
                }
        }
 
-       bsg_job->job_done(bsg_job);
-
 done_unmap_sg:
        if (mgmt_b)
                dma_free_coherent(&ha->pdev->dev, data_len, mgmt_b, mgmt_dma);
@@ -1200,6 +1188,8 @@ done_unmap_sg:
 exit_mgmt:
        dma_pool_free(ha->s_dma_pool, mn, mn_dma);
 
+       if (!rval)
+               bsg_job->job_done(bsg_job);
        return rval;
 }
 
@@ -1276,9 +1266,7 @@ qla24xx_iidma(struct fc_bsg_job *bsg_job)
                    fcport->port_name[3], fcport->port_name[4],
                    fcport->port_name[5], fcport->port_name[6],
                    fcport->port_name[7], rval, fcport->fp_speed, mb[0], mb[1]);
-               rval = 0;
-               bsg_job->reply->result = (DID_ERROR << 16);
-
+               rval = (DID_ERROR << 16);
        } else {
                if (!port_param->mode) {
                        bsg_job->reply_len = sizeof(struct fc_bsg_reply) +
@@ -1292,9 +1280,9 @@ qla24xx_iidma(struct fc_bsg_job *bsg_job)
                }
 
                bsg_job->reply->result = DID_OK;
+               bsg_job->job_done(bsg_job);
        }
 
-       bsg_job->job_done(bsg_job);
        return rval;
 }
 
@@ -1887,8 +1875,6 @@ qla2x00_process_vendor_specific(struct fc_bsg_job *bsg_job)
                return qla24xx_process_bidir_cmd(bsg_job);
 
        default:
-               bsg_job->reply->result = (DID_ERROR << 16);
-               bsg_job->job_done(bsg_job);
                return -ENOSYS;
        }
 }
@@ -1919,8 +1905,6 @@ qla24xx_bsg_request(struct fc_bsg_job *bsg_job)
                ql_dbg(ql_dbg_user, vha, 0x709f,
                    "BSG: ISP abort active/needed -- cmd=%d.\n",
                    bsg_job->request->msgcode);
-               bsg_job->reply->result = (DID_ERROR << 16);
-               bsg_job->job_done(bsg_job);
                return -EBUSY;
        }
 
@@ -1943,7 +1927,6 @@ qla24xx_bsg_request(struct fc_bsg_job *bsg_job)
        case FC_BSG_RPT_CT:
        default:
                ql_log(ql_log_warn, vha, 0x705a, "Unsupported BSG request.\n");
-               bsg_job->reply->result = ret;
                break;
        }
        return ret;