Skip to content

Commit 6aad373

Browse files
committed
Merge branch 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/nab/target-pending
* 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/nab/target-pending: target: use ->exectute_task for all CDB emulation target: remove SCF_EMULATE_CDB_ASYNC target: refactor transport_emulate_control_cdb target: pass the se_task to the CDB emulation callback target: split core_scsi3_emulate_pr target: split core_scsi2_emulate_crh target: Add generic active I/O shutdown logic target: add back error handling in transport_complete_task target/pscsi: blk_make_request() returns an ERR_PTR() target: Remove core TRANSPORT_FREE_CMD_INTR usage target: Make TFO->check_stop_free return free status iscsi-target: Fix non-immediate TMR handling iscsi-target: Add missing CMDSN_LOWER_THAN_EXP check in iscsit_handle_scsi_cmd target: Avoid double list_del for aborted se_tmr_req target: Minor cleanups to core_tmr_drain_tmr_list target: Fix wrong se_tmr being added to drain_tmr_list target: Fix incorrect se_cmd assignment in core_tmr_drain_tmr_list target: Check -ENOMEM to signal QUEUE_FULL from fabric callbacks tcm_loop: Add explict read buffer memset for SCF_SCSI_CONTROL_SG_IO_CDB target: Fix compile warning w/ missing module.h include
2 parents 02ebbbd + 5bda90c commit 6aad373

18 files changed

+629
-475
lines changed

