target: Fix quiese during transport_write_pending_qf endless loop
This patch fixes a potential end-less loop during QUEUE_FULL, where cmd->se_tfo->write_pending() callback fails repeatedly but __transport_wait_for_tasks() has already been invoked to quiese the outstanding se_cmd descriptor. To address this bug, this patch adds a CMD_T_STOP|CMD_T_ABORTED check within transport_write_pending_qf() and invokes the existing se_cmd->t_transport_stop_comp to signal quiese completion back to __transport_wait_for_tasks(). Cc: Mike Christie <mchristi@redhat.com> Cc: Hannes Reinecke <hare@suse.com> Cc: Bryant G. Ly <bryantly@linux.vnet.ibm.com> Cc: Michael Cyr <mikecyr@linux.vnet.ibm.com> Cc: Potnuri Bharat Teja <bharat@chelsio.com> Cc: Sagi Grimberg <sagi@grimberg.me> Cc: stable@vger.kernel.org # 4.11+ Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
This commit is contained in:
Родитель
fd2f928b0d
Коммит
9574a497df
|
@ -2560,7 +2560,20 @@ EXPORT_SYMBOL(transport_generic_new_cmd);
|
|||
|
||||
static void transport_write_pending_qf(struct se_cmd *cmd)
|
||||
{
|
||||
unsigned long flags;
|
||||
int ret;
|
||||
bool stop;
|
||||
|
||||
spin_lock_irqsave(&cmd->t_state_lock, flags);
|
||||
stop = (cmd->transport_state & (CMD_T_STOP | CMD_T_ABORTED));
|
||||
spin_unlock_irqrestore(&cmd->t_state_lock, flags);
|
||||
|
||||
if (stop) {
|
||||
pr_debug("%s:%d CMD_T_STOP|CMD_T_ABORTED for ITT: 0x%08llx\n",
|
||||
__func__, __LINE__, cmd->tag);
|
||||
complete_all(&cmd->t_transport_stop_comp);
|
||||
return;
|
||||
}
|
||||
|
||||
ret = cmd->se_tfo->write_pending(cmd);
|
||||
if (ret) {
|
||||
|
|
Загрузка…
Ссылка в новой задаче