diff options
author | Bart Van Assche <bart.vanassche@sandisk.com> | 2017-01-09 10:14:54 -0800 |
---|---|---|
committer | Nicholas Bellinger <nab@linux-iscsi.org> | 2017-02-09 00:39:12 -0800 |
commit | a5eb307f37d1e9909284b6f0a8f72bf55423c137 (patch) | |
tree | f4051d2d6831f2fd98d7bc5906dd4a74e2d1e689 /drivers/target | |
parent | 2d4760ee4720d5f0eeda770ce248244166676283 (diff) | |
download | linux-a5eb307f37d1e9909284b6f0a8f72bf55423c137.tar.bz2 |
target: Stop execution if CMD_T_STOP has been set
Stop execution if CMD_T_STOP has been set for a command just after
the command has been added to the device command list and before
.write_pending() is called. The following sequence can trigger this:
- transport_handle_cdb_direct() gets called. This function namely
sets CMD_T_ACTIVE before it calls transport_generic_new_cmd().
- __transport_wait_for_tasks() is called concurrently. This function
sets CMD_T_STOP for all active commands that have not been aborted.
Signed-off-by: Bart Van Assche <bart.vanassche@sandisk.com>
Reviewed-by: Hannes Reinecke <hare@suse.com>
Cc: Christoph Hellwig <hch@lst.de>
Cc: Andy Grover <agrover@redhat.com>
Cc: David Disseldorp <ddiss@suse.de>
Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
Diffstat (limited to 'drivers/target')
-rw-r--r-- | drivers/target/target_core_transport.c | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/drivers/target/target_core_transport.c b/drivers/target/target_core_transport.c index 62a50ea52a49..2d867af1961f 100644 --- a/drivers/target/target_core_transport.c +++ b/drivers/target/target_core_transport.c @@ -2452,7 +2452,8 @@ transport_generic_new_cmd(struct se_cmd *cmd) target_execute_cmd(cmd); return 0; } - transport_cmd_check_stop(cmd, false, true); + if (transport_cmd_check_stop(cmd, false, true)) + return 0; ret = cmd->se_tfo->write_pending(cmd); if (ret == -EAGAIN || ret == -ENOMEM) |