diff options
| author | Armen Baloyan <armen.baloyan@qlogic.com> | 2012-11-21 02:39:53 -0500 |
|---|---|---|
| committer | James Bottomley <JBottomley@Parallels.com> | 2012-11-30 04:34:44 -0500 |
| commit | 63ea923a97cb0d78efcbbd229950e101588f0ddb (patch) | |
| tree | 604d6893f8a91b7ff228f2d56d6d2c8a9a6b5025 /drivers/scsi | |
| parent | 691e3d3175daff73d9b1771bf79ab032fdcec5a5 (diff) | |
[SCSI] qla2xxx: Properly set result field of bsg_job reply structure for success and failure.
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>
Diffstat (limited to 'drivers/scsi')
| -rw-r--r-- | drivers/scsi/qla2xxx/qla_bsg.c | 65 |
1 files changed, 24 insertions, 41 deletions
diff --git a/drivers/scsi/qla2xxx/qla_bsg.c b/drivers/scsi/qla2xxx/qla_bsg.c index 2f9bddd3c616..05520be511b6 100644 --- a/drivers/scsi/qla2xxx/qla_bsg.c +++ b/drivers/scsi/qla2xxx/qla_bsg.c | |||
| @@ -219,7 +219,8 @@ qla24xx_proc_fcp_prio_cfg_cmd(struct fc_bsg_job *bsg_job) | |||
| 219 | break; | 219 | break; |
| 220 | } | 220 | } |
| 221 | exit_fcp_prio_cfg: | 221 | exit_fcp_prio_cfg: |
| 222 | bsg_job->job_done(bsg_job); | 222 | if (!ret) |
| 223 | bsg_job->job_done(bsg_job); | ||
| 223 | return ret; | 224 | return ret; |
| 224 | } | 225 | } |
| 225 | 226 | ||
| @@ -741,7 +742,6 @@ qla2x00_process_loopback(struct fc_bsg_job *bsg_job) | |||
| 741 | if (qla81xx_get_port_config(vha, config)) { | 742 | if (qla81xx_get_port_config(vha, config)) { |
| 742 | ql_log(ql_log_warn, vha, 0x701f, | 743 | ql_log(ql_log_warn, vha, 0x701f, |
| 743 | "Get port config failed.\n"); | 744 | "Get port config failed.\n"); |
| 744 | bsg_job->reply->result = (DID_ERROR << 16); | ||
| 745 | rval = -EPERM; | 745 | rval = -EPERM; |
| 746 | goto done_free_dma_req; | 746 | goto done_free_dma_req; |
| 747 | } | 747 | } |
| @@ -761,7 +761,6 @@ qla2x00_process_loopback(struct fc_bsg_job *bsg_job) | |||
| 761 | new_config, elreq.options); | 761 | new_config, elreq.options); |
| 762 | 762 | ||
| 763 | if (rval) { | 763 | if (rval) { |
| 764 | bsg_job->reply->result = (DID_ERROR << 16); | ||
| 765 | rval = -EPERM; | 764 | rval = -EPERM; |
| 766 | goto done_free_dma_req; | 765 | goto done_free_dma_req; |
| 767 | } | 766 | } |
| @@ -795,7 +794,6 @@ qla2x00_process_loopback(struct fc_bsg_job *bsg_job) | |||
| 795 | "MPI reset failed.\n"); | 794 | "MPI reset failed.\n"); |
| 796 | } | 795 | } |
| 797 | 796 | ||
| 798 | bsg_job->reply->result = (DID_ERROR << 16); | ||
| 799 | rval = -EIO; | 797 | rval = -EIO; |
| 800 | goto done_free_dma_req; | 798 | goto done_free_dma_req; |
| 801 | } | 799 | } |
| @@ -812,33 +810,25 @@ qla2x00_process_loopback(struct fc_bsg_job *bsg_job) | |||
| 812 | ql_log(ql_log_warn, vha, 0x702c, | 810 | ql_log(ql_log_warn, vha, 0x702c, |
| 813 | "Vendor request %s failed.\n", type); | 811 | "Vendor request %s failed.\n", type); |
| 814 | 812 | ||
| 815 | fw_sts_ptr = ((uint8_t *)bsg_job->req->sense) + | ||
| 816 | sizeof(struct fc_bsg_reply); | ||
| 817 | |||
| 818 | memcpy(fw_sts_ptr, response, sizeof(response)); | ||
| 819 | fw_sts_ptr += sizeof(response); | ||
| 820 | *fw_sts_ptr = command_sent; | ||
| 821 | rval = 0; | 813 | rval = 0; |
| 822 | bsg_job->reply->result = (DID_ERROR << 16); | 814 | bsg_job->reply->result = (DID_ERROR << 16); |
| 815 | bsg_job->reply->reply_payload_rcv_len = 0; | ||
| 823 | } else { | 816 | } else { |
| 824 | ql_dbg(ql_dbg_user, vha, 0x702d, | 817 | ql_dbg(ql_dbg_user, vha, 0x702d, |
| 825 | "Vendor request %s completed.\n", type); | 818 | "Vendor request %s completed.\n", type); |
| 826 | 819 | bsg_job->reply->result = (DID_OK << 16); | |
| 827 | bsg_job->reply_len = sizeof(struct fc_bsg_reply) + | ||
| 828 | sizeof(response) + sizeof(uint8_t); | ||
| 829 | bsg_job->reply->reply_payload_rcv_len = | ||
| 830 | bsg_job->reply_payload.payload_len; | ||
| 831 | fw_sts_ptr = ((uint8_t *)bsg_job->req->sense) + | ||
| 832 | sizeof(struct fc_bsg_reply); | ||
| 833 | memcpy(fw_sts_ptr, response, sizeof(response)); | ||
| 834 | fw_sts_ptr += sizeof(response); | ||
| 835 | *fw_sts_ptr = command_sent; | ||
| 836 | bsg_job->reply->result = DID_OK; | ||
| 837 | sg_copy_from_buffer(bsg_job->reply_payload.sg_list, | 820 | sg_copy_from_buffer(bsg_job->reply_payload.sg_list, |
| 838 | bsg_job->reply_payload.sg_cnt, rsp_data, | 821 | bsg_job->reply_payload.sg_cnt, rsp_data, |
| 839 | rsp_data_len); | 822 | rsp_data_len); |
| 840 | } | 823 | } |
| 841 | bsg_job->job_done(bsg_job); | 824 | |
| 825 | bsg_job->reply_len = sizeof(struct fc_bsg_reply) + | ||
| 826 | sizeof(response) + sizeof(uint8_t); | ||
| 827 | fw_sts_ptr = ((uint8_t *)bsg_job->req->sense) + | ||
| 828 | sizeof(struct fc_bsg_reply); | ||
| 829 | memcpy(fw_sts_ptr, response, sizeof(response)); | ||
| 830 | fw_sts_ptr += sizeof(response); | ||
| 831 | *fw_sts_ptr = command_sent; | ||
| 842 | 832 | ||
| 843 | dma_free_coherent(&ha->pdev->dev, rsp_data_len, | 833 | dma_free_coherent(&ha->pdev->dev, rsp_data_len, |
| 844 | rsp_data, rsp_data_dma); | 834 | rsp_data, rsp_data_dma); |
| @@ -853,6 +843,8 @@ done_unmap_req_sg: | |||
| 853 | dma_unmap_sg(&ha->pdev->dev, | 843 | dma_unmap_sg(&ha->pdev->dev, |
| 854 | bsg_job->request_payload.sg_list, | 844 | bsg_job->request_payload.sg_list, |
| 855 | bsg_job->request_payload.sg_cnt, DMA_TO_DEVICE); | 845 | bsg_job->request_payload.sg_cnt, DMA_TO_DEVICE); |
| 846 | if (!rval) | ||
| 847 | bsg_job->job_done(bsg_job); | ||
| 856 | return rval; | 848 | return rval; |
| 857 | } | 849 | } |
| 858 | 850 | ||
| @@ -877,16 +869,15 @@ qla84xx_reset(struct fc_bsg_job *bsg_job) | |||
| 877 | if (rval) { | 869 | if (rval) { |
| 878 | ql_log(ql_log_warn, vha, 0x7030, | 870 | ql_log(ql_log_warn, vha, 0x7030, |
| 879 | "Vendor request 84xx reset failed.\n"); | 871 | "Vendor request 84xx reset failed.\n"); |
| 880 | rval = 0; | 872 | rval = (DID_ERROR << 16); |
| 881 | bsg_job->reply->result = (DID_ERROR << 16); | ||
| 882 | 873 | ||
| 883 | } else { | 874 | } else { |
| 884 | ql_dbg(ql_dbg_user, vha, 0x7031, | 875 | ql_dbg(ql_dbg_user, vha, 0x7031, |
| 885 | "Vendor request 84xx reset completed.\n"); | 876 | "Vendor request 84xx reset completed.\n"); |
| 886 | bsg_job->reply->result = DID_OK; | 877 | bsg_job->reply->result = DID_OK; |
| 878 | bsg_job->job_done(bsg_job); | ||
| 887 | } | 879 | } |
| 888 | 880 | ||
| 889 | bsg_job->job_done(bsg_job); | ||
| 890 | return rval; | 881 | return rval; |
| 891 | } | 882 | } |
| 892 | 883 | ||
| @@ -976,8 +967,7 @@ qla84xx_updatefw(struct fc_bsg_job *bsg_job) | |||
| 976 | ql_log(ql_log_warn, vha, 0x7037, | 967 | ql_log(ql_log_warn, vha, 0x7037, |
| 977 | "Vendor request 84xx updatefw failed.\n"); | 968 | "Vendor request 84xx updatefw failed.\n"); |
| 978 | 969 | ||
| 979 | rval = 0; | 970 | rval = (DID_ERROR << 16); |
| 980 | bsg_job->reply->result = (DID_ERROR << 16); | ||
| 981 | } else { | 971 | } else { |
| 982 | ql_dbg(ql_dbg_user, vha, 0x7038, | 972 | ql_dbg(ql_dbg_user, vha, 0x7038, |
| 983 | "Vendor request 84xx updatefw completed.\n"); | 973 | "Vendor request 84xx updatefw completed.\n"); |
| @@ -986,7 +976,6 @@ qla84xx_updatefw(struct fc_bsg_job *bsg_job) | |||
| 986 | bsg_job->reply->result = DID_OK; | 976 | bsg_job->reply->result = DID_OK; |
| 987 | } | 977 | } |
| 988 | 978 | ||
| 989 | bsg_job->job_done(bsg_job); | ||
| 990 | dma_pool_free(ha->s_dma_pool, mn, mn_dma); | 979 | dma_pool_free(ha->s_dma_pool, mn, mn_dma); |
| 991 | 980 | ||
| 992 | done_free_fw_buf: | 981 | done_free_fw_buf: |
| @@ -996,6 +985,8 @@ done_unmap_sg: | |||
| 996 | dma_unmap_sg(&ha->pdev->dev, bsg_job->request_payload.sg_list, | 985 | dma_unmap_sg(&ha->pdev->dev, bsg_job->request_payload.sg_list, |
| 997 | bsg_job->request_payload.sg_cnt, DMA_TO_DEVICE); | 986 | bsg_job->request_payload.sg_cnt, DMA_TO_DEVICE); |
| 998 | 987 | ||
| 988 | if (!rval) | ||
| 989 | bsg_job->job_done(bsg_job); | ||
| 999 | return rval; | 990 | return rval; |
| 1000 | } | 991 | } |
| 1001 | 992 | ||
| @@ -1163,8 +1154,7 @@ qla84xx_mgmt_cmd(struct fc_bsg_job *bsg_job) | |||
| 1163 | ql_log(ql_log_warn, vha, 0x7043, | 1154 | ql_log(ql_log_warn, vha, 0x7043, |
| 1164 | "Vendor request 84xx mgmt failed.\n"); | 1155 | "Vendor request 84xx mgmt failed.\n"); |
| 1165 | 1156 | ||
| 1166 | rval = 0; | 1157 | rval = (DID_ERROR << 16); |
| 1167 | bsg_job->reply->result = (DID_ERROR << 16); | ||
| 1168 | 1158 | ||
| 1169 | } else { | 1159 | } else { |
| 1170 | ql_dbg(ql_dbg_user, vha, 0x7044, | 1160 | ql_dbg(ql_dbg_user, vha, 0x7044, |
| @@ -1184,8 +1174,6 @@ qla84xx_mgmt_cmd(struct fc_bsg_job *bsg_job) | |||
| 1184 | } | 1174 | } |
| 1185 | } | 1175 | } |
| 1186 | 1176 | ||
| 1187 | bsg_job->job_done(bsg_job); | ||
| 1188 | |||
| 1189 | done_unmap_sg: | 1177 | done_unmap_sg: |
| 1190 | if (mgmt_b) | 1178 | if (mgmt_b) |
| 1191 | dma_free_coherent(&ha->pdev->dev, data_len, mgmt_b, mgmt_dma); | 1179 | dma_free_coherent(&ha->pdev->dev, data_len, mgmt_b, mgmt_dma); |
| @@ -1200,6 +1188,8 @@ done_unmap_sg: | |||
| 1200 | exit_mgmt: | 1188 | exit_mgmt: |
| 1201 | dma_pool_free(ha->s_dma_pool, mn, mn_dma); | 1189 | dma_pool_free(ha->s_dma_pool, mn, mn_dma); |
| 1202 | 1190 | ||
| 1191 | if (!rval) | ||
| 1192 | bsg_job->job_done(bsg_job); | ||
| 1203 | return rval; | 1193 | return rval; |
| 1204 | } | 1194 | } |
| 1205 | 1195 | ||
| @@ -1276,9 +1266,7 @@ qla24xx_iidma(struct fc_bsg_job *bsg_job) | |||
| 1276 | fcport->port_name[3], fcport->port_name[4], | 1266 | fcport->port_name[3], fcport->port_name[4], |
| 1277 | fcport->port_name[5], fcport->port_name[6], | 1267 | fcport->port_name[5], fcport->port_name[6], |
| 1278 | fcport->port_name[7], rval, fcport->fp_speed, mb[0], mb[1]); | 1268 | fcport->port_name[7], rval, fcport->fp_speed, mb[0], mb[1]); |
| 1279 | rval = 0; | 1269 | rval = (DID_ERROR << 16); |
| 1280 | bsg_job->reply->result = (DID_ERROR << 16); | ||
| 1281 | |||
| 1282 | } else { | 1270 | } else { |
| 1283 | if (!port_param->mode) { | 1271 | if (!port_param->mode) { |
| 1284 | bsg_job->reply_len = sizeof(struct fc_bsg_reply) + | 1272 | bsg_job->reply_len = sizeof(struct fc_bsg_reply) + |
| @@ -1292,9 +1280,9 @@ qla24xx_iidma(struct fc_bsg_job *bsg_job) | |||
| 1292 | } | 1280 | } |
| 1293 | 1281 | ||
| 1294 | bsg_job->reply->result = DID_OK; | 1282 | bsg_job->reply->result = DID_OK; |
| 1283 | bsg_job->job_done(bsg_job); | ||
| 1295 | } | 1284 | } |
| 1296 | 1285 | ||
| 1297 | bsg_job->job_done(bsg_job); | ||
| 1298 | return rval; | 1286 | return rval; |
| 1299 | } | 1287 | } |
| 1300 | 1288 | ||
| @@ -1887,8 +1875,6 @@ qla2x00_process_vendor_specific(struct fc_bsg_job *bsg_job) | |||
| 1887 | return qla24xx_process_bidir_cmd(bsg_job); | 1875 | return qla24xx_process_bidir_cmd(bsg_job); |
| 1888 | 1876 | ||
| 1889 | default: | 1877 | default: |
| 1890 | bsg_job->reply->result = (DID_ERROR << 16); | ||
| 1891 | bsg_job->job_done(bsg_job); | ||
| 1892 | return -ENOSYS; | 1878 | return -ENOSYS; |
| 1893 | } | 1879 | } |
| 1894 | } | 1880 | } |
| @@ -1919,8 +1905,6 @@ qla24xx_bsg_request(struct fc_bsg_job *bsg_job) | |||
| 1919 | ql_dbg(ql_dbg_user, vha, 0x709f, | 1905 | ql_dbg(ql_dbg_user, vha, 0x709f, |
| 1920 | "BSG: ISP abort active/needed -- cmd=%d.\n", | 1906 | "BSG: ISP abort active/needed -- cmd=%d.\n", |
| 1921 | bsg_job->request->msgcode); | 1907 | bsg_job->request->msgcode); |
| 1922 | bsg_job->reply->result = (DID_ERROR << 16); | ||
| 1923 | bsg_job->job_done(bsg_job); | ||
| 1924 | return -EBUSY; | 1908 | return -EBUSY; |
| 1925 | } | 1909 | } |
| 1926 | 1910 | ||
| @@ -1943,7 +1927,6 @@ qla24xx_bsg_request(struct fc_bsg_job *bsg_job) | |||
| 1943 | case FC_BSG_RPT_CT: | 1927 | case FC_BSG_RPT_CT: |
| 1944 | default: | 1928 | default: |
| 1945 | ql_log(ql_log_warn, vha, 0x705a, "Unsupported BSG request.\n"); | 1929 | ql_log(ql_log_warn, vha, 0x705a, "Unsupported BSG request.\n"); |
| 1946 | bsg_job->reply->result = ret; | ||
| 1947 | break; | 1930 | break; |
| 1948 | } | 1931 | } |
| 1949 | return ret; | 1932 | return ret; |
