diff options
Diffstat (limited to 'drivers/target/iscsi')
-rw-r--r-- | drivers/target/iscsi/iscsi_target.c | 17 | ||||
-rw-r--r-- | drivers/target/iscsi/iscsi_target_login.c | 9 |
2 files changed, 14 insertions, 12 deletions
diff --git a/drivers/target/iscsi/iscsi_target.c b/drivers/target/iscsi/iscsi_target.c index db740e7e9ba2..35b61f7d6c63 100644 --- a/drivers/target/iscsi/iscsi_target.c +++ b/drivers/target/iscsi/iscsi_target.c | |||
@@ -1073,7 +1073,6 @@ int iscsit_process_scsi_cmd(struct iscsi_conn *conn, struct iscsi_cmd *cmd, | |||
1073 | if (cmd->reject_reason) | 1073 | if (cmd->reject_reason) |
1074 | return 0; | 1074 | return 0; |
1075 | 1075 | ||
1076 | target_put_sess_cmd(conn->sess->se_sess, &cmd->se_cmd); | ||
1077 | return 1; | 1076 | return 1; |
1078 | } | 1077 | } |
1079 | /* | 1078 | /* |
@@ -1111,14 +1110,10 @@ after_immediate_data: | |||
1111 | */ | 1110 | */ |
1112 | cmdsn_ret = iscsit_sequence_cmd(cmd->conn, cmd, | 1111 | cmdsn_ret = iscsit_sequence_cmd(cmd->conn, cmd, |
1113 | (unsigned char *)hdr, hdr->cmdsn); | 1112 | (unsigned char *)hdr, hdr->cmdsn); |
1114 | if (cmdsn_ret == CMDSN_ERROR_CANNOT_RECOVER) { | 1113 | if (cmdsn_ret == CMDSN_ERROR_CANNOT_RECOVER) |
1115 | return -1; | 1114 | return -1; |
1116 | } else if (cmdsn_ret == CMDSN_LOWER_THAN_EXP) { | ||
1117 | target_put_sess_cmd(conn->sess->se_sess, &cmd->se_cmd); | ||
1118 | return 0; | ||
1119 | } | ||
1120 | 1115 | ||
1121 | if (cmd->sense_reason) { | 1116 | if (cmd->sense_reason || cmdsn_ret == CMDSN_LOWER_THAN_EXP) { |
1122 | int rc; | 1117 | int rc; |
1123 | 1118 | ||
1124 | rc = iscsit_dump_data_payload(cmd->conn, | 1119 | rc = iscsit_dump_data_payload(cmd->conn, |
@@ -1514,6 +1509,10 @@ int iscsit_setup_nop_out(struct iscsi_conn *conn, struct iscsi_cmd *cmd, | |||
1514 | if (hdr->itt == RESERVED_ITT && !(hdr->opcode & ISCSI_OP_IMMEDIATE)) { | 1509 | if (hdr->itt == RESERVED_ITT && !(hdr->opcode & ISCSI_OP_IMMEDIATE)) { |
1515 | pr_err("NOPOUT ITT is reserved, but Immediate Bit is" | 1510 | pr_err("NOPOUT ITT is reserved, but Immediate Bit is" |
1516 | " not set, protocol error.\n"); | 1511 | " not set, protocol error.\n"); |
1512 | if (!cmd) | ||
1513 | return iscsit_add_reject(conn, ISCSI_REASON_PROTOCOL_ERROR, | ||
1514 | (unsigned char *)hdr); | ||
1515 | |||
1517 | return iscsit_reject_cmd(cmd, ISCSI_REASON_PROTOCOL_ERROR, | 1516 | return iscsit_reject_cmd(cmd, ISCSI_REASON_PROTOCOL_ERROR, |
1518 | (unsigned char *)hdr); | 1517 | (unsigned char *)hdr); |
1519 | } | 1518 | } |
@@ -1523,6 +1522,10 @@ int iscsit_setup_nop_out(struct iscsi_conn *conn, struct iscsi_cmd *cmd, | |||
1523 | " greater than MaxXmitDataSegmentLength: %u, protocol" | 1522 | " greater than MaxXmitDataSegmentLength: %u, protocol" |
1524 | " error.\n", payload_length, | 1523 | " error.\n", payload_length, |
1525 | conn->conn_ops->MaxXmitDataSegmentLength); | 1524 | conn->conn_ops->MaxXmitDataSegmentLength); |
1525 | if (!cmd) | ||
1526 | return iscsit_add_reject(conn, ISCSI_REASON_PROTOCOL_ERROR, | ||
1527 | (unsigned char *)hdr); | ||
1528 | |||
1526 | return iscsit_reject_cmd(cmd, ISCSI_REASON_PROTOCOL_ERROR, | 1529 | return iscsit_reject_cmd(cmd, ISCSI_REASON_PROTOCOL_ERROR, |
1527 | (unsigned char *)hdr); | 1530 | (unsigned char *)hdr); |
1528 | } | 1531 | } |
diff --git a/drivers/target/iscsi/iscsi_target_login.c b/drivers/target/iscsi/iscsi_target_login.c index 7aa35e5d20d3..1794c753954a 100644 --- a/drivers/target/iscsi/iscsi_target_login.c +++ b/drivers/target/iscsi/iscsi_target_login.c | |||
@@ -1243,12 +1243,11 @@ static int __iscsi_target_login_thread(struct iscsi_np *np) | |||
1243 | if (np->np_thread_state == ISCSI_NP_THREAD_RESET) { | 1243 | if (np->np_thread_state == ISCSI_NP_THREAD_RESET) { |
1244 | spin_unlock_bh(&np->np_thread_lock); | 1244 | spin_unlock_bh(&np->np_thread_lock); |
1245 | complete(&np->np_restart_comp); | 1245 | complete(&np->np_restart_comp); |
1246 | if (ret == -ENODEV) { | 1246 | iscsit_put_transport(conn->conn_transport); |
1247 | iscsit_put_transport(conn->conn_transport); | 1247 | kfree(conn); |
1248 | kfree(conn); | 1248 | conn = NULL; |
1249 | conn = NULL; | 1249 | if (ret == -ENODEV) |
1250 | goto out; | 1250 | goto out; |
1251 | } | ||
1252 | /* Get another socket */ | 1251 | /* Get another socket */ |
1253 | return 1; | 1252 | return 1; |
1254 | } | 1253 | } |