Merge of a safer version of r870:

Fixes possible miss of UCMD_STATE_ON_FREEING event found by Erez Zilber <erezzi.list@gmail.com> + some cleanups



git-svn-id: http://svn.code.sf.net/p/scst/svn/branches/1.0.1.x@871 d57e44dd-8a1f-0410-8b47-8ef2f437770f
This commit is contained in:
Vladislav Bolkhovitin
2009-05-20 17:24:13 +00:00
parent 7d98723641
commit 17bd236720

View File

@@ -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);