diff --git a/scst/src/dev_handlers/scst_user.c b/scst/src/dev_handlers/scst_user.c index 3b80618b1..5787a5dde 100644 --- a/scst/src/dev_handlers/scst_user.c +++ b/scst/src/dev_handlers/scst_user.c @@ -1021,12 +1021,10 @@ static void dev_user_add_to_ready(struct scst_user_cmd *ucmd) { struct scst_user_dev *dev = ucmd->dev; unsigned long flags; - int do_wake; + int do_wake = in_interrupt(); TRACE_ENTRY(); - do_wake = (in_interrupt() || - (ucmd->state == UCMD_STATE_ON_CACHE_FREEING)); if (ucmd->cmd) do_wake |= ucmd->cmd->preprocessing_only; @@ -1058,14 +1056,20 @@ static void dev_user_add_to_ready(struct scst_user_cmd *ucmd) list_add(&ucmd->ready_cmd_list_entry, &dev->ready_cmd_list); do_wake = 1; - } else if ((ucmd->cmd != NULL) && - unlikely((ucmd->cmd->queue_type == SCST_CMD_QUEUE_HEAD_OF_QUEUE))) { - TRACE_DBG("Adding HQ ucmd %p to head of ready cmd list", ucmd); - list_add(&ucmd->ready_cmd_list_entry, &dev->ready_cmd_list); } else { - TRACE_DBG("Adding ucmd %p to ready cmd list", ucmd); - list_add_tail(&ucmd->ready_cmd_list_entry, - &dev->ready_cmd_list); + if ((ucmd->cmd != NULL) && + unlikely((ucmd->cmd->queue_type == SCST_CMD_QUEUE_HEAD_OF_QUEUE))) { + TRACE_DBG("Adding HQ ucmd %p to head of ready cmd list", + ucmd); + list_add(&ucmd->ready_cmd_list_entry, + &dev->ready_cmd_list); + } else { + TRACE_DBG("Adding ucmd %p to ready cmd list", ucmd); + list_add_tail(&ucmd->ready_cmd_list_entry, + &dev->ready_cmd_list); + } + do_wake |= ((ucmd->state == UCMD_STATE_ON_CACHE_FREEING) || + (ucmd->state == UCMD_STATE_ON_FREEING)); } if (do_wake) { @@ -2094,7 +2098,6 @@ static void dev_user_unjam_cmd(struct scst_user_cmd *ucmd, int busy, case UCMD_STATE_TM_EXECING: case UCMD_STATE_ATTACH_SESS: case UCMD_STATE_DETACH_SESS: - { if (flags != NULL) spin_unlock_irqrestore(&dev->cmd_lists.cmd_list_lock, *flags); @@ -2127,7 +2130,6 @@ static void dev_user_unjam_cmd(struct scst_user_cmd *ucmd, int busy, else spin_lock_irq(&dev->cmd_lists.cmd_list_lock); break; - } default: PRINT_CRIT_ERROR("Wrong ucmd state %x", state);