diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2013-06-01 07:05:20 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2013-06-01 07:05:20 -0400 |
| commit | 008bd2de940114a2d781b2efdd1a34a0fcf0f7ec (patch) | |
| tree | c094bb86133f266f52fa296328c2fb79aca7ce5d | |
| parent | 0f7dafd44e2de131f67fca87378e30ca86bc00d5 (diff) | |
| parent | aafc9d158b0039e600fc429246c7bb04a111fb26 (diff) | |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/nab/target-pending
Pull scsi target fixes from Nicholas Bellinger:
"The highlights include:
- Re-instate sess->wait_list in target_wait_for_sess_cmds() for
active I/O shutdown handling in fabrics using se_cmd->cmd_kref
- Make ib_srpt call target_sess_cmd_list_set_waiting() during session
shutdown
- Fix FILEIO off-by-one READ_CAPACITY bug for !S_ISBLK export
- Fix iscsi-target login error heap buffer overflow (Kees)
- Fix iscsi-target active I/O shutdown handling regression in
v3.10-rc1
A big thanks to Kees Cook for fixing a long standing login error
buffer overflow bug.
All patches are CC'ed to stable with the exception of the v3.10-rc1
specific regression + other minor target cleanup."
* git://git.kernel.org/pub/scm/linux/kernel/git/nab/target-pending:
iscsi-target: Fix iscsit_free_cmd() se_cmd->cmd_kref shutdown handling
target: Propigate up ->cmd_kref put return via transport_generic_free_cmd
iscsi-target: fix heap buffer overflow on error
target/file: Fix off-by-one READ_CAPACITY bug for !S_ISBLK export
ib_srpt: Call target_sess_cmd_list_set_waiting during shutdown_session
target: Re-instate sess_wait_list for target_wait_for_sess_cmds
target: Remove unused wait_for_tasks bit in target_wait_for_sess_cmds
| -rw-r--r-- | drivers/infiniband/ulp/srpt/ib_srpt.c | 34 | ||||
| -rw-r--r-- | drivers/infiniband/ulp/srpt/ib_srpt.h | 1 | ||||
| -rw-r--r-- | drivers/scsi/qla2xxx/tcm_qla2xxx.c | 2 | ||||
| -rw-r--r-- | drivers/target/iscsi/iscsi_target.c | 12 | ||||
| -rw-r--r-- | drivers/target/iscsi/iscsi_target_erl2.c | 12 | ||||
| -rw-r--r-- | drivers/target/iscsi/iscsi_target_parameters.c | 8 | ||||
| -rw-r--r-- | drivers/target/iscsi/iscsi_target_parameters.h | 4 | ||||
| -rw-r--r-- | drivers/target/iscsi/iscsi_target_util.c | 50 | ||||
| -rw-r--r-- | drivers/target/iscsi/iscsi_target_util.h | 2 | ||||
| -rw-r--r-- | drivers/target/target_core_file.c | 11 | ||||
| -rw-r--r-- | drivers/target/target_core_transport.c | 74 | ||||
| -rw-r--r-- | include/target/target_core_base.h | 1 | ||||
| -rw-r--r-- | include/target/target_core_fabric.h | 4 |
13 files changed, 126 insertions, 89 deletions
diff --git a/drivers/infiniband/ulp/srpt/ib_srpt.c b/drivers/infiniband/ulp/srpt/ib_srpt.c index b08ca7a9f76b..3f3f0416fbdd 100644 --- a/drivers/infiniband/ulp/srpt/ib_srpt.c +++ b/drivers/infiniband/ulp/srpt/ib_srpt.c | |||
| @@ -2227,6 +2227,27 @@ static void srpt_close_ch(struct srpt_rdma_ch *ch) | |||
| 2227 | } | 2227 | } |
| 2228 | 2228 | ||
| 2229 | /** | 2229 | /** |
| 2230 | * srpt_shutdown_session() - Whether or not a session may be shut down. | ||
| 2231 | */ | ||
| 2232 | static int srpt_shutdown_session(struct se_session *se_sess) | ||
| 2233 | { | ||
| 2234 | struct srpt_rdma_ch *ch = se_sess->fabric_sess_ptr; | ||
| 2235 | unsigned long flags; | ||
| 2236 | |||
| 2237 | spin_lock_irqsave(&ch->spinlock, flags); | ||
| 2238 | if (ch->in_shutdown) { | ||
| 2239 | spin_unlock_irqrestore(&ch->spinlock, flags); | ||
| 2240 | return true; | ||
| 2241 | } | ||
| 2242 | |||
| 2243 | ch->in_shutdown = true; | ||
| 2244 | target_sess_cmd_list_set_waiting(se_sess); | ||
| 2245 | spin_unlock_irqrestore(&ch->spinlock, flags); | ||
| 2246 | |||
| 2247 | return true; | ||
| 2248 | } | ||
| 2249 | |||
| 2250 | /** | ||
| 2230 | * srpt_drain_channel() - Drain a channel by resetting the IB queue pair. | 2251 | * srpt_drain_channel() - Drain a channel by resetting the IB queue pair. |
| 2231 | * @cm_id: Pointer to the CM ID of the channel to be drained. | 2252 | * @cm_id: Pointer to the CM ID of the channel to be drained. |
| 2232 | * | 2253 | * |
| @@ -2264,6 +2285,9 @@ static void srpt_drain_channel(struct ib_cm_id *cm_id) | |||
| 2264 | spin_unlock_irq(&sdev->spinlock); | 2285 | spin_unlock_irq(&sdev->spinlock); |
| 2265 | 2286 | ||
| 2266 | if (do_reset) { | 2287 | if (do_reset) { |
| 2288 | if (ch->sess) | ||
| 2289 | srpt_shutdown_session(ch->sess); | ||
| 2290 | |||
| 2267 | ret = srpt_ch_qp_err(ch); | 2291 | ret = srpt_ch_qp_err(ch); |
| 2268 | if (ret < 0) | 2292 | if (ret < 0) |
| 2269 | printk(KERN_ERR "Setting queue pair in error state" | 2293 | printk(KERN_ERR "Setting queue pair in error state" |
| @@ -2328,7 +2352,7 @@ static void srpt_release_channel_work(struct work_struct *w) | |||
| 2328 | se_sess = ch->sess; | 2352 | se_sess = ch->sess; |
| 2329 | BUG_ON(!se_sess); | 2353 | BUG_ON(!se_sess); |
| 2330 | 2354 | ||
| 2331 | target_wait_for_sess_cmds(se_sess, 0); | 2355 | target_wait_for_sess_cmds(se_sess); |
| 2332 | 2356 | ||
| 2333 | transport_deregister_session_configfs(se_sess); | 2357 | transport_deregister_session_configfs(se_sess); |
| 2334 | transport_deregister_session(se_sess); | 2358 | transport_deregister_session(se_sess); |
| @@ -3467,14 +3491,6 @@ static void srpt_release_cmd(struct se_cmd *se_cmd) | |||
| 3467 | } | 3491 | } |
| 3468 | 3492 | ||
| 3469 | /** | 3493 | /** |
| 3470 | * srpt_shutdown_session() - Whether or not a session may be shut down. | ||
| 3471 | */ | ||
| 3472 | static int srpt_shutdown_session(struct se_session *se_sess) | ||
| 3473 | { | ||
| 3474 | return true; | ||
| 3475 | } | ||
| 3476 | |||
| 3477 | /** | ||
| 3478 | * srpt_close_session() - Forcibly close a session. | 3494 | * srpt_close_session() - Forcibly close a session. |
| 3479 | * | 3495 | * |
| 3480 | * Callback function invoked by the TCM core to clean up sessions associated | 3496 | * Callback function invoked by the TCM core to clean up sessions associated |
diff --git a/drivers/infiniband/ulp/srpt/ib_srpt.h b/drivers/infiniband/ulp/srpt/ib_srpt.h index 4caf55cda7b1..3dae156905de 100644 --- a/drivers/infiniband/ulp/srpt/ib_srpt.h +++ b/drivers/infiniband/ulp/srpt/ib_srpt.h | |||
| @@ -325,6 +325,7 @@ struct srpt_rdma_ch { | |||
| 325 | u8 sess_name[36]; | 325 | u8 sess_name[36]; |
| 326 | struct work_struct release_work; | 326 | struct work_struct release_work; |
| 327 | struct completion *release_done; | 327 | struct completion *release_done; |
| 328 | bool in_shutdown; | ||
| 328 | }; | 329 | }; |
| 329 | 330 | ||
| 330 | /** | 331 | /** |
diff --git a/drivers/scsi/qla2xxx/tcm_qla2xxx.c b/drivers/scsi/qla2xxx/tcm_qla2xxx.c index d182c96e17ea..7a3870f385f6 100644 --- a/drivers/scsi/qla2xxx/tcm_qla2xxx.c +++ b/drivers/scsi/qla2xxx/tcm_qla2xxx.c | |||
| @@ -1370,7 +1370,7 @@ static void tcm_qla2xxx_free_session(struct qla_tgt_sess *sess) | |||
| 1370 | dump_stack(); | 1370 | dump_stack(); |
| 1371 | return; | 1371 | return; |
| 1372 | } | 1372 | } |
| 1373 | target_wait_for_sess_cmds(se_sess, 0); | 1373 | target_wait_for_sess_cmds(se_sess); |
| 1374 | 1374 | ||
| 1375 | transport_deregister_session_configfs(sess->se_sess); | 1375 | transport_deregister_session_configfs(sess->se_sess); |
| 1376 | transport_deregister_session(sess->se_sess); | 1376 | transport_deregister_session(sess->se_sess); |
diff --git a/drivers/target/iscsi/iscsi_target.c b/drivers/target/iscsi/iscsi_target.c index 262ef1f23b38..d7705e5824fb 100644 --- a/drivers/target/iscsi/iscsi_target.c +++ b/drivers/target/iscsi/iscsi_target.c | |||
| @@ -651,7 +651,7 @@ static int iscsit_add_reject( | |||
| 651 | cmd->buf_ptr = kmemdup(buf, ISCSI_HDR_LEN, GFP_KERNEL); | 651 | cmd->buf_ptr = kmemdup(buf, ISCSI_HDR_LEN, GFP_KERNEL); |
| 652 | if (!cmd->buf_ptr) { | 652 | if (!cmd->buf_ptr) { |
| 653 | pr_err("Unable to allocate memory for cmd->buf_ptr\n"); | 653 | pr_err("Unable to allocate memory for cmd->buf_ptr\n"); |
| 654 | iscsit_release_cmd(cmd); | 654 | iscsit_free_cmd(cmd, false); |
| 655 | return -1; | 655 | return -1; |
| 656 | } | 656 | } |
| 657 | 657 | ||
| @@ -697,7 +697,7 @@ int iscsit_add_reject_from_cmd( | |||
| 697 | cmd->buf_ptr = kmemdup(buf, ISCSI_HDR_LEN, GFP_KERNEL); | 697 | cmd->buf_ptr = kmemdup(buf, ISCSI_HDR_LEN, GFP_KERNEL); |
| 698 | if (!cmd->buf_ptr) { | 698 | if (!cmd->buf_ptr) { |
| 699 | pr_err("Unable to allocate memory for cmd->buf_ptr\n"); | 699 | pr_err("Unable to allocate memory for cmd->buf_ptr\n"); |
| 700 | iscsit_release_cmd(cmd); | 700 | iscsit_free_cmd(cmd, false); |
| 701 | return -1; | 701 | return -1; |
| 702 | } | 702 | } |
| 703 | 703 | ||
| @@ -1743,7 +1743,7 @@ int iscsit_handle_nop_out(struct iscsi_conn *conn, struct iscsi_cmd *cmd, | |||
| 1743 | return 0; | 1743 | return 0; |
| 1744 | out: | 1744 | out: |
| 1745 | if (cmd) | 1745 | if (cmd) |
| 1746 | iscsit_release_cmd(cmd); | 1746 | iscsit_free_cmd(cmd, false); |
| 1747 | ping_out: | 1747 | ping_out: |
| 1748 | kfree(ping_data); | 1748 | kfree(ping_data); |
| 1749 | return ret; | 1749 | return ret; |
| @@ -2251,7 +2251,7 @@ iscsit_handle_logout_cmd(struct iscsi_conn *conn, struct iscsi_cmd *cmd, | |||
| 2251 | if (conn->conn_state != TARG_CONN_STATE_LOGGED_IN) { | 2251 | if (conn->conn_state != TARG_CONN_STATE_LOGGED_IN) { |
| 2252 | pr_err("Received logout request on connection that" | 2252 | pr_err("Received logout request on connection that" |
| 2253 | " is not in logged in state, ignoring request.\n"); | 2253 | " is not in logged in state, ignoring request.\n"); |
| 2254 | iscsit_release_cmd(cmd); | 2254 | iscsit_free_cmd(cmd, false); |
| 2255 | return 0; | 2255 | return 0; |
| 2256 | } | 2256 | } |
| 2257 | 2257 | ||
| @@ -3665,7 +3665,7 @@ iscsit_immediate_queue(struct iscsi_conn *conn, struct iscsi_cmd *cmd, int state | |||
| 3665 | list_del(&cmd->i_conn_node); | 3665 | list_del(&cmd->i_conn_node); |
| 3666 | spin_unlock_bh(&conn->cmd_lock); | 3666 | spin_unlock_bh(&conn->cmd_lock); |
| 3667 | 3667 | ||
| 3668 | iscsit_free_cmd(cmd); | 3668 | iscsit_free_cmd(cmd, false); |
| 3669 | break; | 3669 | break; |
| 3670 | case ISTATE_SEND_NOPIN_WANT_RESPONSE: | 3670 | case ISTATE_SEND_NOPIN_WANT_RESPONSE: |
| 3671 | iscsit_mod_nopin_response_timer(conn); | 3671 | iscsit_mod_nopin_response_timer(conn); |
| @@ -4122,7 +4122,7 @@ static void iscsit_release_commands_from_conn(struct iscsi_conn *conn) | |||
| 4122 | 4122 | ||
| 4123 | iscsit_increment_maxcmdsn(cmd, sess); | ||
