Split the big qla_tgt_exec_sess_work function into one per work item type. Signed-off-by: Christoph Hellwig <hch@xxxxxx> Index: lio-core/drivers/scsi/qla2xxx/qla_target.c =================================================================== --- lio-core.orig/drivers/scsi/qla2xxx/qla_target.c 2011-11-07 07:40:23.778315530 +0100 +++ lio-core/drivers/scsi/qla2xxx/qla_target.c 2011-11-07 07:53:09.489818759 +0100 @@ -4545,72 +4545,34 @@ retry: return sess; } -static void qla_tgt_exec_sess_work(struct qla_tgt *tgt, +static void qla_tgt_exec_cmd_work(struct qla_tgt *tgt, struct qla_tgt_sess_work_param *prm) { struct scsi_qla_host *vha = tgt->vha; struct qla_hw_data *ha = vha->hw; struct qla_tgt_sess *sess = NULL; unsigned long flags; - uint32_t be_s_id; uint8_t *s_id = NULL; /* to hide compiler warnings */ - uint8_t local_s_id[3]; int rc, loop_id = -1; /* to hide compiler warnings */ + struct qla_tgt_cmd *cmd = prm->cmd; + atio_from_isp_t *a = (atio_from_isp_t *)&cmd->atio; ql_dbg(ql_dbg_tgt_mgt, vha, 0xe14b, "qla_tgt_exec_sess_work() processing -> prm %p\n", prm); spin_lock_irqsave(&ha->hardware_lock, flags); if (tgt->tgt_stop) - goto send; - - switch (prm->type) { - case QLA_TGT_SESS_WORK_CMD: - { - struct qla_tgt_cmd *cmd = prm->cmd; - atio_from_isp_t *a = (atio_from_isp_t *)&cmd->atio; - if (IS_FWI2_CAPABLE(ha)) - s_id = a->u.isp24.fcp_hdr.s_id; - else - loop_id = GET_TARGET_ID(ha, a); - break; - } - case QLA_TGT_SESS_WORK_ABORT: - if (IS_FWI2_CAPABLE(ha)) { - be_s_id = (prm->abts.fcp_hdr_le.s_id[0] << 16) | - (prm->abts.fcp_hdr_le.s_id[1] << 8) | - prm->abts.fcp_hdr_le.s_id[2]; - - sess = ha->tgt_ops->find_sess_by_s_id(vha, - (unsigned char *)&be_s_id); - if (!sess) { - s_id = local_s_id; - s_id[0] = prm->abts.fcp_hdr_le.s_id[2]; - s_id[1] = prm->abts.fcp_hdr_le.s_id[1]; - s_id[2] = prm->abts.fcp_hdr_le.s_id[0]; - } - goto after_find; - } else - loop_id = GET_TARGET_ID(ha, (atio_from_isp_t *)&prm->tm_iocb); - break; - case QLA_TGT_SESS_WORK_TM: - if (IS_FWI2_CAPABLE(ha)) - s_id = prm->tm_iocb2.u.isp24.fcp_hdr.s_id; - else - loop_id = GET_TARGET_ID(ha, (atio_from_isp_t *)&prm->tm_iocb); - break; - default: - BUG_ON(1); - break; - } + goto out_term; - if (IS_FWI2_CAPABLE(ha)) + if (IS_FWI2_CAPABLE(ha)) { + s_id = a->u.isp24.fcp_hdr.s_id; sess = ha->tgt_ops->find_sess_by_s_id(vha, s_id); - else + } else { + loop_id = GET_TARGET_ID(ha, a); sess = ha->tgt_ops->find_sess_by_loop_id(vha, loop_id); + } -after_find: - if (sess != NULL) { + if (sess) { ql_dbg(ql_dbg_tgt_mgt, vha, 0xe14c, "sess %p found\n", sess); qla_tgt_sess_get(sess); } else { @@ -4618,111 +4580,206 @@ after_find: mutex_lock(&ha->tgt_mutex); sess = qla_tgt_make_local_sess(vha, s_id, loop_id); + /* sess has got an extra creation ref */ mutex_unlock(&ha->tgt_mutex); spin_lock_irqsave(&ha->hardware_lock, flags); - /* sess has got an extra creation ref */ + + if (!sess) + goto out_term; } -send: - if ((sess == NULL) || tgt->tgt_stop) + if (tgt->tgt_stop) goto out_term; - switch (prm->type) { - case QLA_TGT_SESS_WORK_CMD: - { - struct qla_tgt_cmd *cmd = prm->cmd; - if (tgt->tm_to_unknown) { - /* - * Cmd might be already aborted behind us, so be safe - * and abort it. It should be OK, initiator will retry - * it. - */ - goto out_term; - } - rc = qla_tgt_send_cmd_to_target(vha, cmd, sess); - break; + if (tgt->tm_to_unknown) { + /* + * Cmd might be already aborted behind us, so be safe + * and abort it. It should be OK, initiator will retry + * it. + */ + goto out_term; } - case QLA_TGT_SESS_WORK_ABORT: - if (IS_FWI2_CAPABLE(ha)) - rc = __qla_tgt_24xx_handle_abts(vha, &prm->abts, sess); - else - rc = __qla_tgt_abort_task(vha, &prm->tm_iocb, sess); - break; - case QLA_TGT_SESS_WORK_TM: - { - uint32_t lun, unpacked_lun; - int lun_size, fn; - void *iocb; - - if (IS_FWI2_CAPABLE(ha)) { - atio_from_isp_t *a = &prm->tm_iocb2; - iocb = a; - lun = a->u.isp24.fcp_cmnd.lun; - lun_size = sizeof(lun); - fn = a->u.isp24.fcp_cmnd.task_mgmt_flags; - } else { - imm_ntfy_from_isp_t *n = &prm->tm_iocb; - iocb = n; - /* make it be in network byte order */ - lun = swab16(le16_to_cpu(n->u.isp2x.lun)); - lun_size = sizeof(lun); - fn = n->u.isp2x.task_flags >> IMM_NTFY_TASK_MGMT_SHIFT; - } - unpacked_lun = scsilun_to_int((struct scsi_lun *)&lun); + rc = qla_tgt_send_cmd_to_target(vha, cmd, sess); + if (rc != 0) + goto out_term; + +out: + if (sess) + qla_tgt_sess_put(sess); + spin_unlock_irqrestore(&ha->hardware_lock, flags); + return; + +out_term: + ql_dbg(ql_dbg_tgt_mgt, vha, 0xe14d, "Terminating work cmd %p", cmd); + /* + * cmd has not sent to target yet, so pass NULL as the second + * argument + */ + qla_tgt_send_term_exchange(vha, NULL, &cmd->atio, 1); + goto out; +} + - rc = qla_tgt_issue_task_mgmt(sess, unpacked_lun, fn, iocb, 0); - break; +static void qla_tgt_abort_work(struct qla_tgt *tgt, + struct qla_tgt_sess_work_param *prm) +{ + struct scsi_qla_host *vha = tgt->vha; + struct qla_hw_data *ha = vha->hw; + struct qla_tgt_sess *sess = NULL; + unsigned long flags; + uint32_t be_s_id; + uint8_t *s_id = NULL; /* to hide compiler warnings */ + uint8_t local_s_id[3]; + int rc, loop_id = -1; /* to hide compiler warnings */ + + spin_lock_irqsave(&ha->hardware_lock, flags); + + if (tgt->tgt_stop) + goto out_term; + + if (IS_FWI2_CAPABLE(ha)) { + be_s_id = (prm->abts.fcp_hdr_le.s_id[0] << 16) | + (prm->abts.fcp_hdr_le.s_id[1] << 8) | + prm->abts.fcp_hdr_le.s_id[2]; + + sess = ha->tgt_ops->find_sess_by_s_id(vha, + (unsigned char *)&be_s_id); + if (!sess) { + s_id = local_s_id; + s_id[0] = prm->abts.fcp_hdr_le.s_id[2]; + s_id[1] = prm->abts.fcp_hdr_le.s_id[1]; + s_id[2] = prm->abts.fcp_hdr_le.s_id[0]; + } + } else { + loop_id = GET_TARGET_ID(ha, (atio_from_isp_t *)&prm->tm_iocb); + sess = ha->tgt_ops->find_sess_by_loop_id(vha, loop_id); } - default: - BUG_ON(1); - break; + + if (sess) { + ql_dbg(ql_dbg_tgt_mgt, vha, 0xe14c, "sess %p found\n", sess); + qla_tgt_sess_get(sess); + } else { + spin_unlock_irqrestore(&ha->hardware_lock, flags); + + mutex_lock(&ha->tgt_mutex); + sess = qla_tgt_make_local_sess(vha, s_id, loop_id); + /* sess has got an extra creation ref */ + mutex_unlock(&ha->tgt_mutex); + + spin_lock_irqsave(&ha->hardware_lock, flags); + + if (!sess) + goto out_term; } + if (tgt->tgt_stop) + goto out_term; + + if (IS_FWI2_CAPABLE(ha)) + rc = __qla_tgt_24xx_handle_abts(vha, &prm->abts, sess); + else + rc = __qla_tgt_abort_task(vha, &prm->tm_iocb, sess); if (rc != 0) goto out_term; - if (sess != NULL) +out: + if (sess) qla_tgt_sess_put(sess); spin_unlock_irqrestore(&ha->hardware_lock, flags); return; out_term: - switch (prm->type) { - case QLA_TGT_SESS_WORK_CMD: - { - struct qla_tgt_cmd *cmd = prm->cmd; - ql_dbg(ql_dbg_tgt_mgt, vha, 0xe14d, "Terminating work cmd %p", cmd); - /* - * cmd has not sent to target yet, so pass NULL as the second - * argument - */ - qla_tgt_send_term_exchange(vha, NULL, &cmd->atio, 1); + if (IS_FWI2_CAPABLE(ha)) { + qla_tgt_24xx_send_abts_resp(vha, &prm->abts, + FCP_TMF_REJECTED, false); + } else { + qla_tgt_send_notify_ack(vha, (void *)&prm->tm_iocb, + 0, 0, 0, 0, 0, 0); + } + + goto out; +} + +static void qla_tgt_tmr_work(struct qla_tgt *tgt, + struct qla_tgt_sess_work_param *prm) +{ + struct scsi_qla_host *vha = tgt->vha; + struct qla_hw_data *ha = vha->hw; + struct qla_tgt_sess *sess = NULL; + unsigned long flags; + uint8_t *s_id = NULL; /* to hide compiler warnings */ + int rc, loop_id = -1; /* to hide compiler warnings */ + uint32_t lun, unpacked_lun; + int lun_size, fn; + void *iocb; + + spin_lock_irqsave(&ha->hardware_lock, flags); + + if (tgt->tgt_stop) + goto out_term; + + if (IS_FWI2_CAPABLE(ha)) { + s_id = prm->tm_iocb2.u.isp24.fcp_hdr.s_id; + sess = ha->tgt_ops->find_sess_by_s_id(vha, s_id); + } else { + loop_id = GET_TARGET_ID(ha, (atio_from_isp_t *)&prm->tm_iocb); + sess = ha->tgt_ops->find_sess_by_loop_id(vha, loop_id); + } + + if (sess) { + ql_dbg(ql_dbg_tgt_mgt, vha, 0xe14c, "sess %p found\n", sess); + qla_tgt_sess_get(sess); + } else { + spin_unlock_irqrestore(&ha->hardware_lock, flags); + + mutex_lock(&ha->tgt_mutex); + sess = qla_tgt_make_local_sess(vha, s_id, loop_id); + /* sess has got an extra creation ref */ + mutex_unlock(&ha->tgt_mutex); + + spin_lock_irqsave(&ha->hardware_lock, flags); + if (!sess) + goto out_term; } - case QLA_TGT_SESS_WORK_ABORT: - if (IS_FWI2_CAPABLE(ha)) - qla_tgt_24xx_send_abts_resp(vha, &prm->abts, - FCP_TMF_REJECTED, false); - else - qla_tgt_send_notify_ack(vha, (void *)&prm->tm_iocb, - 0, 0, 0, 0, 0, 0); - break; - case QLA_TGT_SESS_WORK_TM: - if (IS_FWI2_CAPABLE(ha)) - qla_tgt_send_term_exchange(vha, NULL, &prm->tm_iocb2, 1); - else - qla_tgt_send_notify_ack(vha, &prm->tm_iocb, - 0, 0, 0, 0, 0, 0); - break; - default: - BUG_ON(1); - break; + + + if (IS_FWI2_CAPABLE(ha)) { + atio_from_isp_t *a = &prm->tm_iocb2; + iocb = a; + lun = a->u.isp24.fcp_cmnd.lun; + lun_size = sizeof(lun); + fn = a->u.isp24.fcp_cmnd.task_mgmt_flags; + } else { + imm_ntfy_from_isp_t *n = &prm->tm_iocb; + iocb = n; + /* make it be in network byte order */ + lun = swab16(le16_to_cpu(n->u.isp2x.lun)); + lun_size = sizeof(lun); + fn = n->u.isp2x.task_flags >> IMM_NTFY_TASK_MGMT_SHIFT; } - if (sess != NULL) + unpacked_lun = scsilun_to_int((struct scsi_lun *)&lun); + + rc = qla_tgt_issue_task_mgmt(sess, unpacked_lun, fn, iocb, 0); + if (rc != 0) + goto out_term; + +out: + if (sess) qla_tgt_sess_put(sess); spin_unlock_irqrestore(&ha->hardware_lock, flags); + return; + +out_term: + if (IS_FWI2_CAPABLE(ha)) + qla_tgt_send_term_exchange(vha, NULL, &prm->tm_iocb2, 1); + else + qla_tgt_send_notify_ack(vha, &prm->tm_iocb, + 0, 0, 0, 0, 0, 0); + + goto out; } static void qla_tgt_sess_work_fn(struct work_struct *work) @@ -4748,7 +4805,20 @@ static void qla_tgt_sess_work_fn(struct spin_unlock_irqrestore(&tgt->sess_work_lock, flags); - qla_tgt_exec_sess_work(tgt, prm); + switch (prm->type) { + case QLA_TGT_SESS_WORK_CMD: + qla_tgt_exec_cmd_work(tgt, prm); + break; + case QLA_TGT_SESS_WORK_ABORT: + qla_tgt_abort_work(tgt, prm); + break; + case QLA_TGT_SESS_WORK_TM: + qla_tgt_tmr_work(tgt, prm); + break; + default: + BUG_ON(1); + break; + } spin_lock_irqsave(&tgt->sess_work_lock, flags); -- To unsubscribe from this list: send the line "unsubscribe target-devel" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html