aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/target
diff options
context:
space:
mode:
authorRoland Dreier <roland@purestorage.com>2012-07-16 14:04:42 -0400
committerNicholas Bellinger <nab@linux-iscsi.org>2012-07-16 20:35:27 -0400
commit1c7b13fe65269960f63082eafccede547191ab02 (patch)
tree2c2d7f46ab88c31f3b347394ef0d51eb9d11ab8c /drivers/target
parente1013f14376f3121e73917f5455b9b7a22bdfb41 (diff)
target: Remove se_session.sess_wait_list
Since we set se_session.sess_tearing_down and stop new commands from being added to se_session.sess_cmd_list before we wait for commands to finish when freeing a session, there's no need for a separate sess_wait_list -- if we let new commands be added to sess_cmd_list after setting sess_tearing_down, that would be a bug that breaks the logic of waiting in-flight commands. Also rename target_splice_sess_cmd_list() to target_sess_cmd_list_set_waiting(), since we are no longer splicing onto a separate list. Signed-off-by: Roland Dreier <roland@purestorage.com> Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
Diffstat (limited to 'drivers/target')
-rw-r--r--drivers/target/target_core_transport.c22
1 files changed, 10 insertions, 12 deletions
diff --git a/drivers/target/target_core_transport.c b/drivers/target/target_core_transport.c
index a979514061e7..357bb24afba2 100644
--- a/drivers/target/target_core_transport.c
+++ b/drivers/target/target_core_transport.c
@@ -232,7 +232,6 @@ struct se_session *transport_init_session(void)
232 INIT_LIST_HEAD(&se_sess->sess_list); 232 INIT_LIST_HEAD(&se_sess->sess_list);
233 INIT_LIST_HEAD(&se_sess->sess_acl_list); 233 INIT_LIST_HEAD(&se_sess->sess_acl_list);
234 INIT_LIST_HEAD(&se_sess->sess_cmd_list); 234 INIT_LIST_HEAD(&se_sess->sess_cmd_list);
235 INIT_LIST_HEAD(&se_sess->sess_wait_list);
236 spin_lock_init(&se_sess->sess_cmd_lock); 235 spin_lock_init(&se_sess->sess_cmd_lock);
237 kref_init(&se_sess->sess_kref); 236 kref_init(&se_sess->sess_kref);
238 237
@@ -2478,28 +2477,27 @@ int target_put_sess_cmd(struct se_session *se_sess, struct se_cmd *se_cmd)
2478} 2477}
2479EXPORT_SYMBOL(target_put_sess_cmd); 2478EXPORT_SYMBOL(target_put_sess_cmd);
2480 2479
2481/* target_splice_sess_cmd_list - Split active cmds into sess_wait_list 2480/* target_sess_cmd_list_set_waiting - Flag all commands in
2482 * @se_sess: session to split 2481 * sess_cmd_list to complete cmd_wait_comp. Set
2482 * sess_tearing_down so no more commands are queued.
2483 * @se_sess: session to flag
2483 */ 2484 */
2484void target_splice_sess_cmd_list(struct se_session *se_sess) 2485void target_sess_cmd_list_set_waiting(struct se_session *se_sess)
2485{ 2486{
2486 struct se_cmd *se_cmd; 2487 struct se_cmd *se_cmd;
2487 unsigned long flags; 2488 unsigned long flags;
2488 2489
2489 WARN_ON(!list_empty(&se_sess->sess_wait_list));
2490 INIT_LIST_HEAD(&se_sess->sess_wait_list);
2491
2492 spin_lock_irqsave(&se_sess->sess_cmd_lock, flags); 2490 spin_lock_irqsave(&se_sess->sess_cmd_lock, flags);
2493 se_sess->sess_tearing_down = 1;
2494 2491
2495 list_splice_init(&se_sess->sess_cmd_list, &se_sess->sess_wait_list); 2492 WARN_ON(se_sess->sess_tearing_down);
2493 se_sess->sess_tearing_down = 1;
2496 2494
2497 list_for_each_entry(se_cmd, &se_sess->sess_wait_list, se_cmd_list) 2495 list_for_each_entry(se_cmd, &se_sess->sess_cmd_list, se_cmd_list)
2498 se_cmd->cmd_wait_set = 1; 2496 se_cmd->cmd_wait_set = 1;
2499 2497
2500 spin_unlock_irqrestore(&se_sess->sess_cmd_lock, flags); 2498 spin_unlock_irqrestore(&se_sess->sess_cmd_lock, flags);
2501} 2499}
2502EXPORT_SYMBOL(target_splice_sess_cmd_list); 2500EXPORT_SYMBOL(target_sess_cmd_list_set_waiting);
2503 2501
2504/* target_wait_for_sess_cmds - Wait for outstanding descriptors 2502/* target_wait_for_sess_cmds - Wait for outstanding descriptors
2505 * @se_sess: session to wait for active I/O 2503 * @se_sess: session to wait for active I/O
@@ -2513,7 +2511,7 @@ void target_wait_for_sess_cmds(
2513 bool rc = false; 2511 bool rc = false;
2514 2512
2515 list_for_each_entry_safe(se_cmd, tmp_cmd, 2513 list_for_each_entry_safe(se_cmd, tmp_cmd,
2516 &se_sess->sess_wait_list, se_cmd_list) { 2514 &se_sess->sess_cmd_list, se_cmd_list) {
2517 list_del(&se_cmd->se_cmd_list); 2515 list_del(&se_cmd->se_cmd_list);
2518 2516
2519 pr_debug("Waiting for se_cmd: %p t_state: %d, fabric state:" 2517 pr_debug("Waiting for se_cmd: %p t_state: %d, fabric state:"