drivers/target/iscsi/iscsi_target.c

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1079,7 +1079,9 @@ static int iscsit_handle_scsi_cmd(
10791079
*/
10801080
if (!cmd->immediate_data) {
10811081
cmdsn_ret = iscsit_sequence_cmd(conn, cmd, hdr->cmdsn);
1082-
if (cmdsn_ret == CMDSN_ERROR_CANNOT_RECOVER)
1082+
if (cmdsn_ret == CMDSN_LOWER_THAN_EXP)
1083+
return 0;
1084+
else if (cmdsn_ret == CMDSN_ERROR_CANNOT_RECOVER)
10831085
return iscsit_add_reject_from_cmd(
10841086
ISCSI_REASON_PROTOCOL_ERROR,
10851087
1, 0, buf, cmd);
@@ -1819,17 +1821,16 @@ static int iscsit_handle_task_mgt_cmd(
18191821
int cmdsn_ret = iscsit_sequence_cmd(conn, cmd, hdr->cmdsn);
18201822
if (cmdsn_ret == CMDSN_HIGHER_THAN_EXP)
18211823
out_of_order_cmdsn = 1;
1822-
else if (cmdsn_ret == CMDSN_LOWER_THAN_EXP) {
1824+
else if (cmdsn_ret == CMDSN_LOWER_THAN_EXP)
18231825
return 0;
1824-
} else { /* (cmdsn_ret == CMDSN_ERROR_CANNOT_RECOVER) */
1826+
else if (cmdsn_ret == CMDSN_ERROR_CANNOT_RECOVER)
18251827
return iscsit_add_reject_from_cmd(
18261828
ISCSI_REASON_PROTOCOL_ERROR,
18271829
1, 0, buf, cmd);
1828-
}
18291830
}
18301831
iscsit_ack_from_expstatsn(conn, hdr->exp_statsn);
18311832

1832-
if (out_of_order_cmdsn)
1833+
if (out_of_order_cmdsn || !(hdr->opcode & ISCSI_OP_IMMEDIATE))
18331834
return 0;
18341835
/*
18351836
* Found the referenced task, send to transport for processing.

drivers/target/loopback/tcm_loop.c

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,24 @@ static int tcm_loop_new_cmd_map(struct se_cmd *se_cmd)
174174
sgl_bidi = sdb->table.sgl;
175175
sgl_bidi_count = sdb->table.nents;
176176
}
177+
/*
178+
* Because some userspace code via scsi-generic do not memset their
179+
* associated read buffers, go ahead and do that here for type
180+
* SCF_SCSI_CONTROL_SG_IO_CDB. Also note that this is currently
181+
* guaranteed to be a single SGL for SCF_SCSI_CONTROL_SG_IO_CDB
182+
* by target core in transport_generic_allocate_tasks() ->
183+
* transport_generic_cmd_sequencer().
184+
*/
185+
if (se_cmd->se_cmd_flags & SCF_SCSI_CONTROL_SG_IO_CDB &&
186+
se_cmd->data_direction == DMA_FROM_DEVICE) {
187+
struct scatterlist *sg = scsi_sglist(sc);
188+
unsigned char *buf = kmap(sg_page(sg)) + sg->offset;
189+
190+
if (buf != NULL) {
191+
memset(buf, 0, sg->length);
192+
kunmap(sg_page(sg));
193+
}
194+
}
177195

178196
/* Tell the core about our preallocated memory */
179197
ret = transport_generic_map_mem_to_cmd(se_cmd, scsi_sglist(sc),
@@ -187,20 +205,21 @@ static int tcm_loop_new_cmd_map(struct se_cmd *se_cmd)
187205
/*
188206
* Called from struct target_core_fabric_ops->check_stop_free()
189207
*/
190-
static void tcm_loop_check_stop_free(struct se_cmd *se_cmd)
208+
static int tcm_loop_check_stop_free(struct se_cmd *se_cmd)
191209
{
192210
/*
193211
* Do not release struct se_cmd's containing a valid TMR
194212
* pointer. These will be released directly in tcm_loop_device_reset()
195213
* with transport_generic_free_cmd().
196214
*/
197215
if (se_cmd->se_tmr_req)
198-
return;
216+
return 0;
199217
/*
200218
* Release the struct se_cmd, which will make a callback to release
201219
* struct tcm_loop_cmd * in tcm_loop_deallocate_core_cmd()
202220
*/
203221
transport_generic_free_cmd(se_cmd, 0);
222+
return 1;
204223
}
205224

206225
static void tcm_loop_release_cmd(struct se_cmd *se_cmd)

drivers/target/target_core_alua.c

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -58,8 +58,9 @@ struct t10_alua_lu_gp *default_lu_gp;
5858
*
5959
* See spc4r17 section 6.27
6060
*/
61-
int core_emulate_report_target_port_groups(struct se_cmd *cmd)
61+
int target_emulate_report_target_port_groups(struct se_task *task)
6262
{
63+
struct se_cmd *cmd = task->task_se_cmd;
6364
struct se_subsystem_dev *su_dev = cmd->se_dev->se_sub_dev;
6465
struct se_port *port;
6566
struct t10_alua_tg_pt_gp *tg_pt_gp;
@@ -164,6 +165,8 @@ int core_emulate_report_target_port_groups(struct se_cmd *cmd)
164165

165166
transport_kunmap_first_data_page(cmd);
166167

168+
task->task_scsi_status = GOOD;
169+
transport_complete_task(task, 1);
167170
return 0;
168171
}
169172

@@ -172,8 +175,9 @@ int core_emulate_report_target_port_groups(struct se_cmd *cmd)
172175
*
173176
* See spc4r17 section 6.35
174177
*/
175-
int core_emulate_set_target_port_groups(struct se_cmd *cmd)
178+
int target_emulate_set_target_port_groups(struct se_task *task)
176179
{
180+
struct se_cmd *cmd = task->task_se_cmd;
177181
struct se_device *dev = cmd->se_dev;
178182
struct se_subsystem_dev *su_dev = dev->se_sub_dev;
179183
struct se_port *port, *l_port = cmd->se_lun->lun_sep;
@@ -341,7 +345,8 @@ int core_emulate_set_target_port_groups(struct se_cmd *cmd)
341345

342346
out:
343347
transport_kunmap_first_data_page(cmd);
344-
348+
task->task_scsi_status = GOOD;
349+
transport_complete_task(task, 1);
345350
return 0;
346351
}
347352

drivers/target/target_core_alua.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,8 +66,8 @@ extern struct kmem_cache *t10_alua_lu_gp_mem_cache;
6666
extern struct kmem_cache *t10_alua_tg_pt_gp_cache;
6767
extern struct kmem_cache *t10_alua_tg_pt_gp_mem_cache;
6868

69-
extern int core_emulate_report_target_port_groups(struct se_cmd *);
70-
extern int core_emulate_set_target_port_groups(struct se_cmd *);
69+
extern int target_emulate_report_target_port_groups(struct se_task *);
70+
extern int target_emulate_set_target_port_groups(struct se_task *);
7171
extern int core_alua_check_nonop_delay(struct se_cmd *);
7272
extern int core_alua_do_port_transition(struct t10_alua_tg_pt_gp *,
7373
struct se_device *, struct se_port *,

0 commit comments

Comments
 (0)