diff options
-rw-r--r-- | drivers/target/iscsi/iscsi_target.c | 17 | ||||
-rw-r--r-- | drivers/target/iscsi/iscsi_target_login.c | 9 | ||||
-rw-r--r-- | drivers/target/target_core_spc.c | 9 | ||||
-rw-r--r-- | drivers/target/target_core_transport.c | 11 |
4 files changed, 31 insertions, 15 deletions
diff --git a/drivers/target/iscsi/iscsi_target.c b/drivers/target/iscsi/iscsi_target.c index f73da43cdf9e..3a179302b904 100644 --- a/drivers/target/iscsi/iscsi_target.c +++ b/drivers/target/iscsi/iscsi_target.c | |||
@@ -1086,7 +1086,6 @@ int iscsit_process_scsi_cmd(struct iscsi_conn *conn, struct iscsi_cmd *cmd, | |||
1086 | if (cmd->reject_reason) | 1086 | if (cmd->reject_reason) |
1087 | return 0; | 1087 | return 0; |
1088 | 1088 | ||
1089 | target_put_sess_cmd(conn->sess->se_sess, &cmd->se_cmd); | ||
1090 | return 1; | 1089 | return 1; |
1091 | } | 1090 | } |
1092 | /* | 1091 | /* |
@@ -1124,14 +1123,10 @@ after_immediate_data: | |||
1124 | */ | 1123 | */ |
1125 | cmdsn_ret = iscsit_sequence_cmd(cmd->conn, cmd, | 1124 | cmdsn_ret = iscsit_sequence_cmd(cmd->conn, cmd, |
1126 | (unsigned char *)hdr, hdr->cmdsn); | 1125 | (unsigned char *)hdr, hdr->cmdsn); |
1127 | if (cmdsn_ret == CMDSN_ERROR_CANNOT_RECOVER) { | 1126 | if (cmdsn_ret == CMDSN_ERROR_CANNOT_RECOVER) |
1128 | return -1; | 1127 | return -1; |
1129 | } else if (cmdsn_ret == CMDSN_LOWER_THAN_EXP) { | ||
1130 | target_put_sess_cmd(conn->sess->se_sess, &cmd->se_cmd); | ||
1131 | return 0; | ||
1132 | } | ||
1133 | 1128 | ||
1134 | if (cmd->sense_reason) { | 1129 | if (cmd->sense_reason || cmdsn_ret == CMDSN_LOWER_THAN_EXP) { |
1135 | int rc; | 1130 | int rc; |
1136 | 1131 | ||
1137 | rc = iscsit_dump_data_payload(cmd->conn, | 1132 | rc = iscsit_dump_data_payload(cmd->conn, |
@@ -1527,6 +1522,10 @@ int iscsit_setup_nop_out(struct iscsi_conn *conn, struct iscsi_cmd *cmd, | |||
1527 | if (hdr->itt == RESERVED_ITT && !(hdr->opcode & ISCSI_OP_IMMEDIATE)) { | 1522 | if (hdr->itt == RESERVED_ITT && !(hdr->opcode & ISCSI_OP_IMMEDIATE)) { |
1528 | pr_err("NOPOUT ITT is reserved, but Immediate Bit is" | 1523 | pr_err("NOPOUT ITT is reserved, but Immediate Bit is" |
1529 | " not set, protocol error.\n"); | 1524 | " not set, protocol error.\n"); |
1525 | if (!cmd) | ||
1526 | return iscsit_add_reject(conn, ISCSI_REASON_PROTOCOL_ERROR, | ||
1527 | (unsigned char *)hdr); | ||
1528 | |||
1530 | return iscsit_reject_cmd(cmd, ISCSI_REASON_PROTOCOL_ERROR, | 1529 | return iscsit_reject_cmd(cmd, ISCSI_REASON_PROTOCOL_ERROR, |
1531 | (unsigned char *)hdr); | 1530 | (unsigned char *)hdr); |
1532 | } | 1531 | } |
@@ -1536,6 +1535,10 @@ int iscsit_setup_nop_out(struct iscsi_conn *conn, struct iscsi_cmd *cmd, | |||
1536 | " greater than MaxXmitDataSegmentLength: %u, protocol" | 1535 | " greater than MaxXmitDataSegmentLength: %u, protocol" |
1537 | " error.\n", payload_length, | 1536 | " error.\n", payload_length, |
1538 | conn->conn_ops->MaxXmitDataSegmentLength); | 1537 | conn->conn_ops->MaxXmitDataSegmentLength); |
1538 | if (!cmd) | ||
1539 | return iscsit_add_reject(conn, ISCSI_REASON_PROTOCOL_ERROR, | ||
1540 | (unsigned char *)hdr); | ||
1541 | |||
1539 | return iscsit_reject_cmd(cmd, ISCSI_REASON_PROTOCOL_ERROR, | 1542 | return iscsit_reject_cmd(cmd, ISCSI_REASON_PROTOCOL_ERROR, |
1540 | (unsigned char *)hdr); | 1543 | (unsigned char *)hdr); |
1541 | } | 1544 | } |
diff --git a/drivers/target/iscsi/iscsi_target_login.c b/drivers/target/iscsi/iscsi_target_login.c index 3402241be87c..bc788c52b6cc 100644 --- a/drivers/target/iscsi/iscsi_target_login.c +++ b/drivers/target/iscsi/iscsi_target_login.c | |||
@@ -1163,12 +1163,11 @@ static int __iscsi_target_login_thread(struct iscsi_np *np) | |||
1163 | if (np->np_thread_state == ISCSI_NP_THREAD_RESET) { | 1163 | if (np->np_thread_state == ISCSI_NP_THREAD_RESET) { |
1164 | spin_unlock_bh(&np->np_thread_lock); | 1164 | spin_unlock_bh(&np->np_thread_lock); |
1165 | complete(&np->np_restart_comp); | 1165 | complete(&np->np_restart_comp); |
1166 | if (ret == -ENODEV) { | 1166 | iscsit_put_transport(conn->conn_transport); |
1167 | iscsit_put_transport(conn->conn_transport); | 1167 | kfree(conn); |
1168 | kfree(conn); | 1168 | conn = NULL; |
1169 | conn = NULL; | 1169 | if (ret == -ENODEV) |
1170 | goto out; | 1170 | goto out; |
1171 | } | ||
1172 | /* Get another socket */ | 1171 | /* Get another socket */ |
1173 | return 1; | 1172 | return 1; |
1174 | } | 1173 | } |
diff --git a/drivers/target/target_core_spc.c b/drivers/target/target_core_spc.c index 4cb667d720a7..9fabbf7214cd 100644 --- a/drivers/target/target_core_spc.c +++ b/drivers/target/target_core_spc.c | |||
@@ -97,9 +97,12 @@ spc_emulate_inquiry_std(struct se_cmd *cmd, unsigned char *buf) | |||
97 | 97 | ||
98 | buf[7] = 0x2; /* CmdQue=1 */ | 98 | buf[7] = 0x2; /* CmdQue=1 */ |
99 | 99 | ||
100 | snprintf(&buf[8], 8, "LIO-ORG"); | 100 | memcpy(&buf[8], "LIO-ORG ", 8); |
101 | snprintf(&buf[16], 16, "%s", dev->t10_wwn.model); | 101 | memset(&buf[16], 0x20, 16); |
102 | snprintf(&buf[32], 4, "%s", dev->t10_wwn.revision); | 102 | memcpy(&buf[16], dev->t10_wwn.model, |
103 | min_t(size_t, strlen(dev->t10_wwn.model), 16)); | ||
104 | memcpy(&buf[32], dev->t10_wwn.revision, | ||
105 | min_t(size_t, strlen(dev->t10_wwn.revision), 4)); | ||
103 | buf[4] = 31; /* Set additional length to 31 */ | 106 | buf[4] = 31; /* Set additional length to 31 */ |
104 | 107 | ||
105 | return 0; | 108 | return 0; |
diff --git a/drivers/target/target_core_transport.c b/drivers/target/target_core_transport.c index 7172d005d063..d8e49d79f8cc 100644 --- a/drivers/target/target_core_transport.c +++ b/drivers/target/target_core_transport.c | |||
@@ -2134,6 +2134,7 @@ static void transport_write_pending_qf(struct se_cmd *cmd) | |||
2134 | 2134 | ||
2135 | int transport_generic_free_cmd(struct se_cmd *cmd, int wait_for_tasks) | 2135 | int transport_generic_free_cmd(struct se_cmd *cmd, int wait_for_tasks) |
2136 | { | 2136 | { |
2137 | unsigned long flags; | ||
2137 | int ret = 0; | 2138 | int ret = 0; |
2138 | 2139 | ||
2139 | if (!(cmd->se_cmd_flags & SCF_SE_LUN_CMD)) { | 2140 | if (!(cmd->se_cmd_flags & SCF_SE_LUN_CMD)) { |
@@ -2144,6 +2145,16 @@ int transport_generic_free_cmd(struct se_cmd *cmd, int wait_for_tasks) | |||
2144 | } else { | 2145 | } else { |
2145 | if (wait_for_tasks) | 2146 | if (wait_for_tasks) |
2146 | transport_wait_for_tasks(cmd); | 2147 | transport_wait_for_tasks(cmd); |
2148 | /* | ||
2149 | * Handle WRITE failure case where transport_generic_new_cmd() | ||
2150 | * has already added se_cmd to state_list, but fabric has | ||
2151 | * failed command before I/O submission. | ||
2152 | */ | ||
2153 | if (cmd->state_active) { | ||
2154 | spin_lock_irqsave(&cmd->t_state_lock, flags); | ||
2155 | target_remove_from_state_list(cmd); | ||
2156 | spin_unlock_irqrestore(&cmd->t_state_lock, flags); | ||
2157 | } | ||
2147 | 2158 | ||
2148 | if (cmd->se_lun) | 2159 | if (cmd->se_lun) |
2149 | transport_lun_remove_cmd(cmd); | 2160 | transport_lun_remove_cmd(cmd); |