diff options
| -rw-r--r-- | drivers/target/iscsi/iscsi_target_core.h | 1 | ||||
| -rw-r--r-- | drivers/target/iscsi/iscsi_target_util.c | 18 |
2 files changed, 11 insertions, 8 deletions
diff --git a/drivers/target/iscsi/iscsi_target_core.h b/drivers/target/iscsi/iscsi_target_core.h index f2094d2f8eef..8dcb3c1aa801 100644 --- a/drivers/target/iscsi/iscsi_target_core.h +++ b/drivers/target/iscsi/iscsi_target_core.h | |||
| @@ -193,6 +193,7 @@ enum recover_cmdsn_ret_table { | |||
| 193 | CMDSN_NORMAL_OPERATION = 0, | 193 | CMDSN_NORMAL_OPERATION = 0, |
| 194 | CMDSN_LOWER_THAN_EXP = 1, | 194 | CMDSN_LOWER_THAN_EXP = 1, |
| 195 | CMDSN_HIGHER_THAN_EXP = 2, | 195 | CMDSN_HIGHER_THAN_EXP = 2, |
| 196 | CMDSN_MAXCMDSN_OVERRUN = 3, | ||
| 196 | }; | 197 | }; |
| 197 | 198 | ||
| 198 | /* Used for iscsi_handle_immediate_data() return values */ | 199 | /* Used for iscsi_handle_immediate_data() return values */ |
diff --git a/drivers/target/iscsi/iscsi_target_util.c b/drivers/target/iscsi/iscsi_target_util.c index 45b8fd13fa72..9064926a0370 100644 --- a/drivers/target/iscsi/iscsi_target_util.c +++ b/drivers/target/iscsi/iscsi_target_util.c | |||
| @@ -242,9 +242,9 @@ static inline int iscsit_check_received_cmdsn(struct iscsi_session *sess, u32 cm | |||
| 242 | */ | 242 | */ |
| 243 | if (iscsi_sna_gt(cmdsn, sess->max_cmd_sn)) { | 243 | if (iscsi_sna_gt(cmdsn, sess->max_cmd_sn)) { |
| 244 | pr_err("Received CmdSN: 0x%08x is greater than" | 244 | pr_err("Received CmdSN: 0x%08x is greater than" |
| 245 | " MaxCmdSN: 0x%08x, protocol error.\n", cmdsn, | 245 | " MaxCmdSN: 0x%08x, ignoring.\n", cmdsn, |
| 246 | sess->max_cmd_sn); | 246 | sess->max_cmd_sn); |
| 247 | ret = CMDSN_ERROR_CANNOT_RECOVER; | 247 | ret = CMDSN_MAXCMDSN_OVERRUN; |
| 248 | 248 | ||
| 249 | } else if (cmdsn == sess->exp_cmd_sn) { | 249 | } else if (cmdsn == sess->exp_cmd_sn) { |
| 250 | sess->exp_cmd_sn++; | 250 | sess->exp_cmd_sn++; |
| @@ -303,14 +303,16 @@ int iscsit_sequence_cmd(struct iscsi_conn *conn, struct iscsi_cmd *cmd, | |||
| 303 | ret = CMDSN_HIGHER_THAN_EXP; | 303 | ret = CMDSN_HIGHER_THAN_EXP; |
| 304 | break; | 304 | break; |
| 305 | case CMDSN_LOWER_THAN_EXP: | 305 | case CMDSN_LOWER_THAN_EXP: |
| 306 | case CMDSN_MAXCMDSN_OVERRUN: | ||
| 307 | default: | ||
| 306 | cmd->i_state = ISTATE_REMOVE; | 308 | cmd->i_state = ISTATE_REMOVE; |
| 307 | iscsit_add_cmd_to_immediate_queue(cmd, conn, cmd->i_state); | 309 | iscsit_add_cmd_to_immediate_queue(cmd, conn, cmd->i_state); |
| 308 | ret = cmdsn_ret; | 310 | /* |
| 309 | break; | 311 | * Existing callers for iscsit_sequence_cmd() will silently |
| 310 | default: | 312 | * ignore commands with CMDSN_LOWER_THAN_EXP, so force this |
| 311 | reason = ISCSI_REASON_PROTOCOL_ERROR; | 313 | * return for CMDSN_MAXCMDSN_OVERRUN as well.. |
| 312 | reject = true; | 314 | */ |
| 313 | ret = cmdsn_ret; | 315 | ret = CMDSN_LOWER_THAN_EXP; |
| 314 | break; | 316 | break; |
| 315 | } | 317 | } |
| 316 | mutex_unlock(&conn->sess->cmdsn_mutex); | 318 | mutex_unlock(&conn->sess->cmdsn_mutex); |
