target: stop task timers earlier

Currently we stop the timers for all tasks in a command fairly late during
I/O completion, which is fairly pointless and requires all kinds of safety
checks.

Instead delete pending timers early on in transport_complete_task, thus
ensuring no new timers firest after that.  We take t_state_lock a bit later
in that function thus making sure currenly running timers are out of the
criticial section.  To be completely sure the timer has finished we also
add another del_timer_sync call when freeing the task.

This also allows removing TF_TIMER_RUNNING as it would be equivalent
to TF_ACTIVE now.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
This commit is contained in:
Christoph Hellwig
2011-10-17 13:56:48 -04:00
committed by Nicholas Bellinger
parent e99d48a62b
commit cc5d0f0f61
3 changed files with 14 additions and 52 deletions
-1
View File
@@ -77,7 +77,6 @@ enum se_task_flags {
TF_SENT = (1 << 1),
TF_TIMEOUT = (1 << 2),
TF_REQUEST_STOP = (1 << 3),
TF_TIMER_RUNNING = (1 << 4),
};
/* Special transport agnostic struct se_cmd->t_states */
-1
View File
@@ -172,7 +172,6 @@ extern void transport_new_cmd_failure(struct se_cmd *);
extern int transport_generic_handle_tmr(struct se_cmd *);
extern void transport_generic_free_cmd_intr(struct se_cmd *);
extern bool target_stop_task(struct se_task *task, unsigned long *flags);
extern void __transport_stop_task_timer(struct se_task *, unsigned long *);
extern int transport_generic_map_mem_to_cmd(struct se_cmd *cmd, struct scatterlist *, u32,
struct scatterlist *, u32);
extern int transport_clear_lun_from_sessions(struct se_lun *);