Commit 1abaede7 authored by Johannes Thumshirn's avatar Johannes Thumshirn Committed by Martin K. Petersen

scsi: fc: Export fc_bsg_jobdone and use it in FC drivers

Export fc_bsg_jobdone so drivers can use it directly instead of doing
the round-trip via struct fc_bsg_job::job_done() and use it in the
LLDDs.  That way we can also unify the interfaces of fc_bsg_jobdone and
bsg_job_done.

As we've converted all LLDDs over to use fc_bsg_jobdone() directly, we
can remove the function pointer from struct fc_bsg_job as well.
Signed-off-by: default avatarJohannes Thumshirn <jthumshirn@suse.de>
Reviewed-by: default avatarHannes Reinecke <hare@suse.com>
Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
Acked-by: default avatarTyrel Datwyler <tyreld@linux.vnet.ibm.com>
Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
parent 01e0e15c
...@@ -892,7 +892,7 @@ static void zfcp_fc_ct_els_job_handler(void *data) ...@@ -892,7 +892,7 @@ static void zfcp_fc_ct_els_job_handler(void *data)
jr->reply_payload_rcv_len = job->reply_payload.payload_len; jr->reply_payload_rcv_len = job->reply_payload.payload_len;
jr->reply_data.ctels_reply.status = FC_CTELS_STATUS_OK; jr->reply_data.ctels_reply.status = FC_CTELS_STATUS_OK;
jr->result = zfcp_ct_els->status ? -EIO : 0; jr->result = zfcp_ct_els->status ? -EIO : 0;
job->job_done(job); fc_bsg_jobdone(job, jr->result, jr->reply_payload_rcv_len);
} }
static struct zfcp_fc_wka_port *zfcp_fc_job_wka_port(struct fc_bsg_job *job) static struct zfcp_fc_wka_port *zfcp_fc_job_wka_port(struct fc_bsg_job *job)
......
...@@ -3180,7 +3180,8 @@ bfad_im_bsg_vendor_request(struct fc_bsg_job *job) ...@@ -3180,7 +3180,8 @@ bfad_im_bsg_vendor_request(struct fc_bsg_job *job)
bsg_reply->reply_payload_rcv_len = job->reply_payload.payload_len; bsg_reply->reply_payload_rcv_len = job->reply_payload.payload_len;
bsg_reply->result = rc; bsg_reply->result = rc;
job->job_done(job); fc_bsg_jobdone(job, bsg_reply->result,
bsg_reply->reply_payload_rcv_len);
return rc; return rc;
error: error:
/* free the command buffer */ /* free the command buffer */
...@@ -3556,7 +3557,8 @@ bfad_im_bsg_els_ct_request(struct fc_bsg_job *job) ...@@ -3556,7 +3557,8 @@ bfad_im_bsg_els_ct_request(struct fc_bsg_job *job)
bsg_reply->result = rc; bsg_reply->result = rc;
if (rc == BFA_STATUS_OK) if (rc == BFA_STATUS_OK)
job->job_done(job); fc_bsg_jobdone(job, bsg_reply->result,
bsg_reply->reply_payload_rcv_len);
return rc; return rc;
} }
......
...@@ -1945,7 +1945,8 @@ static int ibmvfc_bsg_request(struct fc_bsg_job *job) ...@@ -1945,7 +1945,8 @@ static int ibmvfc_bsg_request(struct fc_bsg_job *job)
ibmvfc_free_event(evt); ibmvfc_free_event(evt);
spin_unlock_irqrestore(vhost->host->host_lock, flags); spin_unlock_irqrestore(vhost->host->host_lock, flags);
bsg_reply->result = rc; bsg_reply->result = rc;
job->job_done(job); fc_bsg_jobdone(job, bsg_reply->result,
bsg_reply->reply_payload_rcv_len);
rc = 0; rc = 0;
out: out:
dma_unmap_sg(vhost->dev, job->request_payload.sg_list, dma_unmap_sg(vhost->dev, job->request_payload.sg_list,
......
...@@ -1913,7 +1913,8 @@ static void fc_lport_bsg_resp(struct fc_seq *sp, struct fc_frame *fp, ...@@ -1913,7 +1913,8 @@ static void fc_lport_bsg_resp(struct fc_seq *sp, struct fc_frame *fp,
-ECONNABORTED : -ETIMEDOUT; -ECONNABORTED : -ETIMEDOUT;
job->reply_len = sizeof(uint32_t); job->reply_len = sizeof(uint32_t);
job->state_flags |= FC_RQST_STATE_DONE; job->state_flags |= FC_RQST_STATE_DONE;
job->job_done(job); fc_bsg_jobdone(job, bsg_reply->result,
bsg_reply->reply_payload_rcv_len);
kfree(info); kfree(info);
return; return;
} }
...@@ -1948,7 +1949,8 @@ static void fc_lport_bsg_resp(struct fc_seq *sp, struct fc_frame *fp, ...@@ -1948,7 +1949,8 @@ static void fc_lport_bsg_resp(struct fc_seq *sp, struct fc_frame *fp,
job->reply_payload.payload_len; job->reply_payload.payload_len;
bsg_reply->result = 0; bsg_reply->result = 0;
job->state_flags |= FC_RQST_STATE_DONE; job->state_flags |= FC_RQST_STATE_DONE;
job->job_done(job); fc_bsg_jobdone(job, bsg_reply->result,
bsg_reply->reply_payload_rcv_len);
kfree(info); kfree(info);
} }
fc_frame_free(fp); fc_frame_free(fp);
......
...@@ -371,7 +371,8 @@ lpfc_bsg_send_mgmt_cmd_cmp(struct lpfc_hba *phba, ...@@ -371,7 +371,8 @@ lpfc_bsg_send_mgmt_cmd_cmp(struct lpfc_hba *phba,
if (job) { if (job) {
bsg_reply->result = rc; bsg_reply->result = rc;
job->job_done(job); fc_bsg_jobdone(job, bsg_reply->result,
bsg_reply->reply_payload_rcv_len);
} }
return; return;
} }
...@@ -644,7 +645,8 @@ lpfc_bsg_rport_els_cmp(struct lpfc_hba *phba, ...@@ -644,7 +645,8 @@ lpfc_bsg_rport_els_cmp(struct lpfc_hba *phba,
if (job) { if (job) {
bsg_reply->result = rc; bsg_reply->result = rc;
job->job_done(job); fc_bsg_jobdone(job, bsg_reply->result,
bsg_reply->reply_payload_rcv_len);
} }
return; return;
} }
...@@ -1136,7 +1138,8 @@ lpfc_bsg_ct_unsol_event(struct lpfc_hba *phba, struct lpfc_sli_ring *pring, ...@@ -1136,7 +1138,8 @@ lpfc_bsg_ct_unsol_event(struct lpfc_hba *phba, struct lpfc_sli_ring *pring,
job->dd_data = NULL; job->dd_data = NULL;
/* complete the job back to userspace */ /* complete the job back to userspace */
spin_unlock_irqrestore(&phba->ct_ev_lock, flags); spin_unlock_irqrestore(&phba->ct_ev_lock, flags);
job->job_done(job); fc_bsg_jobdone(job, bsg_reply->result,
bsg_reply->reply_payload_rcv_len);
spin_lock_irqsave(&phba->ct_ev_lock, flags); spin_lock_irqsave(&phba->ct_ev_lock, flags);
} }
} }
...@@ -1361,7 +1364,8 @@ lpfc_bsg_hba_get_event(struct fc_bsg_job *job) ...@@ -1361,7 +1364,8 @@ lpfc_bsg_hba_get_event(struct fc_bsg_job *job)
spin_unlock_irqrestore(&phba->ct_ev_lock, flags); spin_unlock_irqrestore(&phba->ct_ev_lock, flags);
job->dd_data = NULL; job->dd_data = NULL;
bsg_reply->result = 0; bsg_reply->result = 0;
job->job_done(job); fc_bsg_jobdone(job, bsg_reply->result,
bsg_reply->reply_payload_rcv_len);
return 0; return 0;
job_error: job_error:
...@@ -1458,7 +1462,8 @@ lpfc_issue_ct_rsp_cmp(struct lpfc_hba *phba, ...@@ -1458,7 +1462,8 @@ lpfc_issue_ct_rsp_cmp(struct lpfc_hba *phba,
if (job) { if (job) {
bsg_reply->result = rc; bsg_reply->result = rc;
job->job_done(job); fc_bsg_jobdone(job, bsg_reply->result,
bsg_reply->reply_payload_rcv_len);
} }
return; return;
} }
...@@ -1886,7 +1891,8 @@ lpfc_sli3_bsg_diag_loopback_mode(struct lpfc_hba *phba, struct fc_bsg_job *job) ...@@ -1886,7 +1891,8 @@ lpfc_sli3_bsg_diag_loopback_mode(struct lpfc_hba *phba, struct fc_bsg_job *job)
bsg_reply->result = rc; bsg_reply->result = rc;
/* complete the job back to userspace if no error */ /* complete the job back to userspace if no error */
if (rc == 0) if (rc == 0)
job->job_done(job); fc_bsg_jobdone(job, bsg_reply->result,
bsg_reply->reply_payload_rcv_len);
return rc; return rc;
} }
...@@ -2175,7 +2181,8 @@ lpfc_sli4_bsg_diag_loopback_mode(struct lpfc_hba *phba, struct fc_bsg_job *job) ...@@ -2175,7 +2181,8 @@ lpfc_sli4_bsg_diag_loopback_mode(struct lpfc_hba *phba, struct fc_bsg_job *job)
bsg_reply->result = rc; bsg_reply->result = rc;
/* complete the job back to userspace if no error */ /* complete the job back to userspace if no error */
if (rc == 0) if (rc == 0)
job->job_done(job); fc_bsg_jobdone(job, bsg_reply->result,
bsg_reply->reply_payload_rcv_len);
return rc; return rc;
} }
...@@ -2289,7 +2296,8 @@ lpfc_sli4_bsg_diag_mode_end(struct fc_bsg_job *job) ...@@ -2289,7 +2296,8 @@ lpfc_sli4_bsg_diag_mode_end(struct fc_bsg_job *job)
bsg_reply->result = rc; bsg_reply->result = rc;
/* complete the job back to userspace if no error */ /* complete the job back to userspace if no error */
if (rc == 0) if (rc == 0)
job->job_done(job); fc_bsg_jobdone(job, bsg_reply->result,
bsg_reply->reply_payload_rcv_len);
return rc; return rc;
} }
...@@ -2441,7 +2449,8 @@ lpfc_sli4_bsg_link_diag_test(struct fc_bsg_job *job) ...@@ -2441,7 +2449,8 @@ lpfc_sli4_bsg_link_diag_test(struct fc_bsg_job *job)
bsg_reply->result = rc; bsg_reply->result = rc;
/* complete the job back to userspace if no error */ /* complete the job back to userspace if no error */
if (rc == 0) if (rc == 0)
job->job_done(job); fc_bsg_jobdone(job, bsg_reply->result,
bsg_reply->reply_payload_rcv_len);
return rc; return rc;
} }
...@@ -3301,7 +3310,8 @@ lpfc_bsg_diag_loopback_run(struct fc_bsg_job *job) ...@@ -3301,7 +3310,8 @@ lpfc_bsg_diag_loopback_run(struct fc_bsg_job *job)
job->dd_data = NULL; job->dd_data = NULL;
/* complete the job back to userspace if no error */ /* complete the job back to userspace if no error */
if (rc == IOCB_SUCCESS) if (rc == IOCB_SUCCESS)
job->job_done(job); fc_bsg_jobdone(job, bsg_reply->result,
bsg_reply->reply_payload_rcv_len);
return rc; return rc;
} }
...@@ -3344,7 +3354,8 @@ lpfc_bsg_get_dfc_rev(struct fc_bsg_job *job) ...@@ -3344,7 +3354,8 @@ lpfc_bsg_get_dfc_rev(struct fc_bsg_job *job)
job_error: job_error:
bsg_reply->result = rc; bsg_reply->result = rc;
if (rc == 0) if (rc == 0)
job->job_done(job); fc_bsg_jobdone(job, bsg_reply->result,
bsg_reply->reply_payload_rcv_len);
return rc; return rc;
} }
...@@ -3409,7 +3420,8 @@ lpfc_bsg_issue_mbox_cmpl(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmboxq) ...@@ -3409,7 +3420,8 @@ lpfc_bsg_issue_mbox_cmpl(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmboxq)
if (job) { if (job) {
bsg_reply->result = 0; bsg_reply->result = 0;
job->job_done(job); fc_bsg_jobdone(job, bsg_reply->result,
bsg_reply->reply_payload_rcv_len);
} }
return; return;
} }
...@@ -3635,6 +3647,7 @@ static void ...@@ -3635,6 +3647,7 @@ static void
lpfc_bsg_issue_read_mbox_ext_cmpl(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmboxq) lpfc_bsg_issue_read_mbox_ext_cmpl(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmboxq)
{ {
struct fc_bsg_job *job; struct fc_bsg_job *job;
struct fc_bsg_reply *bsg_reply;
job = lpfc_bsg_issue_mbox_ext_handle_job(phba, pmboxq); job = lpfc_bsg_issue_mbox_ext_handle_job(phba, pmboxq);
...@@ -3654,9 +3667,11 @@ lpfc_bsg_issue_read_mbox_ext_cmpl(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmboxq) ...@@ -3654,9 +3667,11 @@ lpfc_bsg_issue_read_mbox_ext_cmpl(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmboxq)
mempool_free(pmboxq, phba->mbox_mem_pool); mempool_free(pmboxq, phba->mbox_mem_pool);
/* if the job is still active, call job done */ /* if the job is still active, call job done */
if (job) if (job) {
job->job_done(job); bsg_reply = job->reply;
fc_bsg_jobdone(job, bsg_reply->result,
bsg_reply->reply_payload_rcv_len);
}
return; return;
} }
...@@ -3672,6 +3687,7 @@ static void ...@@ -3672,6 +3687,7 @@ static void
lpfc_bsg_issue_write_mbox_ext_cmpl(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmboxq) lpfc_bsg_issue_write_mbox_ext_cmpl(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmboxq)
{ {
struct fc_bsg_job *job; struct fc_bsg_job *job;
struct fc_bsg_reply *bsg_reply;
job = lpfc_bsg_issue_mbox_ext_handle_job(phba, pmboxq); job = lpfc_bsg_issue_mbox_ext_handle_job(phba, pmboxq);
...@@ -3689,8 +3705,11 @@ lpfc_bsg_issue_write_mbox_ext_cmpl(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmboxq) ...@@ -3689,8 +3705,11 @@ lpfc_bsg_issue_write_mbox_ext_cmpl(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmboxq)
lpfc_bsg_mbox_ext_session_reset(phba); lpfc_bsg_mbox_ext_session_reset(phba);
/* if the job is still active, call job done */ /* if the job is still active, call job done */
if (job) if (job) {
job->job_done(job); bsg_reply = job->reply;
fc_bsg_jobdone(job, bsg_reply->result,
bsg_reply->reply_payload_rcv_len);
}
return; return;
} }
...@@ -4131,7 +4150,8 @@ lpfc_bsg_sli_cfg_write_cmd_ext(struct lpfc_hba *phba, struct fc_bsg_job *job, ...@@ -4131,7 +4150,8 @@ lpfc_bsg_sli_cfg_write_cmd_ext(struct lpfc_hba *phba, struct fc_bsg_job *job,
/* wait for additoinal external buffers */ /* wait for additoinal external buffers */
bsg_reply->result = 0; bsg_reply->result = 0;
job->job_done(job); fc_bsg_jobdone(job, bsg_reply->result,
bsg_reply->reply_payload_rcv_len);
return SLI_CONFIG_HANDLED; return SLI_CONFIG_HANDLED;
job_error: job_error:
...@@ -4357,7 +4377,8 @@ lpfc_bsg_read_ebuf_get(struct lpfc_hba *phba, struct fc_bsg_job *job) ...@@ -4357,7 +4377,8 @@ lpfc_bsg_read_ebuf_get(struct lpfc_hba *phba, struct fc_bsg_job *job)
} }
bsg_reply->result = 0; bsg_reply->result = 0;
job->job_done(job); fc_bsg_jobdone(job, bsg_reply->result,
bsg_reply->reply_payload_rcv_len);
return SLI_CONFIG_HANDLED; return SLI_CONFIG_HANDLED;
} }
...@@ -4473,7 +4494,8 @@ lpfc_bsg_write_ebuf_set(struct lpfc_hba *phba, struct fc_bsg_job *job, ...@@ -4473,7 +4494,8 @@ lpfc_bsg_write_ebuf_set(struct lpfc_hba *phba, struct fc_bsg_job *job,
/* wait for additoinal external buffers */ /* wait for additoinal external buffers */
bsg_reply->result = 0; bsg_reply->result = 0;
job->job_done(job); fc_bsg_jobdone(job, bsg_reply->result,
bsg_reply->reply_payload_rcv_len);
return SLI_CONFIG_HANDLED; return SLI_CONFIG_HANDLED;
job_error: job_error:
...@@ -4941,7 +4963,8 @@ lpfc_bsg_mbox_cmd(struct fc_bsg_job *job) ...@@ -4941,7 +4963,8 @@ lpfc_bsg_mbox_cmd(struct fc_bsg_job *job)
/* job done */ /* job done */
bsg_reply->result = 0; bsg_reply->result = 0;
job->dd_data = NULL; job->dd_data = NULL;
job->job_done(job); fc_bsg_jobdone(job, bsg_reply->result,
bsg_reply->reply_payload_rcv_len);
} else if (rc == 1) } else if (rc == 1)
/* job submitted, will complete later*/ /* job submitted, will complete later*/
rc = 0; /* return zero, no error */ rc = 0; /* return zero, no error */
...@@ -5051,7 +5074,8 @@ lpfc_bsg_menlo_cmd_cmp(struct lpfc_hba *phba, ...@@ -5051,7 +5074,8 @@ lpfc_bsg_menlo_cmd_cmp(struct lpfc_hba *phba,
if (job) { if (job) {
bsg_reply->result = rc; bsg_reply->result = rc;
job->job_done(job); fc_bsg_jobdone(job, bsg_reply->result,
bsg_reply->reply_payload_rcv_len);
} }
return; return;
...@@ -5269,7 +5293,8 @@ lpfc_forced_link_speed(struct fc_bsg_job *job) ...@@ -5269,7 +5293,8 @@ lpfc_forced_link_speed(struct fc_bsg_job *job)
job_error: job_error:
bsg_reply->result = rc; bsg_reply->result = rc;
if (rc == 0) if (rc == 0)
job->job_done(job); fc_bsg_jobdone(job, bsg_reply->result,
bsg_reply->reply_payload_rcv_len);
return rc; return rc;
} }
......
...@@ -20,7 +20,8 @@ qla2x00_bsg_job_done(void *data, void *ptr, int res) ...@@ -20,7 +20,8 @@ qla2x00_bsg_job_done(void *data, void *ptr, int res)
struct fc_bsg_reply *bsg_reply = bsg_job->reply; struct fc_bsg_reply *bsg_reply = bsg_job->reply;
bsg_reply->result = res; bsg_reply->result = res;
bsg_job->job_done(bsg_job); fc_bsg_jobdone(bsg_job, bsg_reply->result,
bsg_reply->reply_payload_rcv_len);
sp->free(vha, sp); sp->free(vha, sp);
} }
...@@ -242,7 +243,8 @@ qla24xx_proc_fcp_prio_cfg_cmd(struct fc_bsg_job *bsg_job) ...@@ -242,7 +243,8 @@ qla24xx_proc_fcp_prio_cfg_cmd(struct fc_bsg_job *bsg_job)
} }
exit_fcp_prio_cfg: exit_fcp_prio_cfg:
if (!ret) if (!ret)
bsg_job->job_done(bsg_job); fc_bsg_jobdone(bsg_job, bsg_reply->result,
bsg_reply->reply_payload_rcv_len);
return ret; return ret;
} }
...@@ -939,7 +941,8 @@ qla2x00_process_loopback(struct fc_bsg_job *bsg_job) ...@@ -939,7 +941,8 @@ qla2x00_process_loopback(struct fc_bsg_job *bsg_job)
bsg_job->request_payload.sg_list, bsg_job->request_payload.sg_list,
bsg_job->request_payload.sg_cnt, DMA_TO_DEVICE); bsg_job->request_payload.sg_cnt, DMA_TO_DEVICE);
if (!rval) if (!rval)
bsg_job->job_done(bsg_job); fc_bsg_jobdone(bsg_job, bsg_reply->result,
bsg_reply->reply_payload_rcv_len);
return rval; return rval;
} }
...@@ -972,7 +975,8 @@ qla84xx_reset(struct fc_bsg_job *bsg_job) ...@@ -972,7 +975,8 @@ qla84xx_reset(struct fc_bsg_job *bsg_job)
ql_dbg(ql_dbg_user, vha, 0x7031, ql_dbg(ql_dbg_user, vha, 0x7031,
"Vendor request 84xx reset completed.\n"); "Vendor request 84xx reset completed.\n");
bsg_reply->result = DID_OK; bsg_reply->result = DID_OK;
bsg_job->job_done(bsg_job); fc_bsg_jobdone(bsg_job, bsg_reply->result,
bsg_reply->reply_payload_rcv_len);
} }
return rval; return rval;
...@@ -1085,7 +1089,8 @@ qla84xx_updatefw(struct fc_bsg_job *bsg_job) ...@@ -1085,7 +1089,8 @@ qla84xx_updatefw(struct fc_bsg_job *bsg_job)
bsg_job->request_payload.sg_cnt, DMA_TO_DEVICE); bsg_job->request_payload.sg_cnt, DMA_TO_DEVICE);
if (!rval) if (!rval)
bsg_job->job_done(bsg_job); fc_bsg_jobdone(bsg_job, bsg_reply->result,
bsg_reply->reply_payload_rcv_len);
return rval; return rval;
} }
...@@ -1282,7 +1287,8 @@ qla84xx_mgmt_cmd(struct fc_bsg_job *bsg_job) ...@@ -1282,7 +1287,8 @@ qla84xx_mgmt_cmd(struct fc_bsg_job *bsg_job)
dma_pool_free(ha->s_dma_pool, mn, mn_dma); dma_pool_free(ha->s_dma_pool, mn, mn_dma);
if (!rval) if (!rval)
bsg_job->job_done(bsg_job); fc_bsg_jobdone(bsg_job, bsg_reply->result,
bsg_reply->reply_payload_rcv_len);
return rval; return rval;
} }
...@@ -1368,7 +1374,8 @@ qla24xx_iidma(struct fc_bsg_job *bsg_job) ...@@ -1368,7 +1374,8 @@ qla24xx_iidma(struct fc_bsg_job *bsg_job)
} }
bsg_reply->result = DID_OK; bsg_reply->result = DID_OK;
bsg_job->job_done(bsg_job); fc_bsg_jobdone(bsg_job, bsg_reply->result,
bsg_reply->reply_payload_rcv_len);
} }
return rval; return rval;
...@@ -1476,7 +1483,8 @@ qla2x00_read_optrom(struct fc_bsg_job *bsg_job) ...@@ -1476,7 +1483,8 @@ qla2x00_read_optrom(struct fc_bsg_job *bsg_job)
ha->optrom_buffer = NULL; ha->optrom_buffer = NULL;
ha->optrom_state = QLA_SWAITING; ha->optrom_state = QLA_SWAITING;
mutex_unlock(&ha->optrom_mutex); mutex_unlock(&ha->optrom_mutex);
bsg_job->job_done(bsg_job); fc_bsg_jobdone(bsg_job, bsg_reply->result,
bsg_reply->reply_payload_rcv_len);
return rval; return rval;
} }
...@@ -1511,7 +1519,8 @@ qla2x00_update_optrom(struct fc_bsg_job *bsg_job) ...@@ -1511,7 +1519,8 @@ qla2x00_update_optrom(struct fc_bsg_job *bsg_job)
ha->optrom_buffer = NULL; ha->optrom_buffer = NULL;
ha->optrom_state = QLA_SWAITING; ha->optrom_state = QLA_SWAITING;
mutex_unlock(&ha->optrom_mutex); mutex_unlock(&ha->optrom_mutex);
bsg_job->job_done(bsg_job); fc_bsg_jobdone(bsg_job, bsg_reply->result,
bsg_reply->reply_payload_rcv_len);
return rval; return rval;
} }
...@@ -1561,7 +1570,8 @@ qla2x00_update_fru_versions(struct fc_bsg_job *bsg_job) ...@@ -1561,7 +1570,8 @@ qla2x00_update_fru_versions(struct fc_bsg_job *bsg_job)
done: done:
bsg_job->reply_len = sizeof(struct fc_bsg_reply); bsg_job->reply_len = sizeof(struct fc_bsg_reply);
bsg_reply->result = DID_OK << 16; bsg_reply->result = DID_OK << 16;
bsg_job->job_done(bsg_job); fc_bsg_jobdone(bsg_job, bsg_reply->result,
bsg_reply->reply_payload_rcv_len);
return 0; return 0;
} }
...@@ -1610,7 +1620,8 @@ qla2x00_read_fru_status(struct fc_bsg_job *bsg_job) ...@@ -1610,7 +1620,8 @@ qla2x00_read_fru_status(struct fc_bsg_job *bsg_job)
bsg_job->reply_len = sizeof(struct fc_bsg_reply); bsg_job->reply_len = sizeof(struct fc_bsg_reply);
bsg_reply->reply_payload_rcv_len = sizeof(*sr); bsg_reply->reply_payload_rcv_len = sizeof(*sr);
bsg_reply->result = DID_OK << 16; bsg_reply->result = DID_OK << 16;
bsg_job->job_done(bsg_job); fc_bsg_jobdone(bsg_job, bsg_reply->result,
bsg_reply->reply_payload_rcv_len);
return 0; return 0;
} }
...@@ -1655,7 +1666,8 @@ qla2x00_write_fru_status(struct fc_bsg_job *bsg_job) ...@@ -1655,7 +1666,8 @@ qla2x00_write_fru_status(struct fc_bsg_job *bsg_job)
done: done:
bsg_job->reply_len = sizeof(struct fc_bsg_reply); bsg_job->reply_len = sizeof(struct fc_bsg_reply);
bsg_reply->result = DID_OK << 16; bsg_reply->result = DID_OK << 16;
bsg_job->job_done(bsg_job); fc_bsg_jobdone(bsg_job, bsg_reply->result,
bsg_reply->reply_payload_rcv_len);
return 0; return 0;
} }
...@@ -1699,7 +1711,8 @@ qla2x00_write_i2c(struct fc_bsg_job *bsg_job) ...@@ -1699,7 +1711,8 @@ qla2x00_write_i2c(struct fc_bsg_job *bsg_job)
done: done:
bsg_job->reply_len = sizeof(struct fc_bsg_reply); bsg_job->reply_len = sizeof(struct fc_bsg_reply);
bsg_reply->result = DID_OK << 16; bsg_reply->result = DID_OK << 16;
bsg_job->job_done(bsg_job); fc_bsg_jobdone(bsg_job, bsg_reply->result,
bsg_reply->reply_payload_rcv_len);
return 0; return 0;
} }
...@@ -1747,7 +1760,8 @@ qla2x00_read_i2c(struct fc_bsg_job *bsg_job) ...@@ -1747,7 +1760,8 @@ qla2x00_read_i2c(struct fc_bsg_job *bsg_job)
bsg_job->reply_len = sizeof(struct fc_bsg_reply); bsg_job->reply_len = sizeof(struct fc_bsg_reply);
bsg_reply->reply_payload_rcv_len = sizeof(*i2c); bsg_reply->reply_payload_rcv_len = sizeof(*i2c);
bsg_reply->result = DID_OK << 16; bsg_reply->result = DID_OK << 16;
bsg_job->job_done(bsg_job); fc_bsg_jobdone(bsg_job, bsg_reply->result,
bsg_reply->reply_payload_rcv_len);
return 0; return 0;
} }
...@@ -1925,7 +1939,8 @@ qla24xx_process_bidir_cmd(struct fc_bsg_job *bsg_job) ...@@ -1925,7 +1939,8 @@ qla24xx_process_bidir_cmd(struct fc_bsg_job *bsg_job)
bsg_job->reply_len = sizeof(struct fc_bsg_reply); bsg_job->reply_len = sizeof(struct fc_bsg_reply);
bsg_reply->reply_payload_rcv_len = 0; bsg_reply->reply_payload_rcv_len = 0;
bsg_reply->result = (DID_OK) << 16; bsg_reply->result = (DID_OK) << 16;
bsg_job->job_done(bsg_job); fc_bsg_jobdone(bsg_job, bsg_reply->result,
bsg_reply->reply_payload_rcv_len);
/* Always return success, vendor rsp carries correct status */ /* Always return success, vendor rsp carries correct status */
return 0; return 0;
} }
...@@ -2090,7 +2105,8 @@ qla26xx_serdes_op(struct fc_bsg_job *bsg_job) ...@@ -2090,7 +2105,8 @@ qla26xx_serdes_op(struct fc_bsg_job *bsg_job)
bsg_job->reply_len = sizeof(struct fc_bsg_reply); bsg_job->reply_len = sizeof(struct fc_bsg_reply);
bsg_reply->result = DID_OK << 16; bsg_reply->result = DID_OK << 16;
bsg_job->job_done(bsg_job); fc_bsg_jobdone(bsg_job, bsg_reply->result,
bsg_reply->reply_payload_rcv_len);
return 0; return 0;
} }
...@@ -2131,7 +2147,8 @@ qla8044_serdes_op(struct fc_bsg_job *bsg_job) ...@@ -2131,7 +2147,8 @@ qla8044_serdes_op(struct fc_bsg_job *bsg_job)
bsg_job->reply_len = sizeof(struct fc_bsg_reply); bsg_job->reply_len = sizeof(struct fc_bsg_reply);
bsg_reply->result = DID_OK << 16; bsg_reply->result = DID_OK << 16;
bsg_job->job_done(bsg_job); fc_bsg_jobdone(bsg_job, bsg_reply->result,
bsg_reply->reply_payload_rcv_len);
return 0; return 0;
} }
...@@ -2162,7 +2179,8 @@ qla27xx_get_flash_upd_cap(struct fc_bsg_job *bsg_job) ...@@ -2162,7 +2179,8 @@ qla27xx_get_flash_upd_cap(struct fc_bsg_job *bsg_job)
bsg_job->reply_len = sizeof(struct fc_bsg_reply); bsg_job->reply_len = sizeof(struct fc_bsg_reply);
bsg_reply->result = DID_OK << 16; bsg_reply->result = DID_OK << 16;
bsg_job->job_done(bsg_job); fc_bsg_jobdone(bsg_job, bsg_reply->result,
bsg_reply->reply_payload_rcv_len);
return 0; return 0;
} }
...@@ -2207,7 +2225,8 @@ qla27xx_set_flash_upd_cap(struct fc_bsg_job *bsg_job) ...@@ -2207,7 +2225,8 @@ qla27xx_set_flash_upd_cap(struct fc_bsg_job *bsg_job)
bsg_job->reply_len = sizeof(struct fc_bsg_reply); bsg_job->reply_len = sizeof(struct fc_bsg_reply);
bsg_reply->result = DID_OK << 16; bsg_reply->result = DID_OK << 16;
bsg_job->job_done(bsg_job); fc_bsg_jobdone(bsg_job, bsg_reply->result,
bsg_reply->reply_payload_rcv_len);
return 0; return 0;
} }
...@@ -2265,7 +2284,8 @@ qla27xx_get_bbcr_data(struct fc_bsg_job *bsg_job) ...@@ -2265,7 +2284,8 @@ qla27xx_get_bbcr_data(struct fc_bsg_job *bsg_job)
bsg_job->reply_len = sizeof(struct fc_bsg_reply); bsg_job->reply_len = sizeof(struct fc_bsg_reply);
bsg_reply->result = DID_OK << 16; bsg_reply->result = DID_OK << 16;
bsg_job->job_done(bsg_job); fc_bsg_jobdone(bsg_job, bsg_reply->result,
bsg_reply->reply_payload_rcv_len);
return 0; return 0;
} }
...@@ -2321,7 +2341,8 @@ qla2x00_get_priv_stats(struct fc_bsg_job *bsg_job) ...@@ -2321,7 +2341,8 @@ qla2x00_get_priv_stats(struct fc_bsg_job *bsg_job)
bsg_job->reply_len = sizeof(*bsg_reply); bsg_job->reply_len = sizeof(*bsg_reply);
bsg_reply->result = DID_OK << 16; bsg_reply->result = DID_OK << 16;
bsg_job->job_done(bsg_job); fc_bsg_jobdone(bsg_job, bsg_reply->result,
bsg_reply->reply_payload_rcv_len);
dma_free_coherent(&ha->pdev->dev, sizeof(*stats), dma_free_coherent(&ha->pdev->dev, sizeof(*stats),
stats, stats_dma); stats, stats_dma);
...@@ -2364,7 +2385,8 @@ qla2x00_do_dport_diagnostics(struct fc_bsg_job *bsg_job) ...@@ -2364,7 +2385,8 @@ qla2x00_do_dport_diagnostics(struct fc_bsg_job *bsg_job)
bsg_job->reply_len = sizeof(*bsg_reply); bsg_job->reply_len = sizeof(*bsg_reply);
bsg_reply->result = DID_OK << 16; bsg_reply->result = DID_OK << 16;
bsg_job->job_done(bsg_job); fc_bsg_jobdone(bsg_job, bsg_reply->result,
bsg_reply->reply_payload_rcv_len);
kfree(dd); kfree(dd);
......
...@@ -3582,16 +3582,17 @@ fc_destroy_bsgjob(struct fc_bsg_job *job) ...@@ -3582,16 +3582,17 @@ fc_destroy_bsgjob(struct fc_bsg_job *job)
* fc_bsg_jobdone - completion routine for bsg requests that the LLD has * fc_bsg_jobdone - completion routine for bsg requests that the LLD has
* completed * completed
* @job: fc_bsg_job that is complete * @job: fc_bsg_job that is complete
* @result: job reply result
* @reply_payload_rcv_len: length of payload received
*/ */
static void void fc_bsg_jobdone(struct fc_bsg_job *job, int result,
fc_bsg_jobdone(struct fc_bsg_job *job) unsigned int reply_payload_rcv_len)
{ {
struct request *req = job->req; struct request *req = job->req;
struct request *rsp = req->next_rq; struct request *rsp = req->next_rq;
struct fc_bsg_reply *bsg_reply = job->reply;
int err; int err;
err = job->req->errors = bsg_reply->result; err = job->req->errors = result;
if (err < 0) if (err < 0)
/* we're only returning the result field in the reply */ /* we're only returning the result field in the reply */
...@@ -3603,14 +3604,14 @@ fc_bsg_jobdone(struct fc_bsg_job *job) ...@@ -3603,14 +3604,14 @@ fc_bsg_jobdone(struct fc_bsg_job *job)
req->resid_len = 0; req->resid_len = 0;
if (rsp) { if (rsp) {
WARN_ON(bsg_reply->reply_payload_rcv_len > rsp->resid_len); WARN_ON(reply_payload_rcv_len > rsp->resid_len);
/* set reply (bidi) residual */ /* set reply (bidi) residual */
rsp->resid_len -= min(bsg_reply->reply_payload_rcv_len, rsp->resid_len -= min(reply_payload_rcv_len, rsp->resid_len);
rsp->resid_len);
} }
blk_complete_request(req); blk_complete_request(req);
} }
EXPORT_SYMBOL_GPL(fc_bsg_jobdone);
/** /**
* fc_bsg_softirq_done - softirq done routine for destroying the bsg requests * fc_bsg_softirq_done - softirq done routine for destroying the bsg requests
...@@ -3742,7 +3743,6 @@ fc_req_to_bsgjob(struct Scsi_Host *shost, struct fc_rport *rport, ...@@ -3742,7 +3743,6 @@ fc_req_to_bsgjob(struct Scsi_Host *shost, struct fc_rport *rport,
if (ret) if (ret)
goto failjob_rls_rqst_payload; goto failjob_rls_rqst_payload;
} }
job->job_done = fc_bsg_jobdone;
if (rport) if (rport)
job->dev = &rport->dev; job->dev = &rport->dev;
else else
...@@ -3846,7 +3846,8 @@ fc_bsg_host_dispatch(struct request_queue *q, struct Scsi_Host *shost, ...@@ -3846,7 +3846,8 @@ fc_bsg_host_dispatch(struct request_queue *q, struct Scsi_Host *shost,
bsg_reply->reply_payload_rcv_len = 0; bsg_reply->reply_payload_rcv_len = 0;
bsg_reply->result = ret; bsg_reply->result = ret;
job->reply_len = sizeof(uint32_t); job->reply_len = sizeof(uint32_t);
fc_bsg_jobdone(job); fc_bsg_jobdone(job, bsg_reply->result,
bsg_reply->reply_payload_rcv_len);
return FC_DISPATCH_UNLOCKED; return FC_DISPATCH_UNLOCKED;
} }
...@@ -3923,7 +3924,8 @@ fc_bsg_rport_dispatch(struct request_queue *q, struct Scsi_Host *shost, ...@@ -3923,7 +3924,8 @@ fc_bsg_rport_dispatch(struct request_queue *q, struct Scsi_Host *shost,
bsg_reply->reply_payload_rcv_len = 0; bsg_reply->reply_payload_rcv_len = 0;
bsg_reply->result = ret; bsg_reply->result = ret;
job->reply_len = sizeof(uint32_t); job->reply_len = sizeof(uint32_t);
fc_bsg_jobdone(job); fc_bsg_jobdone(job, bsg_reply->result,
bsg_reply->reply_payload_rcv_len);
return FC_DISPATCH_UNLOCKED; return FC_DISPATCH_UNLOCKED;
} }
...@@ -3983,7 +3985,8 @@ fc_bsg_request_handler(struct request_queue *q, struct Scsi_Host *shost, ...@@ -3983,7 +3985,8 @@ fc_bsg_request_handler(struct request_queue *q, struct Scsi_Host *shost,
bsg_reply->reply_payload_rcv_len = 0; bsg_reply->reply_payload_rcv_len = 0;
bsg_reply->result = -ENOMSG; bsg_reply->result = -ENOMSG;
job->reply_len = sizeof(uint32_t); job->reply_len = sizeof(uint32_t);
fc_bsg_jobdone(job); fc_bsg_jobdone(job, bsg_reply->result,
bsg_reply->reply_payload_rcv_len);
spin_lock_irq(q->queue_lock); spin_lock_irq(q->queue_lock);
continue; continue;
} }
......
...@@ -637,7 +637,6 @@ struct fc_bsg_job { ...@@ -637,7 +637,6 @@ struct fc_bsg_job {
spinlock_t job_lock; spinlock_t job_lock;
unsigned int state_flags; unsigned int state_flags;
unsigned int ref_cnt; unsigned int ref_cnt;
void (*job_done)(struct fc_bsg_job *);
struct fc_bsg_request *request; struct fc_bsg_request *request;
struct fc_bsg_reply *reply; struct fc_bsg_reply *reply;
...@@ -842,5 +841,7 @@ struct fc_vport *fc_vport_create(struct Scsi_Host *shost, int channel, ...@@ -842,5 +841,7 @@ struct fc_vport *fc_vport_create(struct Scsi_Host *shost, int channel,
struct fc_vport_identifiers *); struct fc_vport_identifiers *);
int fc_vport_terminate(struct fc_vport *vport); int fc_vport_terminate(struct fc_vport *vport);
int fc_block_scsi_eh(struct scsi_cmnd *cmnd); int fc_block_scsi_eh(struct scsi_cmnd *cmnd);
void fc_bsg_jobdone(struct fc_bsg_job *job, int result,
unsigned int reply_payload_rcv_len);
#endif /* SCSI_TRANSPORT_FC_H */ #endif /* SCSI_TRANSPORT_FC_H */
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment