aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorChristoph Hellwig <hch@infradead.org>2011-11-03 17:50:42 -0400
committerNicholas Bellinger <nab@linux-iscsi.org>2011-11-04 04:00:17 -0400
commite76a35d6c809bd1638e3b1b535bb780ac731c380 (patch)
treea67bbbbc16cb4e612015da8b0f86fe981d1a5f77 /drivers
parent617c0e06c1b30b799d8b25f92eefdc1b098cb9f8 (diff)
target: pass the se_task to the CDB emulation callback
We want to be able to handle all CDBs through it and remove hacks like always using the first task in a CDB in target_report_luns. Also rename the callback to ->execute_task to better describe its use. Signed-off-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/target/target_core_alua.c6
-rw-r--r--drivers/target/target_core_alua.h4
-rw-r--r--drivers/target/target_core_device.c12
-rw-r--r--drivers/target/target_core_pr.c13
-rw-r--r--drivers/target/target_core_pr.h8
-rw-r--r--drivers/target/target_core_transport.c50
6 files changed, 40 insertions, 53 deletions
diff --git a/drivers/target/target_core_alua.c b/drivers/target/target_core_alua.c
index 8f4447749c71..14668d05ea0d 100644
--- a/drivers/target/target_core_alua.c
+++ b/drivers/target/target_core_alua.c
@@ -58,8 +58,9 @@ struct t10_alua_lu_gp *default_lu_gp;
58 * 58 *
59 * See spc4r17 section 6.27 59 * See spc4r17 section 6.27
60 */ 60 */
61int core_emulate_report_target_port_groups(struct se_cmd *cmd) 61int target_emulate_report_target_port_groups(struct se_task *task)
62{ 62{
63 struct se_cmd *cmd = task->task_se_cmd;
63 struct se_subsystem_dev *su_dev = cmd->se_dev->se_sub_dev; 64 struct se_subsystem_dev *su_dev = cmd->se_dev->se_sub_dev;
64 struct se_port *port; 65 struct se_port *port;
65 struct t10_alua_tg_pt_gp *tg_pt_gp; 66 struct t10_alua_tg_pt_gp *tg_pt_gp;
@@ -172,8 +173,9 @@ int core_emulate_report_target_port_groups(struct se_cmd *cmd)
172 * 173 *
173 * See spc4r17 section 6.35 174 * See spc4r17 section 6.35
174 */ 175 */
175int core_emulate_set_target_port_groups(struct se_cmd *cmd) 176int target_emulate_set_target_port_groups(struct se_task *task)
176{ 177{
178 struct se_cmd *cmd = task->task_se_cmd;
177 struct se_device *dev = cmd->se_dev; 179 struct se_device *dev = cmd->se_dev;
178 struct se_subsystem_dev *su_dev = dev->se_sub_dev; 180 struct se_subsystem_dev *su_dev = dev->se_sub_dev;
179 struct se_port *port, *l_port = cmd->se_lun->lun_sep; 181 struct se_port *port, *l_port = cmd->se_lun->lun_sep;
diff --git a/drivers/target/target_core_alua.h b/drivers/target/target_core_alua.h
index c86f97a081ed..c5b4ecd3e745 100644
--- a/drivers/target/target_core_alua.h
+++ b/drivers/target/target_core_alua.h
@@ -66,8 +66,8 @@ extern struct kmem_cache *t10_alua_lu_gp_mem_cache;
66extern struct kmem_cache *t10_alua_tg_pt_gp_cache; 66extern struct kmem_cache *t10_alua_tg_pt_gp_cache;
67extern struct kmem_cache *t10_alua_tg_pt_gp_mem_cache; 67extern struct kmem_cache *t10_alua_tg_pt_gp_mem_cache;
68 68
69extern int core_emulate_report_target_port_groups(struct se_cmd *); 69extern int target_emulate_report_target_port_groups(struct se_task *);
70extern int core_emulate_set_target_port_groups(struct se_cmd *); 70extern int target_emulate_set_target_port_groups(struct se_task *);
71extern int core_alua_check_nonop_delay(struct se_cmd *); 71extern int core_alua_check_nonop_delay(struct se_cmd *);
72extern int core_alua_do_port_transition(struct t10_alua_tg_pt_gp *, 72extern int core_alua_do_port_transition(struct t10_alua_tg_pt_gp *,
73 struct se_device *, struct se_port *, 73 struct se_device *, struct se_port *,
diff --git a/drivers/target/target_core_device.c b/drivers/target/target_core_device.c
index f870c3bcfd82..ffbb1d6532e9 100644
--- a/drivers/target/target_core_device.c
+++ b/drivers/target/target_core_device.c
@@ -651,23 +651,15 @@ void core_dev_unexport(
651 lun->lun_se_dev = NULL; 651 lun->lun_se_dev = NULL;
652} 652}
653 653
654int transport_core_report_lun_response(struct se_cmd *se_cmd) 654int target_report_luns(struct se_task *se_task)
655{ 655{
656 struct se_cmd *se_cmd = se_task->task_se_cmd;
656 struct se_dev_entry *deve; 657 struct se_dev_entry *deve;
657 struct se_lun *se_lun; 658 struct se_lun *se_lun;
658 struct se_session *se_sess = se_cmd->se_sess; 659 struct se_session *se_sess = se_cmd->se_sess;
659 struct se_task *se_task;
660 unsigned char *buf; 660 unsigned char *buf;
661 u32 cdb_offset = 0, lun_count = 0, offset = 8, i; 661 u32 cdb_offset = 0, lun_count = 0, offset = 8, i;
662 662
663 list_for_each_entry(se_task, &se_cmd->t_task_list, t_list)
664 break;
665
666 if (!se_task) {
667 pr_err("Unable to locate struct se_task for struct se_cmd\n");
668 return PYX_TRANSPORT_LU_COMM_FAILURE;
669 }
670
671 buf = transport_kmap_first_data_page(se_cmd); 663 buf = transport_kmap_first_data_page(se_cmd);
672 664
673 /* 665 /*
diff --git a/drivers/target/target_core_pr.c b/drivers/target/target_core_pr.c
index 34403e80b87c..09e1e3e896c6 100644
--- a/drivers/target/target_core_pr.c
+++ b/drivers/target/target_core_pr.c
@@ -198,8 +198,9 @@ static int target_check_scsi2_reservation_conflict(struct se_cmd *cmd, int *ret)
198 return false; 198 return false;
199} 199}
200 200
201int target_scsi2_reservation_release(struct se_cmd *cmd) 201int target_scsi2_reservation_release(struct se_task *task)
202{ 202{
203 struct se_cmd *cmd = task->task_se_cmd;
203 struct se_device *dev = cmd->se_dev; 204 struct se_device *dev = cmd->se_dev;
204 struct se_session *sess = cmd->se_sess; 205 struct se_session *sess = cmd->se_sess;
205 struct se_portal_group *tpg = sess->se_tpg; 206 struct se_portal_group *tpg = sess->se_tpg;
@@ -235,8 +236,9 @@ int target_scsi2_reservation_release(struct se_cmd *cmd)
235 return 0; 236 return 0;
236} 237}
237 238
238int target_scsi2_reservation_reserve(struct se_cmd *cmd) 239int target_scsi2_reservation_reserve(struct se_task *task)
239{ 240{
241 struct se_cmd *cmd = task->task_se_cmd;
240 struct se_device *dev = cmd->se_dev; 242 struct se_device *dev = cmd->se_dev;
241 struct se_session *sess = cmd->se_sess; 243 struct se_session *sess = cmd->se_sess;
242 struct se_portal_group *tpg = sess->se_tpg; 244 struct se_portal_group *tpg = sess->se_tpg;
@@ -3734,8 +3736,9 @@ static unsigned long long core_scsi3_extract_reservation_key(unsigned char *cdb)
3734/* 3736/*
3735 * See spc4r17 section 6.14 Table 170 3737 * See spc4r17 section 6.14 Table 170
3736 */ 3738 */
3737int target_scsi3_emulate_pr_out(struct se_cmd *cmd) 3739int target_scsi3_emulate_pr_out(struct se_task *task)
3738{ 3740{
3741 struct se_cmd *cmd = task->task_se_cmd;
3739 unsigned char *cdb = &cmd->t_task_cdb[0]; 3742 unsigned char *cdb = &cmd->t_task_cdb[0];
3740 unsigned char *buf; 3743 unsigned char *buf;
3741 u64 res_key, sa_res_key; 3744 u64 res_key, sa_res_key;
@@ -4203,8 +4206,10 @@ static int core_scsi3_pri_read_full_status(struct se_cmd *cmd)
4203 return 0; 4206 return 0;
4204} 4207}
4205 4208
4206int target_scsi3_emulate_pr_in(struct se_cmd *cmd) 4209int target_scsi3_emulate_pr_in(struct se_task *task)
4207{ 4210{
4211 struct se_cmd *cmd = task->task_se_cmd;
4212
4208 /* 4213 /*
4209 * Following spc2r20 5.5.1 Reservations overview: 4214 * Following spc2r20 5.5.1 Reservations overview:
4210 * 4215 *
diff --git a/drivers/target/target_core_pr.h b/drivers/target/target_core_pr.h
index c9acb1108124..b97f6940dd05 100644
--- a/drivers/target/target_core_pr.h
+++ b/drivers/target/target_core_pr.h
@@ -47,8 +47,8 @@ extern struct kmem_cache *t10_pr_reg_cache;
47 47
48extern int core_pr_dump_initiator_port(struct t10_pr_registration *, 48extern int core_pr_dump_initiator_port(struct t10_pr_registration *,
49 char *, u32); 49 char *, u32);
50extern int target_scsi2_reservation_release(struct se_cmd *cmd); 50extern int target_scsi2_reservation_release(struct se_task *task);
51extern int target_scsi2_reservation_reserve(struct se_cmd *cmd); 51extern int target_scsi2_reservation_reserve(struct se_task *task);
52extern int core_scsi3_alloc_aptpl_registration( 52extern int core_scsi3_alloc_aptpl_registration(
53 struct t10_reservation *, u64, 53 struct t10_reservation *, u64,
54 unsigned char *, unsigned char *, u32, 54 unsigned char *, unsigned char *, u32,
@@ -63,8 +63,8 @@ extern unsigned char *core_scsi3_pr_dump_type(int);
63extern int core_scsi3_check_cdb_abort_and_preempt(struct list_head *, 63extern int core_scsi3_check_cdb_abort_and_preempt(struct list_head *,
64 struct se_cmd *); 64 struct se_cmd *);
65 65
66extern int target_scsi3_emulate_pr_in(struct se_cmd *cmd); 66extern int target_scsi3_emulate_pr_in(struct se_task *task);
67extern int target_scsi3_emulate_pr_out(struct se_cmd *cmd); 67extern int target_scsi3_emulate_pr_out(struct se_task *task);
68extern int core_setup_reservations(struct se_device *, int); 68extern int core_setup_reservations(struct se_device *, int);
69 69
70#endif /* TARGET_CORE_PR_H */ 70#endif /* TARGET_CORE_PR_H */
diff --git a/drivers/target/target_core_transport.c b/drivers/target/target_core_transport.c
index 717f84a9b42b..3ad8db2d3ad3 100644
--- a/drivers/target/target_core_transport.c
+++ b/drivers/target/target_core_transport.c
@@ -2156,12 +2156,12 @@ check_depth:
2156 2156
2157 spin_unlock_irqrestore(&cmd->t_state_lock, flags); 2157 spin_unlock_irqrestore(&cmd->t_state_lock, flags);
2158 /* 2158 /*
2159 * The struct se_cmd->transport_emulate_cdb() function pointer is used 2159 * The struct se_cmd->execute_task() function pointer is used
2160 * to grab REPORT_LUNS and other CDBs we want to handle before they hit the 2160 * to grab REPORT_LUNS and other CDBs we want to handle before they hit the
2161 * struct se_subsystem_api->do_task() caller below. 2161 * struct se_subsystem_api->do_task() caller below.
2162 */ 2162 */
2163 if (cmd->transport_emulate_cdb) { 2163 if (cmd->execute_task) {
2164 error = cmd->transport_emulate_cdb(cmd); 2164 error = cmd->execute_task(task);
2165 if (error != 0) { 2165 if (error != 0) {
2166 cmd->transport_error_status = error; 2166 cmd->transport_error_status = error;
2167 spin_lock_irqsave(&cmd->t_state_lock, flags); 2167 spin_lock_irqsave(&cmd->t_state_lock, flags);
@@ -2174,7 +2174,7 @@ check_depth:
2174 goto check_depth; 2174 goto check_depth;
2175 } 2175 }
2176 /* 2176 /*
2177 * Handle the successful completion for transport_emulate_cdb() 2177 * Handle the successful completion for execute_task()
2178 * for synchronous operation, following SCF_EMULATE_CDB_ASYNC 2178 * for synchronous operation, following SCF_EMULATE_CDB_ASYNC
2179 * Otherwise the caller is expected to complete the task with 2179 * Otherwise the caller is expected to complete the task with
2180 * proper status. 2180 * proper status.
@@ -2795,12 +2795,10 @@ static int transport_generic_cmd_sequencer(
2795 /* 2795 /*
2796 * Check for emulated MI_REPORT_TARGET_PGS. 2796 * Check for emulated MI_REPORT_TARGET_PGS.
2797 */ 2797 */
2798 if (cdb[1] == MI_REPORT_TARGET_PGS) { 2798 if (cdb[1] == MI_REPORT_TARGET_PGS &&
2799 cmd->transport_emulate_cdb = 2799 su_dev->t10_alua.alua_type == SPC3_ALUA_EMULATED) {
2800 (su_dev->t10_alua.alua_type == 2800 cmd->execute_task =
2801 SPC3_ALUA_EMULATED) ? 2801 target_emulate_report_target_port_groups;
2802 core_emulate_report_target_port_groups :
2803 NULL;
2804 } 2802 }
2805 size = (cdb[6] << 24) | (cdb[7] << 16) | 2803 size = (cdb[6] << 24) | (cdb[7] << 16) |
2806 (cdb[8] << 8) | cdb[9]; 2804 (cdb[8] << 8) | cdb[9];
@@ -2843,13 +2841,13 @@ static int transport_generic_cmd_sequencer(
2843 break; 2841 break;
2844 case PERSISTENT_RESERVE_IN: 2842 case PERSISTENT_RESERVE_IN:
2845 if (su_dev->t10_pr.res_type == SPC3_PERSISTENT_RESERVATIONS) 2843 if (su_dev->t10_pr.res_type == SPC3_PERSISTENT_RESERVATIONS)
2846 cmd->transport_emulate_cdb = target_scsi3_emulate_pr_in; 2844 cmd->execute_task = target_scsi3_emulate_pr_in;
2847 size = (cdb[7] << 8) + cdb[8]; 2845 size = (cdb[7] << 8) + cdb[8];
2848 cmd->se_cmd_flags |= SCF_SCSI_CONTROL_SG_IO_CDB; 2846 cmd->se_cmd_flags |= SCF_SCSI_CONTROL_SG_IO_CDB;
2849 break; 2847 break;
2850 case PERSISTENT_RESERVE_OUT: 2848 case PERSISTENT_RESERVE_OUT:
2851 if (su_dev->t10_pr.res_type == SPC3_PERSISTENT_RESERVATIONS) 2849 if (su_dev->t10_pr.res_type == SPC3_PERSISTENT_RESERVATIONS)
2852 cmd->transport_emulate_cdb = target_scsi3_emulate_pr_out; 2850 cmd->execute_task = target_scsi3_emulate_pr_out;
2853 size = (cdb[7] << 8) + cdb[8]; 2851 size = (cdb[7] << 8) + cdb[8];
2854 cmd->se_cmd_flags |= SCF_SCSI_CONTROL_SG_IO_CDB; 2852 cmd->se_cmd_flags |= SCF_SCSI_CONTROL_SG_IO_CDB;
2855 break; 2853 break;
@@ -2868,12 +2866,10 @@ static int transport_generic_cmd_sequencer(
2868 * 2866 *
2869 * Check for emulated MO_SET_TARGET_PGS. 2867 * Check for emulated MO_SET_TARGET_PGS.
2870 */ 2868 */
2871 if (cdb[1] == MO_SET_TARGET_PGS) { 2869 if (cdb[1] == MO_SET_TARGET_PGS &&
2872 cmd->transport_emulate_cdb = 2870 su_dev->t10_alua.alua_type == SPC3_ALUA_EMULATED) {
2873 (su_dev->t10_alua.alua_type == 2871 cmd->execute_task =
2874 SPC3_ALUA_EMULATED) ? 2872 target_emulate_set_target_port_groups;
2875 core_emulate_set_target_port_groups :
2876 NULL;
2877 } 2873 }
2878 2874
2879 size = (cdb[6] << 24) | (cdb[7] << 16) | 2875 size = (cdb[6] << 24) | (cdb[7] << 16) |
@@ -2966,10 +2962,8 @@ static int transport_generic_cmd_sequencer(
2966 * is running in SPC_PASSTHROUGH, and wants reservations 2962 * is running in SPC_PASSTHROUGH, and wants reservations
2967 * emulation disabled. 2963 * emulation disabled.
2968 */ 2964 */
2969 if (su_dev->t10_pr.res_type != SPC_PASSTHROUGH) { 2965 if (su_dev->t10_pr.res_type != SPC_PASSTHROUGH)
2970 cmd->transport_emulate_cdb = 2966 cmd->execute_task = target_scsi2_reservation_reserve;
2971 target_scsi2_reservation_reserve;
2972 }
2973 cmd->se_cmd_flags |= SCF_SCSI_NON_DATA_CDB; 2967 cmd->se_cmd_flags |= SCF_SCSI_NON_DATA_CDB;
2974 break; 2968 break;
2975 case RELEASE: 2969 case RELEASE:
@@ -2983,10 +2977,8 @@ static int transport_generic_cmd_sequencer(
2983 else 2977 else
2984 size = cmd->data_length; 2978 size = cmd->data_length;
2985 2979
2986 if (su_dev->t10_pr.res_type != SPC_PASSTHROUGH) { 2980 if (su_dev->t10_pr.res_type != SPC_PASSTHROUGH)
2987 cmd->transport_emulate_cdb = 2981 cmd->execute_task = target_scsi2_reservation_release;
2988 target_scsi2_reservation_release;
2989 }
2990 cmd->se_cmd_flags |= SCF_SCSI_NON_DATA_CDB; 2982 cmd->se_cmd_flags |= SCF_SCSI_NON_DATA_CDB;
2991 break; 2983 break;
2992 case SYNCHRONIZE_CACHE: 2984 case SYNCHRONIZE_CACHE:
@@ -3007,9 +2999,6 @@ static int transport_generic_cmd_sequencer(
3007 size = transport_get_size(sectors, cdb, cmd); 2999 size = transport_get_size(sectors, cdb, cmd);
3008 cmd->se_cmd_flags |= SCF_SCSI_NON_DATA_CDB; 3000 cmd->se_cmd_flags |= SCF_SCSI_NON_DATA_CDB;
3009 3001
3010 /*
3011 * For TCM/pSCSI passthrough, skip cmd->transport_emulate_cdb()
3012 */
3013 if (dev->transport->transport_type == TRANSPORT_PLUGIN_PHBA_PDEV) 3002 if (dev->transport->transport_type == TRANSPORT_PLUGIN_PHBA_PDEV)
3014 break; 3003 break;
3015 /* 3004 /*
@@ -3086,8 +3075,7 @@ static int transport_generic_cmd_sequencer(
3086 cmd->se_cmd_flags |= SCF_SCSI_NON_DATA_CDB; 3075 cmd->se_cmd_flags |= SCF_SCSI_NON_DATA_CDB;
3087 break; 3076 break;
3088 case REPORT_LUNS: 3077 case REPORT_LUNS:
3089 cmd->transport_emulate_cdb = 3078 cmd->execute_task = target_report_luns;
3090 transport_core_report_lun_response;
3091 size = (cdb[6] << 24) | (cdb[7] << 16) | (cdb[8] << 8) | cdb[9]; 3079 size = (cdb[6] << 24) | (cdb[7] << 16) | (cdb[8] << 8) | cdb[9];
3092 /* 3080 /*
3093 * Do implict HEAD_OF_QUEUE processing for REPORT_LUNS 3081 * Do implict HEAD_OF_QUEUE processing for REPORT_LUNS