diff options
author | Christoph Hellwig <hch@infradead.org> | 2011-11-03 17:50:42 -0400 |
---|---|---|
committer | Nicholas Bellinger <nab@linux-iscsi.org> | 2011-11-04 04:00:17 -0400 |
commit | e76a35d6c809bd1638e3b1b535bb780ac731c380 (patch) | |
tree | a67bbbbc16cb4e612015da8b0f86fe981d1a5f77 /drivers | |
parent | 617c0e06c1b30b799d8b25f92eefdc1b098cb9f8 (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.c | 6 | ||||
-rw-r--r-- | drivers/target/target_core_alua.h | 4 | ||||
-rw-r--r-- | drivers/target/target_core_device.c | 12 | ||||
-rw-r--r-- | drivers/target/target_core_pr.c | 13 | ||||
-rw-r--r-- | drivers/target/target_core_pr.h | 8 | ||||
-rw-r--r-- | drivers/target/target_core_transport.c | 50 |
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 | */ |
61 | int core_emulate_report_target_port_groups(struct se_cmd *cmd) | 61 | int 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 | */ |
175 | int core_emulate_set_target_port_groups(struct se_cmd *cmd) | 176 | int 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; | |||
66 | extern struct kmem_cache *t10_alua_tg_pt_gp_cache; | 66 | extern struct kmem_cache *t10_alua_tg_pt_gp_cache; |
67 | extern struct kmem_cache *t10_alua_tg_pt_gp_mem_cache; | 67 | extern struct kmem_cache *t10_alua_tg_pt_gp_mem_cache; |
68 | 68 | ||
69 | extern int core_emulate_report_target_port_groups(struct se_cmd *); | 69 | extern int target_emulate_report_target_port_groups(struct se_task *); |
70 | extern int core_emulate_set_target_port_groups(struct se_cmd *); | 70 | extern int target_emulate_set_target_port_groups(struct se_task *); |
71 | extern int core_alua_check_nonop_delay(struct se_cmd *); | 71 | extern int core_alua_check_nonop_delay(struct se_cmd *); |
72 | extern int core_alua_do_port_transition(struct t10_alua_tg_pt_gp *, | 72 | extern 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 | ||
654 | int transport_core_report_lun_response(struct se_cmd *se_cmd) | 654 | int 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 | ||
201 | int target_scsi2_reservation_release(struct se_cmd *cmd) | 201 | int 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 | ||
238 | int target_scsi2_reservation_reserve(struct se_cmd *cmd) | 239 | int 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 | */ |
3737 | int target_scsi3_emulate_pr_out(struct se_cmd *cmd) | 3739 | int 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 | ||
4206 | int target_scsi3_emulate_pr_in(struct se_cmd *cmd) | 4209 | int 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 | ||
48 | extern int core_pr_dump_initiator_port(struct t10_pr_registration *, | 48 | extern int core_pr_dump_initiator_port(struct t10_pr_registration *, |
49 | char *, u32); | 49 | char *, u32); |
50 | extern int target_scsi2_reservation_release(struct se_cmd *cmd); | 50 | extern int target_scsi2_reservation_release(struct se_task *task); |
51 | extern int target_scsi2_reservation_reserve(struct se_cmd *cmd); | 51 | extern int target_scsi2_reservation_reserve(struct se_task *task); |
52 | extern int core_scsi3_alloc_aptpl_registration( | 52 | extern 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); | |||
63 | extern int core_scsi3_check_cdb_abort_and_preempt(struct list_head *, | 63 | extern int core_scsi3_check_cdb_abort_and_preempt(struct list_head *, |
64 | struct se_cmd *); | 64 | struct se_cmd *); |
65 | 65 | ||
66 | extern int target_scsi3_emulate_pr_in(struct se_cmd *cmd); | 66 | extern int target_scsi3_emulate_pr_in(struct se_task *task); |
67 | extern int target_scsi3_emulate_pr_out(struct se_cmd *cmd); | 67 | extern int target_scsi3_emulate_pr_out(struct se_task *task); |
68 | extern int core_setup_reservations(struct se_device *, int); | 68 | extern 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 |