Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e76a35d6 authored by Christoph Hellwig's avatar Christoph Hellwig Committed by Nicholas Bellinger
Browse files

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: default avatarChristoph Hellwig <hch@lst.de>
Signed-off-by: default avatarNicholas Bellinger <nab@linux-iscsi.org>
parent 617c0e06
Loading
Loading
Loading
Loading
+4 −2
Original line number Diff line number Diff line
@@ -58,8 +58,9 @@ struct t10_alua_lu_gp *default_lu_gp;
 *
 * See spc4r17 section 6.27
 */
int core_emulate_report_target_port_groups(struct se_cmd *cmd)
int target_emulate_report_target_port_groups(struct se_task *task)
{
	struct se_cmd *cmd = task->task_se_cmd;
	struct se_subsystem_dev *su_dev = cmd->se_dev->se_sub_dev;
	struct se_port *port;
	struct t10_alua_tg_pt_gp *tg_pt_gp;
@@ -172,8 +173,9 @@ int core_emulate_report_target_port_groups(struct se_cmd *cmd)
 *
 * See spc4r17 section 6.35
 */
int core_emulate_set_target_port_groups(struct se_cmd *cmd)
int target_emulate_set_target_port_groups(struct se_task *task)
{
	struct se_cmd *cmd = task->task_se_cmd;
	struct se_device *dev = cmd->se_dev;
	struct se_subsystem_dev *su_dev = dev->se_sub_dev;
	struct se_port *port, *l_port = cmd->se_lun->lun_sep;
+2 −2
Original line number Diff line number Diff line
@@ -66,8 +66,8 @@ extern struct kmem_cache *t10_alua_lu_gp_mem_cache;
extern struct kmem_cache *t10_alua_tg_pt_gp_cache;
extern struct kmem_cache *t10_alua_tg_pt_gp_mem_cache;

extern int core_emulate_report_target_port_groups(struct se_cmd *);
extern int core_emulate_set_target_port_groups(struct se_cmd *);
extern int target_emulate_report_target_port_groups(struct se_task *);
extern int target_emulate_set_target_port_groups(struct se_task *);
extern int core_alua_check_nonop_delay(struct se_cmd *);
extern int core_alua_do_port_transition(struct t10_alua_tg_pt_gp *,
				struct se_device *, struct se_port *,
+2 −10
Original line number Diff line number Diff line
@@ -651,23 +651,15 @@ void core_dev_unexport(
	lun->lun_se_dev = NULL;
}

int transport_core_report_lun_response(struct se_cmd *se_cmd)
int target_report_luns(struct se_task *se_task)
{
	struct se_cmd *se_cmd = se_task->task_se_cmd;
	struct se_dev_entry *deve;
	struct se_lun *se_lun;
	struct se_session *se_sess = se_cmd->se_sess;
	struct se_task *se_task;
	unsigned char *buf;
	u32 cdb_offset = 0, lun_count = 0, offset = 8, i;

	list_for_each_entry(se_task, &se_cmd->t_task_list, t_list)
		break;

	if (!se_task) {
		pr_err("Unable to locate struct se_task for struct se_cmd\n");
		return PYX_TRANSPORT_LU_COMM_FAILURE;
	}

	buf = transport_kmap_first_data_page(se_cmd);

	/*
+9 −4
Original line number Diff line number Diff line
@@ -198,8 +198,9 @@ static int target_check_scsi2_reservation_conflict(struct se_cmd *cmd, int *ret)
	return false;
}

int target_scsi2_reservation_release(struct se_cmd *cmd)
int target_scsi2_reservation_release(struct se_task *task)
{
	struct se_cmd *cmd = task->task_se_cmd;
	struct se_device *dev = cmd->se_dev;
	struct se_session *sess = cmd->se_sess;
	struct se_portal_group *tpg = sess->se_tpg;
@@ -235,8 +236,9 @@ int target_scsi2_reservation_release(struct se_cmd *cmd)
	return 0;
}

int target_scsi2_reservation_reserve(struct se_cmd *cmd)
int target_scsi2_reservation_reserve(struct se_task *task)
{
	struct se_cmd *cmd = task->task_se_cmd;
	struct se_device *dev = cmd->se_dev;
	struct se_session *sess = cmd->se_sess;
	struct se_portal_group *tpg = sess->se_tpg;
@@ -3734,8 +3736,9 @@ static unsigned long long core_scsi3_extract_reservation_key(unsigned char *cdb)
/*
 * See spc4r17 section 6.14 Table 170
 */
int target_scsi3_emulate_pr_out(struct se_cmd *cmd)
int target_scsi3_emulate_pr_out(struct se_task *task)
{
	struct se_cmd *cmd = task->task_se_cmd;
	unsigned char *cdb = &cmd->t_task_cdb[0];
	unsigned char *buf;
	u64 res_key, sa_res_key;
@@ -4203,8 +4206,10 @@ static int core_scsi3_pri_read_full_status(struct se_cmd *cmd)
	return 0;
}

int target_scsi3_emulate_pr_in(struct se_cmd *cmd)
int target_scsi3_emulate_pr_in(struct se_task *task)
{
	struct se_cmd *cmd = task->task_se_cmd;

	/*
	 * Following spc2r20 5.5.1 Reservations overview:
	 *
+4 −4
Original line number Diff line number Diff line
@@ -47,8 +47,8 @@ extern struct kmem_cache *t10_pr_reg_cache;

extern int core_pr_dump_initiator_port(struct t10_pr_registration *,
			char *, u32);
extern int target_scsi2_reservation_release(struct se_cmd *cmd);
extern int target_scsi2_reservation_reserve(struct se_cmd *cmd);
extern int target_scsi2_reservation_release(struct se_task *task);
extern int target_scsi2_reservation_reserve(struct se_task *task);
extern int core_scsi3_alloc_aptpl_registration(
			struct t10_reservation *, u64,
			unsigned char *, unsigned char *, u32,
@@ -63,8 +63,8 @@ extern unsigned char *core_scsi3_pr_dump_type(int);
extern int core_scsi3_check_cdb_abort_and_preempt(struct list_head *,
						  struct se_cmd *);

extern int target_scsi3_emulate_pr_in(struct se_cmd *cmd);
extern int target_scsi3_emulate_pr_out(struct se_cmd *cmd);
extern int target_scsi3_emulate_pr_in(struct se_task *task);
extern int target_scsi3_emulate_pr_out(struct se_task *task);
extern int core_setup_reservations(struct se_device *, int);

#endif /* TARGET_CORE_PR_H */
Loading