diff options
| -rw-r--r-- | drivers/target/target_core_transport.c | 18 | ||||
| -rw-r--r-- | include/target/target_core_base.h | 1 |
2 files changed, 15 insertions, 4 deletions
diff --git a/drivers/target/target_core_transport.c b/drivers/target/target_core_transport.c index 311c11349aab..bbca144821c5 100644 --- a/drivers/target/target_core_transport.c +++ b/drivers/target/target_core_transport.c | |||
| @@ -221,6 +221,7 @@ struct se_session *transport_init_session(void) | |||
| 221 | INIT_LIST_HEAD(&se_sess->sess_list); | 221 | INIT_LIST_HEAD(&se_sess->sess_list); |
| 222 | INIT_LIST_HEAD(&se_sess->sess_acl_list); | 222 | INIT_LIST_HEAD(&se_sess->sess_acl_list); |
| 223 | INIT_LIST_HEAD(&se_sess->sess_cmd_list); | 223 | INIT_LIST_HEAD(&se_sess->sess_cmd_list); |
| 224 | INIT_LIST_HEAD(&se_sess->sess_wait_list); | ||
| 224 | spin_lock_init(&se_sess->sess_cmd_lock); | 225 | spin_lock_init(&se_sess->sess_cmd_lock); |
| 225 | kref_init(&se_sess->sess_kref); | 226 | kref_init(&se_sess->sess_kref); |
| 226 | 227 | ||
| @@ -2250,11 +2251,14 @@ void target_sess_cmd_list_set_waiting(struct se_session *se_sess) | |||
| 2250 | unsigned long flags; | 2251 | unsigned long flags; |
| 2251 | 2252 | ||
| 2252 | spin_lock_irqsave(&se_sess->sess_cmd_lock, flags); | 2253 | spin_lock_irqsave(&se_sess->sess_cmd_lock, flags); |
| 2253 | 2254 | if (se_sess->sess_tearing_down) { | |
| 2254 | WARN_ON(se_sess->sess_tearing_down); | 2255 | spin_unlock_irqrestore(&se_sess->sess_cmd_lock, flags); |
| 2256 | return; | ||
| 2257 | } | ||
| 2255 | se_sess->sess_tearing_down = 1; | 2258 | se_sess->sess_tearing_down = 1; |
| 2259 | list_splice_init(&se_sess->sess_cmd_list, &se_sess->sess_wait_list); | ||
| 2256 | 2260 | ||
| 2257 | list_for_each_entry(se_cmd, &se_sess->sess_cmd_list, se_cmd_list) | 2261 | list_for_each_entry(se_cmd, &se_sess->sess_wait_list, se_cmd_list) |
| 2258 | se_cmd->cmd_wait_set = 1; | 2262 | se_cmd->cmd_wait_set = 1; |
| 2259 | 2263 | ||
| 2260 | spin_unlock_irqrestore(&se_sess->sess_cmd_lock, flags); | 2264 | spin_unlock_irqrestore(&se_sess->sess_cmd_lock, flags); |
| @@ -2267,9 +2271,10 @@ EXPORT_SYMBOL(target_sess_cmd_list_set_waiting); | |||
| 2267 | void target_wait_for_sess_cmds(struct se_session *se_sess) | 2271 | void target_wait_for_sess_cmds(struct se_session *se_sess) |
| 2268 | { | 2272 | { |
| 2269 | struct se_cmd *se_cmd, *tmp_cmd; | 2273 | struct se_cmd *se_cmd, *tmp_cmd; |
| 2274 | unsigned long flags; | ||
| 2270 | 2275 | ||
| 2271 | list_for_each_entry_safe(se_cmd, tmp_cmd, | 2276 | list_for_each_entry_safe(se_cmd, tmp_cmd, |
| 2272 | &se_sess->sess_cmd_list, se_cmd_list) { | 2277 | &se_sess->sess_wait_list, se_cmd_list) { |
| 2273 | list_del(&se_cmd->se_cmd_list); | 2278 | list_del(&se_cmd->se_cmd_list); |
| 2274 | 2279 | ||
| 2275 | pr_debug("Waiting for se_cmd: %p t_state: %d, fabric state:" | 2280 | pr_debug("Waiting for se_cmd: %p t_state: %d, fabric state:" |
| @@ -2283,6 +2288,11 @@ void target_wait_for_sess_cmds(struct se_session *se_sess) | |||
| 2283 | 2288 | ||
| 2284 | se_cmd->se_tfo->release_cmd(se_cmd); | 2289 | se_cmd->se_tfo->release_cmd(se_cmd); |
| 2285 | } | 2290 | } |
| 2291 | |||
| 2292 | spin_lock_irqsave(&se_sess->sess_cmd_lock, flags); | ||
| 2293 | WARN_ON(!list_empty(&se_sess->sess_cmd_list)); | ||
| 2294 | spin_unlock_irqrestore(&se_sess->sess_cmd_lock, flags); | ||
| 2295 | |||
| 2286 | } | 2296 | } |
| 2287 | EXPORT_SYMBOL(target_wait_for_sess_cmds); | 2297 | EXPORT_SYMBOL(target_wait_for_sess_cmds); |
| 2288 | 2298 | ||
diff --git a/include/target/target_core_base.h b/include/target/target_core_base.h index e773dfa5f98f..4ea4f985f394 100644 --- a/include/target/target_core_base.h +++ b/include/target/target_core_base.h | |||
| @@ -543,6 +543,7 @@ struct se_session { | |||
| 543 | struct list_head sess_list; | 543 | struct list_head sess_list; |
| 544 | struct list_head sess_acl_list; | 544 | struct list_head sess_acl_list; |
| 545 | struct list_head sess_cmd_list; | 545 | struct list_head sess_cmd_list; |
| 546 | struct list_head sess_wait_list; | ||
| 546 | spinlock_t sess_cmd_lock; | 547 | spinlock_t sess_cmd_lock; |
| 547 | struct kref sess_kref; | 548 | struct kref sess_kref; |
| 548 | }; | 549 | }; |
