aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/target
diff options
context:
space:
mode:
authorNicholas Bellinger <nab@linux-iscsi.org>2011-11-23 00:41:54 -0500
committerNicholas Bellinger <nab@linux-iscsi.org>2011-12-14 06:42:08 -0500
commit4355a9110eeb2eaf1dd44fcab16ccbd1c8c5fad4 (patch)
tree6cfb4d1fc3cb5c71f67ab158ab41430cfe7a6e0c /drivers/target
parenta63607855224702ea17e6016ecf3f7d544e83625 (diff)
tcm_fc: Convert ft_send_work to use target_submit_cmd
This patch converts the main ft_send_work() I/O path to use target_submit_cmd() with a single se_cmd->cmd_kref reference that is released via the existing ft_check_stop_free() response path callback. It also makes ft_send_tm() use transport_init_se_cmd() and target_get_sess_cmd() to also use single se_cmd->cmd_kref reference. Cc: Christoph Hellwig <hch@lst.de> Cc: Kiran Patil <kiran.patil@intel.com> Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
Diffstat (limited to 'drivers/target')
-rw-r--r--drivers/target/tcm_fc/tfc_cmd.c51
1 files changed, 13 insertions, 38 deletions
diff --git a/drivers/target/tcm_fc/tfc_cmd.c b/drivers/target/tcm_fc/tfc_cmd.c
index dbbbc8376d01..addc18f727ea 100644
--- a/drivers/target/tcm_fc/tfc_cmd.c
+++ b/drivers/target/tcm_fc/tfc_cmd.c
@@ -363,6 +363,11 @@ static void ft_send_tm(struct ft_cmd *cmd)
363 struct ft_sess *sess; 363 struct ft_sess *sess;
364 u8 tm_func; 364 u8 tm_func;
365 365
366 transport_init_se_cmd(&cmd->se_cmd, &ft_configfs->tf_ops,
367 cmd->sess->se_sess, 0, DMA_NONE, 0,
368 &cmd->ft_sense_buffer[0]);
369 target_get_sess_cmd(cmd->sess->se_sess, &cmd->se_cmd, false);
370
366 fcp = fc_frame_payload_get(cmd->req_frame, sizeof(*fcp)); 371 fcp = fc_frame_payload_get(cmd->req_frame, sizeof(*fcp));
367 372
368 switch (fcp->fc_tm_flags) { 373 switch (fcp->fc_tm_flags) {
@@ -416,7 +421,6 @@ static void ft_send_tm(struct ft_cmd *cmd)
416 sess = cmd->sess; 421 sess = cmd->sess;
417 transport_send_check_condition_and_sense(&cmd->se_cmd, 422 transport_send_check_condition_and_sense(&cmd->se_cmd,
418 cmd->se_cmd.scsi_sense_reason, 0); 423 cmd->se_cmd.scsi_sense_reason, 0);
419 transport_generic_free_cmd(&cmd->se_cmd, 0);
420 ft_sess_put(sess); 424 ft_sess_put(sess);
421 return; 425 return;
422 } 426 }
@@ -532,7 +536,6 @@ static void ft_send_work(struct work_struct *work)
532{ 536{
533 struct ft_cmd *cmd = container_of(work, struct ft_cmd, work); 537 struct ft_cmd *cmd = container_of(work, struct ft_cmd, work);
534 struct fc_frame_header *fh = fc_frame_header_get(cmd->req_frame); 538 struct fc_frame_header *fh = fc_frame_header_get(cmd->req_frame);
535 struct se_cmd *se_cmd;
536 struct fcp_cmnd *fcp; 539 struct fcp_cmnd *fcp;
537 int data_dir = 0; 540 int data_dir = 0;
538 u32 data_len; 541 u32 data_len;
@@ -587,15 +590,6 @@ static void ft_send_work(struct work_struct *work)
587 data_len = ntohl(fcp->fc_dl); 590 data_len = ntohl(fcp->fc_dl);
588 cmd->cdb = fcp->fc_cdb; 591 cmd->cdb = fcp->fc_cdb;
589 } 592 }
590
591 se_cmd = &cmd->se_cmd;
592 /*
593 * Initialize struct se_cmd descriptor from target_core_mod
594 * infrastructure
595 */
596 transport_init_se_cmd(se_cmd, &ft_configfs->tf_ops, cmd->sess->se_sess,
597 data_len, data_dir, task_attr,
598 &cmd->ft_sense_buffer[0]);
599 /* 593 /*
600 * Check for FCP task management flags 594 * Check for FCP task management flags
601 */ 595 */
@@ -603,39 +597,20 @@ static void ft_send_work(struct work_struct *work)
603 ft_send_tm(cmd); 597 ft_send_tm(cmd);
604 return; 598 return;
605 } 599 }
606
607 fc_seq_exch(cmd->seq)->lp->tt.seq_set_resp(cmd->seq, ft_recv_seq, cmd); 600 fc_seq_exch(cmd->seq)->lp->tt.seq_set_resp(cmd->seq, ft_recv_seq, cmd);
608
609 cmd->lun = scsilun_to_int((struct scsi_lun *)fcp->fc_lun); 601 cmd->lun = scsilun_to_int((struct scsi_lun *)fcp->fc_lun);
610 ret = transport_lookup_cmd_lun(&cmd->se_cmd, cmd->lun); 602 /*
603 * Use a single se_cmd->cmd_kref as we expect to release se_cmd
604 * directly from ft_check_stop_free callback in response path.
605 */
606 ret = target_submit_cmd(&cmd->se_cmd, cmd->sess->se_sess, cmd->cdb,
607 &cmd->ft_sense_buffer[0], cmd->lun, data_len,
608 task_attr, data_dir, 0);
609 pr_debug("r_ctl %x alloc target_submit_cmd %d\n", fh->fh_r_ctl, ret);
611 if (ret < 0) { 610 if (ret < 0) {
612 ft_dump_cmd(cmd, __func__); 611 ft_dump_cmd(cmd, __func__);
613 transport_send_check_condition_and_sense(&cmd->se_cmd,
614 cmd->se_cmd.scsi_sense_reason, 0);
615 return;
616 }
617
618 ret = transport_generic_allocate_tasks(se_cmd, cmd->cdb);
619
620 pr_debug("r_ctl %x alloc task ret %d\n", fh->fh_r_ctl, ret);
621 ft_dump_cmd(cmd, __func__);
622
623 if (ret == -ENOMEM) {
624 transport_send_check_condition_and_sense(se_cmd,
625 TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE, 0);
626 transport_generic_free_cmd(se_cmd, 0);
627 return;
628 }
629 if (ret == -EINVAL) {
630 if (se_cmd->se_cmd_flags & SCF_SCSI_RESERVATION_CONFLICT)
631 ft_queue_status(se_cmd);
632 else
633 transport_send_check_condition_and_sense(se_cmd,
634 se_cmd->scsi_sense_reason, 0);
635 transport_generic_free_cmd(se_cmd, 0);
636 return; 612 return;
637 } 613 }
638 transport_handle_cdb_direct(se_cmd);
639 return; 614 return;
640 615
641err: 616err: