{0x02, "VVVVVV V ", "REQUEST BLOCK ADDR",
SCST_DATA_NONE, SCST_SMALL_TIMEOUT, 0, get_trans_len_none},
{0x03, "MMMMMMMMMMMMMMMM", "REQUEST SENSE",
- SCST_DATA_READ, SCST_SMALL_TIMEOUT|SCST_SKIP_UA|SCST_LOCAL_EXEC_NEEDED,
+ SCST_DATA_READ, SCST_SMALL_TIMEOUT|SCST_SKIP_UA|SCST_LOCAL_CMD,
4, get_trans_len_1},
{0x04, "M O O ", "FORMAT UNIT",
SCST_DATA_WRITE, SCST_LONG_TIMEOUT|SCST_UNKNOWN_LENGTH|SCST_WRITE_MEDIUM,
{0x14, "VOOVVV ", "RECOVER BUFFERED DATA",
SCST_DATA_READ, SCST_TRANSFER_LEN_TYPE_FIXED, 2, get_trans_len_3},
{0x15, "OMOOOOOOOOOOOOOO", "MODE SELECT(6)",
- SCST_DATA_WRITE, SCST_LOCAL_EXEC_NEEDED, 4, get_trans_len_1},
+ SCST_DATA_WRITE, SCST_LOCAL_CMD, 4, get_trans_len_1},
{0x16, "MMMMMMMMMMMMMMMM", "RESERVE",
- SCST_DATA_NONE, SCST_SMALL_TIMEOUT|SCST_LOCAL_EXEC_NEEDED,
+ SCST_DATA_NONE, SCST_SMALL_TIMEOUT|SCST_LOCAL_CMD,
0, get_trans_len_none},
{0x17, "MMMMMMMMMMMMMMMM", "RELEASE",
- SCST_DATA_NONE, SCST_SMALL_TIMEOUT|SCST_LOCAL_EXEC_NEEDED,
+ SCST_DATA_NONE, SCST_SMALL_TIMEOUT|SCST_LOCAL_CMD,
0, get_trans_len_none},
{0x18, "OOOOOOOO ", "COPY",
SCST_DATA_WRITE, SCST_LONG_TIMEOUT, 2, get_trans_len_3},
{0x54, " O ", "SEND OPC INFORMATION",
SCST_DATA_WRITE, FLAG_NONE, 7, get_trans_len_2},
{0x55, "OOOOOOOOOOOOOOOO", "MODE SELECT(10)",
- SCST_DATA_WRITE, SCST_LOCAL_EXEC_NEEDED, 7, get_trans_len_2},
+ SCST_DATA_WRITE, SCST_LOCAL_CMD, 7, get_trans_len_2},
{0x56, "OOOOOOOOOOOOOOOO", "RESERVE(10)",
- SCST_DATA_NONE, SCST_SMALL_TIMEOUT|SCST_LOCAL_EXEC_NEEDED,
+ SCST_DATA_NONE, SCST_SMALL_TIMEOUT|SCST_LOCAL_CMD,
0, get_trans_len_none},
{0x57, "OOOOOOOOOOOOOOOO", "RELEASE(10)",
- SCST_DATA_NONE, SCST_SMALL_TIMEOUT|SCST_LOCAL_EXEC_NEEDED,
+ SCST_DATA_NONE, SCST_SMALL_TIMEOUT|SCST_LOCAL_CMD,
0, get_trans_len_none},
{0x58, " O ", "REPAIR TRACK",
SCST_DATA_NONE, SCST_WRITE_MEDIUM, 0, get_trans_len_none},
/* 12-bytes length CDB */
{0xA0, "VVVVVVVVVV M ", "REPORT LUNS",
SCST_DATA_READ, SCST_SMALL_TIMEOUT|SCST_IMPLICIT_HQ|SCST_SKIP_UA|
- SCST_LOCAL_CMD|SCST_LOCAL_EXEC_NEEDED,
+ SCST_FULLY_LOCAL_CMD|SCST_LOCAL_CMD,
6, get_trans_len_4},
{0xA1, " O ", "BLANK",
SCST_DATA_NONE, SCST_LONG_TIMEOUT, 0, get_trans_len_none},
TRACE_ENTRY();
- if (likely(!scst_is_cmd_local(cmd))) {
+ if (likely(!scst_is_cmd_fully_local(cmd))) {
if (unlikely(!dev->handler->parse_atomic &&
scst_cmd_atomic(cmd))) {
/*
scst_put_buf(cmd, buffer);
-out_compl:
tgt_dev->tgt_dev_valid_sense_len = 0;
- scst_set_resp_data_len(cmd, sl);
spin_unlock_bh(&tgt_dev->tgt_dev_lock);
+ scst_set_resp_data_len(cmd, sl);
+
+out_compl:
cmd->completed = 1;
out_done:
return res;
out_hw_err:
+ spin_unlock_bh(&tgt_dev->tgt_dev_lock);
scst_set_cmd_error(cmd, SCST_LOAD_SENSE(scst_sense_hardw_error));
goto out_compl;
goto out_done;
}
- /*
- * Adding new commands here don't forget to update
- * scst_is_cmd_local() in scst.h, if necessary
- */
-
- if (!(cmd->op_flags & SCST_LOCAL_EXEC_NEEDED)) {
+ if (!scst_is_cmd_local(cmd)) {
res = SCST_EXEC_NOT_COMPLETED;
goto out;
}
state = SCST_CMD_STATE_PRE_XMIT_RESP;
- if (likely(!scst_is_cmd_local(cmd)) &&
+ if (likely(!scst_is_cmd_fully_local(cmd)) &&
likely(dev->handler->dev_done != NULL)) {
int rc;
TRACE_ENTRY();
EXTRACHECKS_BUG_ON(in_irq() || irqs_disabled());
+ EXTRACHECKS_WARN_ON((in_atomic() || in_interrupt() || irqs_disabled()) &&
+ !atomic);
cmd->atomic = atomic;