aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/target
diff options
context:
space:
mode:
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:"