git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@519 d57e44dd-8a1f-0410-8b47-8ef2f437770f
This commit is contained in:
Vladislav Bolkhovitin
2008-10-08 17:36:08 +00:00
parent 2f3236e013
commit 50af04800a
4 changed files with 48 additions and 14 deletions

View File

@@ -419,6 +419,7 @@ enum scst_cdb_flags {
SCST_LONG_TIMEOUT = 0x04,
SCST_UNKNOWN_LENGTH = 0x08,
SCST_INFO_INVALID = 0x10,
SCST_VERIFY_BYTCHK_MISMATCH_ALLOWED = 0x20,
};
/*

View File

@@ -174,7 +174,9 @@ static const struct scst_sdbops scst_scsi_op_table[] = {
{0x12, "MMMMMMMMMMMMMMMM", "INQUIRY",
SCST_DATA_READ, SCST_SMALL_TIMEOUT, 4, get_trans_len_1},
{0x13, "VOVVVV ", "VERIFY(6)",
SCST_DATA_NONE, SCST_TRANSFER_LEN_TYPE_FIXED, 2, get_trans_len_3},
SCST_DATA_NONE, SCST_TRANSFER_LEN_TYPE_FIXED|
SCST_VERIFY_BYTCHK_MISMATCH_ALLOWED,
2, get_trans_len_3},
{0x14, "VOOVVV ", "RECOVER BUFFERED DATA",
SCST_DATA_READ, SCST_TRANSFER_LEN_TYPE_FIXED, 2, get_trans_len_3},
{0x15, "OMOOOOOOOOOOOOOO", "MODE SELECT(6)",
@@ -250,7 +252,9 @@ static const struct scst_sdbops scst_scsi_op_table[] = {
{0x2E, "O OO O ", "WRITE AND VERIFY(10)",
SCST_DATA_WRITE, SCST_TRANSFER_LEN_TYPE_FIXED, 7, get_trans_len_2},
{0x2F, "O OO O ", "VERIFY(10)",
SCST_DATA_NONE, SCST_TRANSFER_LEN_TYPE_FIXED, 7, get_trans_len_2},
SCST_DATA_NONE, SCST_TRANSFER_LEN_TYPE_FIXED|
SCST_VERIFY_BYTCHK_MISMATCH_ALLOWED,
7, get_trans_len_2},
{0x33, "O OO O ", "SET LIMITS(10)",
SCST_DATA_NONE, FLAG_NONE, 0, get_trans_len_none},
{0x34, " O ", "READ POSITION",
@@ -378,7 +382,9 @@ static const struct scst_sdbops scst_scsi_op_table[] = {
{0x8E, "O OO O ", "WRITE AND VERIFY(16)",
SCST_DATA_WRITE, SCST_TRANSFER_LEN_TYPE_FIXED, 10, get_trans_len_4},
{0x8F, "O OO O ", "VERIFY(16)",
SCST_DATA_NONE, SCST_TRANSFER_LEN_TYPE_FIXED, 10, get_trans_len_4},
SCST_DATA_NONE, SCST_TRANSFER_LEN_TYPE_FIXED|
SCST_VERIFY_BYTCHK_MISMATCH_ALLOWED,
10, get_trans_len_4},
{0x90, "O OO O ", "PRE-FETCH(16)",
SCST_DATA_NONE, FLAG_NONE, 0, get_trans_len_none},
{0x91, "O OO O ", "SYNCHRONIZE CACHE(16)",
@@ -442,7 +448,9 @@ static const struct scst_sdbops scst_scsi_op_table[] = {
{0xAE, "O OO O ", "WRITE AND VERIFY(12)",
SCST_DATA_WRITE, SCST_TRANSFER_LEN_TYPE_FIXED, 6, get_trans_len_4},
{0xAF, "O OO O ", "VERIFY(12)",
SCST_DATA_NONE, SCST_TRANSFER_LEN_TYPE_FIXED, 6, get_trans_len_4},
SCST_DATA_NONE, SCST_TRANSFER_LEN_TYPE_FIXED|
SCST_VERIFY_BYTCHK_MISMATCH_ALLOWED,
6, get_trans_len_4},
/* No need to support at all.
{0xB0, " OO O ", "SEARCH DATA HIGH(12)",
SCST_DATA_WRITE, FLAG_NONE, 9, get_trans_len_1},

View File

@@ -1323,6 +1323,12 @@ void scst_sched_session_free(struct scst_session *sess)
TRACE_ENTRY();
if (sess->shut_phase != SCST_SESS_SPH_SHUTDOWN) {
PRINT_CRIT_ERROR("session %p is going to shutdown with unknown "
"shut phase %lx", sess, sess->shut_phase);
sBUG();
}
spin_lock_irqsave(&scst_mgmt_lock, flags);
TRACE_DBG("Adding sess %p to scst_sess_shut_list", sess);
list_add_tail(&sess->sess_shut_list_entry, &scst_sess_shut_list);

View File

@@ -434,6 +434,31 @@ out_xmit:
goto out;
}
#ifndef CONFIG_SCST_USE_EXPECTED_VALUES
static bool scst_is_allowed_to_mismatch_cmd(struct scst_cmd *cmd)
{
bool res = false;
switch (cmd->cdb[0]) {
case TEST_UNIT_READY:
/* Crazy VMware people sometimes do TUR with READ direction */
res = true;
break;
case VERIFY:
case VERIFY_6:
case VERIFY_12:
case VERIFY_16:
/* VERIFY commands with BYTCHK unset shouldn't fail here */
if (((cmd->op_flags & SCST_VERIFY_BYTCHK_MISMATCH_ALLOWED) != 0) &&
(cmd->cdb[1] & BYTCHK) == 0)
res = true;
break;
}
return res;
}
#endif
static int scst_parse_cmd(struct scst_cmd *cmd)
{
int res = SCST_CMD_STATE_RES_CONT_SAME;
@@ -513,12 +538,12 @@ static int scst_parse_cmd(struct scst_cmd *cmd)
# ifdef CONFIG_SCST_EXTRACHECKS
if ((cmd->data_direction != cmd->expected_data_direction) ||
(cmd->bufflen != cmd->expected_transfer_len)) {
PRINT_ERROR("Expected values don't match decoded ones: "
PRINT_WARNING("Expected values don't match decoded ones: "
"data_direction %d, expected_data_direction %d, "
"bufflen %d, expected_transfer_len %d",
cmd->data_direction, cmd->expected_data_direction,
cmd->bufflen, cmd->expected_transfer_len);
PRINT_BUFFER("Failed CDB", cmd->cdb, cmd->cdb_len);
PRINT_BUFFER("Suspicious CDB", cmd->cdb, cmd->cdb_len);
}
# endif
cmd->data_direction = cmd->expected_data_direction;
@@ -526,13 +551,8 @@ static int scst_parse_cmd(struct scst_cmd *cmd)
#else
if (unlikely(cmd->data_direction != cmd->expected_data_direction)) {
if (((cmd->expected_data_direction != SCST_DATA_NONE) ||
(cmd->bufflen != 0)) &&
/* Crazy VMware people sometimes do TUR with READ direction */
(!(cmd->cdb[0] == TEST_UNIT_READY) &&
/* VERIFY commands with BYTCHK unset shouldn't fail here */
!(((cmd->cdb[0] == VERIFY) || (cmd->cdb[0] == VERIFY_6) ||
(cmd->cdb[0] == VERIFY_12) || (cmd->cdb[0] == VERIFY_16)) &&
((cmd->cdb[1] & BYTCHK) == 0)))) {
(cmd->bufflen != 0)) &&
!scst_is_allowed_to_mismatch_cmd(cmd)) {
PRINT_ERROR("Expected data direction %d for opcode "
"0x%02x (handler %s, target %s) doesn't match "
"decoded value %d", cmd->expected_data_direction,
@@ -546,7 +566,6 @@ static int scst_parse_cmd(struct scst_cmd *cmd)
}
if (unlikely(cmd->bufflen != cmd->expected_transfer_len)) {
static int repd;
if (repd < 100) {
/*
* Intentionally unlocked. Few messages more