target/tcm_loop: Replace a waitqueue and a counter by a completion

This patch simplifies the implementation of the tcm_loop driver
but does not change its behavior.

Signed-off-by: Bart Van Assche <bart.vanassche@sandisk.com>
Cc: Christoph Hellwig <hch@lst.de>
Cc: Hannes Reinecke <hare@suse.com>
Cc: David Disseldorp <ddiss@suse.de>
Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
This commit is contained in:
Bart Van Assche 2017-05-23 16:48:40 -07:00 коммит произвёл Nicholas Bellinger
Родитель 4d3895d5ea
Коммит d17203c411
2 изменённых файлов: 5 добавлений и 10 удалений

Просмотреть файл

@ -239,7 +239,7 @@ static int tcm_loop_issue_tmr(struct tcm_loop_tpg *tl_tpg,
return ret; return ret;
} }
init_waitqueue_head(&tl_cmd->tl_tmr_wait); init_completion(&tl_cmd->tmr_done);
se_cmd = &tl_cmd->tl_se_cmd; se_cmd = &tl_cmd->tl_se_cmd;
se_tpg = &tl_tpg->tl_se_tpg; se_tpg = &tl_tpg->tl_se_tpg;
@ -270,7 +270,7 @@ static int tcm_loop_issue_tmr(struct tcm_loop_tpg *tl_tpg,
* tcm_loop_queue_tm_rsp() to wake us up. * tcm_loop_queue_tm_rsp() to wake us up.
*/ */
transport_generic_handle_tmr(se_cmd); transport_generic_handle_tmr(se_cmd);
wait_event(tl_cmd->tl_tmr_wait, atomic_read(&tl_cmd->tmr_complete)); wait_for_completion(&tl_cmd->tmr_done);
/* /*
* The TMR LUN_RESET has completed, check the response status and * The TMR LUN_RESET has completed, check the response status and
* then release allocations. * then release allocations.
@ -665,12 +665,8 @@ static void tcm_loop_queue_tm_rsp(struct se_cmd *se_cmd)
struct tcm_loop_cmd *tl_cmd = container_of(se_cmd, struct tcm_loop_cmd *tl_cmd = container_of(se_cmd,
struct tcm_loop_cmd, tl_se_cmd); struct tcm_loop_cmd, tl_se_cmd);
/* /* Wake up tcm_loop_issue_tmr(). */
* The SCSI EH thread will be sleeping on se_tmr->tl_tmr_wait, go ahead complete(&tl_cmd->tmr_done);
* and wake up the wait_queue_head_t in tcm_loop_device_reset()
*/
atomic_set(&tl_cmd->tmr_complete, 1);
wake_up(&tl_cmd->tl_tmr_wait);
} }
static void tcm_loop_aborted_task(struct se_cmd *se_cmd) static void tcm_loop_aborted_task(struct se_cmd *se_cmd)

Просмотреть файл

@ -16,8 +16,7 @@ struct tcm_loop_cmd {
/* The TCM I/O descriptor that is accessed via container_of() */ /* The TCM I/O descriptor that is accessed via container_of() */
struct se_cmd tl_se_cmd; struct se_cmd tl_se_cmd;
struct work_struct work; struct work_struct work;
atomic_t tmr_complete; struct completion tmr_done;
wait_queue_head_t tl_tmr_wait;
/* Sense buffer that will be mapped into outgoing status */ /* Sense buffer that will be mapped into outgoing status */
unsigned char tl_sense_buf[TRANSPORT_SENSE_BUFFER]; unsigned char tl_sense_buf[TRANSPORT_SENSE_BUFFER];
}; };