diff options
| -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 | ||||
| -rw-r--r-- | include/target/target_core_base.h | 2 | ||||
| -rw-r--r-- | include/target/target_core_device.h | 2 |
8 files changed, 42 insertions, 55 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 |
diff --git a/include/target/target_core_base.h b/include/target/target_core_base.h index dd245b68be5a..14c1a71a36eb 100644 --- a/include/target/target_core_base.h +++ b/include/target/target_core_base.h | |||
| @@ -457,7 +457,7 @@ struct se_cmd { | |||
| 457 | struct list_head se_cmd_list; | 457 | struct list_head se_cmd_list; |
| 458 | struct completion cmd_wait_comp; | 458 | struct completion cmd_wait_comp; |
| 459 | struct target_core_fabric_ops *se_tfo; | 459 | struct target_core_fabric_ops *se_tfo; |
| 460 | int (*transport_emulate_cdb)(struct se_cmd *); | 460 | int (*execute_task)(struct se_task *); |
| 461 | void (*transport_complete_callback)(struct se_cmd *); | 461 | void (*transport_complete_callback)(struct se_cmd *); |
| 462 | 462 | ||
| 463 | unsigned char *t_task_cdb; | 463 | unsigned char *t_task_cdb; |
diff --git a/include/target/target_core_device.h b/include/target/target_core_device.h index 46571912086c..2be31ff8763b 100644 --- a/include/target/target_core_device.h +++ b/include/target/target_core_device.h | |||
| @@ -17,7 +17,7 @@ extern int core_dev_export(struct se_device *, struct se_portal_group *, | |||
| 17 | struct se_lun *); | 17 | struct se_lun *); |
| 18 | extern void core_dev_unexport(struct se_device *, struct se_portal_group *, | 18 | extern void core_dev_unexport(struct se_device *, struct se_portal_group *, |
| 19 | struct se_lun *); | 19 | struct se_lun *); |
| 20 | extern int transport_core_report_lun_response(struct se_cmd *); | 20 | extern int target_report_luns(struct se_task *); |
| 21 | extern void se_release_device_for_hba(struct se_device *); | 21 | extern void se_release_device_for_hba(struct se_device *); |
| 22 | extern void se_release_vpd_for_dev(struct se_device *); | 22 | extern void se_release_vpd_for_dev(struct se_device *); |
| 23 | extern void se_clear_dev_ports(struct se_device *); | 23 | extern void se_clear_dev_ports(struct se_device *); |
