diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2013-09-03 15:50:41 -0700 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2013-09-03 15:50:41 -0700 |
commit | dcaaaeac871ff73043c616db3b2f91482637801d (patch) | |
tree | 021870e054c909819e9c50ad5a47f906a7e26cf9 /drivers/target/iscsi | |
parent | f66c83d059d1ed90968caa81d401f160912b063a (diff) | |
parent | c130480b129fbfd7932ad7af3f4ffcea630b027f (diff) | |
download | blackbird-op-linux-dcaaaeac871ff73043c616db3b2f91482637801d.tar.gz blackbird-op-linux-dcaaaeac871ff73043c616db3b2f91482637801d.zip |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/nab/target-pending
Pull SCSI target fixes from Nicholas Bellinger:
"The first patch is to address a long standing issue where INQUIRY
vendor + model response data was not correctly padded with ASCII
spaces, causing MSFT and Falconstor multipath stacks to not function
with our LUNs.
The second -> forth patches are additional iscsi-target regression
fixes for the post >= v3.10 iser-target changes. The second and third
are failure cases that have appeared during further testing, and the
forth is only reproducible with malformed NOP packets.
The fifth patch is a v3.11 specific regression caused by a recent
optimization that showed up during WRITE I/O failure testing.
I'll be sending Patch #1 and Patch #5 to Greg-KH separately for
stable"
* git://git.kernel.org/pub/scm/linux/kernel/git/nab/target-pending:
target: Fix se_cmd->state_list leak regression during WRITE failure
iscsi-target: Fix potential NULL pointer in solicited NOPOUT reject
iscsi-target: Fix iscsit_transport reference leak during NP thread reset
iscsi-target: Fix ImmediateData=Yes failure regression in >= v3.10
target: Fix trailing ASCII space usage in INQUIRY vendor+model
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 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, if (cmd->reject_reason) return 0; - target_put_sess_cmd(conn->sess->se_sess, &cmd->se_cmd); return 1; } /* @@ -1124,14 +1123,10 @@ after_immediate_data: */ cmdsn_ret = iscsit_sequence_cmd(cmd->conn, cmd, (unsigned char *)hdr, hdr->cmdsn); - if (cmdsn_ret == CMDSN_ERROR_CANNOT_RECOVER) { + if (cmdsn_ret == CMDSN_ERROR_CANNOT_RECOVER) return -1; - } else if (cmdsn_ret == CMDSN_LOWER_THAN_EXP) { - target_put_sess_cmd(conn->sess->se_sess, &cmd->se_cmd); - return 0; - } - if (cmd->sense_reason) { + if (cmd->sense_reason || cmdsn_ret == CMDSN_LOWER_THAN_EXP) { int rc; rc = iscsit_dump_data_payload(cmd->conn, @@ -1527,6 +1522,10 @@ int iscsit_setup_nop_out(struct iscsi_conn *conn, struct iscsi_cmd *cmd, if (hdr->itt == RESERVED_ITT && !(hdr->opcode & ISCSI_OP_IMMEDIATE)) { pr_err("NOPOUT ITT is reserved, but Immediate Bit is" " not set, protocol error.\n"); + if (!cmd) + return iscsit_add_reject(conn, ISCSI_REASON_PROTOCOL_ERROR, + (unsigned char *)hdr); + return iscsit_reject_cmd(cmd, ISCSI_REASON_PROTOCOL_ERROR, (unsigned char *)hdr); } @@ -1536,6 +1535,10 @@ int iscsit_setup_nop_out(struct iscsi_conn *conn, struct iscsi_cmd *cmd, " greater than MaxXmitDataSegmentLength: %u, protocol" " error.\n", payload_length, conn->conn_ops->MaxXmitDataSegmentLength); + if (!cmd) + return iscsit_add_reject(conn, ISCSI_REASON_PROTOCOL_ERROR, + (unsigned char *)hdr); + return iscsit_reject_cmd(cmd, ISCSI_REASON_PROTOCOL_ERROR, (unsigned char *)hdr); } 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) if (np->np_thread_state == ISCSI_NP_THREAD_RESET) { spin_unlock_bh(&np->np_thread_lock); complete(&np->np_restart_comp); - if (ret == -ENODEV) { - iscsit_put_transport(conn->conn_transport); - kfree(conn); - conn = NULL; + iscsit_put_transport(conn->conn_transport); + kfree(conn); + conn = NULL; + if (ret == -ENODEV) goto out; - } /* Get another socket */ return 1; } |