diff options
author | Roland Dreier <roland@purestorage.com> | 2012-07-16 14:04:42 -0400 |
---|---|---|
committer | Nicholas Bellinger <nab@linux-iscsi.org> | 2012-07-16 20:35:27 -0400 |
commit | 1c7b13fe65269960f63082eafccede547191ab02 (patch) | |
tree | 2c2d7f46ab88c31f3b347394ef0d51eb9d11ab8c /drivers/target | |
parent | e1013f14376f3121e73917f5455b9b7a22bdfb41 (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.c | 22 |
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 | } |
2479 | EXPORT_SYMBOL(target_put_sess_cmd); | 2478 | EXPORT_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 | */ |
2484 | void target_splice_sess_cmd_list(struct se_session *se_sess) | 2485 | void 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 | } |
2502 | EXPORT_SYMBOL(target_splice_sess_cmd_list); | 2500 | EXPORT_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:" |