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>
This commit is contained in:
		
					parent
					
						
							
								e1013f1437
							
						
					
				
			
			
				commit
				
					
						1c7b13fe65
					
				
			
		
					 4 changed files with 12 additions and 15 deletions
				
			
		|  | @ -464,7 +464,7 @@ static int tcm_qla2xxx_shutdown_session(struct se_session *se_sess) | ||||||
| 	vha = sess->vha; | 	vha = sess->vha; | ||||||
| 
 | 
 | ||||||
| 	spin_lock_irqsave(&vha->hw->hardware_lock, flags); | 	spin_lock_irqsave(&vha->hw->hardware_lock, flags); | ||||||
| 	target_splice_sess_cmd_list(se_sess); | 	target_sess_cmd_list_set_waiting(se_sess); | ||||||
| 	spin_unlock_irqrestore(&vha->hw->hardware_lock, flags); | 	spin_unlock_irqrestore(&vha->hw->hardware_lock, flags); | ||||||
| 
 | 
 | ||||||
| 	return 1; | 	return 1; | ||||||
|  |  | ||||||
|  | @ -232,7 +232,6 @@ struct se_session *transport_init_session(void) | ||||||
| 	INIT_LIST_HEAD(&se_sess->sess_list); | 	INIT_LIST_HEAD(&se_sess->sess_list); | ||||||
| 	INIT_LIST_HEAD(&se_sess->sess_acl_list); | 	INIT_LIST_HEAD(&se_sess->sess_acl_list); | ||||||
| 	INIT_LIST_HEAD(&se_sess->sess_cmd_list); | 	INIT_LIST_HEAD(&se_sess->sess_cmd_list); | ||||||
| 	INIT_LIST_HEAD(&se_sess->sess_wait_list); |  | ||||||
| 	spin_lock_init(&se_sess->sess_cmd_lock); | 	spin_lock_init(&se_sess->sess_cmd_lock); | ||||||
| 	kref_init(&se_sess->sess_kref); | 	kref_init(&se_sess->sess_kref); | ||||||
| 
 | 
 | ||||||
|  | @ -2478,28 +2477,27 @@ int target_put_sess_cmd(struct se_session *se_sess, struct se_cmd *se_cmd) | ||||||
| } | } | ||||||
| EXPORT_SYMBOL(target_put_sess_cmd); | EXPORT_SYMBOL(target_put_sess_cmd); | ||||||
| 
 | 
 | ||||||
| /* target_splice_sess_cmd_list - Split active cmds into sess_wait_list
 | /* target_sess_cmd_list_set_waiting - Flag all commands in
 | ||||||
|  * @se_sess:	session to split |  *         sess_cmd_list to complete cmd_wait_comp.  Set | ||||||
|  |  *         sess_tearing_down so no more commands are queued. | ||||||
|  |  * @se_sess:	session to flag | ||||||
|  */ |  */ | ||||||
| void target_splice_sess_cmd_list(struct se_session *se_sess) | void target_sess_cmd_list_set_waiting(struct se_session *se_sess) | ||||||
| { | { | ||||||
| 	struct se_cmd *se_cmd; | 	struct se_cmd *se_cmd; | ||||||
| 	unsigned long flags; | 	unsigned long flags; | ||||||
| 
 | 
 | ||||||
| 	WARN_ON(!list_empty(&se_sess->sess_wait_list)); |  | ||||||
| 	INIT_LIST_HEAD(&se_sess->sess_wait_list); |  | ||||||
| 
 |  | ||||||
| 	spin_lock_irqsave(&se_sess->sess_cmd_lock, flags); | 	spin_lock_irqsave(&se_sess->sess_cmd_lock, flags); | ||||||
|  | 
 | ||||||
|  | 	WARN_ON(se_sess->sess_tearing_down); | ||||||
| 	se_sess->sess_tearing_down = 1; | 	se_sess->sess_tearing_down = 1; | ||||||
| 
 | 
 | ||||||
| 	list_splice_init(&se_sess->sess_cmd_list, &se_sess->sess_wait_list); | 	list_for_each_entry(se_cmd, &se_sess->sess_cmd_list, se_cmd_list) | ||||||
| 
 |  | ||||||
| 	list_for_each_entry(se_cmd, &se_sess->sess_wait_list, se_cmd_list) |  | ||||||
| 		se_cmd->cmd_wait_set = 1; | 		se_cmd->cmd_wait_set = 1; | ||||||
| 
 | 
 | ||||||
| 	spin_unlock_irqrestore(&se_sess->sess_cmd_lock, flags); | 	spin_unlock_irqrestore(&se_sess->sess_cmd_lock, flags); | ||||||
| } | } | ||||||
| EXPORT_SYMBOL(target_splice_sess_cmd_list); | EXPORT_SYMBOL(target_sess_cmd_list_set_waiting); | ||||||
| 
 | 
 | ||||||
| /* target_wait_for_sess_cmds - Wait for outstanding descriptors
 | /* target_wait_for_sess_cmds - Wait for outstanding descriptors
 | ||||||
|  * @se_sess:    session to wait for active I/O |  * @se_sess:    session to wait for active I/O | ||||||
|  | @ -2513,7 +2511,7 @@ void target_wait_for_sess_cmds( | ||||||
| 	bool rc = false; | 	bool rc = false; | ||||||
| 
 | 
 | ||||||
| 	list_for_each_entry_safe(se_cmd, tmp_cmd, | 	list_for_each_entry_safe(se_cmd, tmp_cmd, | ||||||
| 				&se_sess->sess_wait_list, se_cmd_list) { | 				&se_sess->sess_cmd_list, se_cmd_list) { | ||||||
| 		list_del(&se_cmd->se_cmd_list); | 		list_del(&se_cmd->se_cmd_list); | ||||||
| 
 | 
 | ||||||
| 		pr_debug("Waiting for se_cmd: %p t_state: %d, fabric state:" | 		pr_debug("Waiting for se_cmd: %p t_state: %d, fabric state:" | ||||||
|  |  | ||||||
|  | @ -613,7 +613,6 @@ struct se_session { | ||||||
| 	struct list_head	sess_list; | 	struct list_head	sess_list; | ||||||
| 	struct list_head	sess_acl_list; | 	struct list_head	sess_acl_list; | ||||||
| 	struct list_head	sess_cmd_list; | 	struct list_head	sess_cmd_list; | ||||||
| 	struct list_head	sess_wait_list; |  | ||||||
| 	spinlock_t		sess_cmd_lock; | 	spinlock_t		sess_cmd_lock; | ||||||
| 	struct kref		sess_kref; | 	struct kref		sess_kref; | ||||||
| }; | }; | ||||||
|  |  | ||||||
|  | @ -122,7 +122,7 @@ int	transport_check_aborted_status(struct se_cmd *, int); | ||||||
| int	transport_send_check_condition_and_sense(struct se_cmd *, u8, int); | int	transport_send_check_condition_and_sense(struct se_cmd *, u8, int); | ||||||
| 
 | 
 | ||||||
| int	target_put_sess_cmd(struct se_session *, struct se_cmd *); | int	target_put_sess_cmd(struct se_session *, struct se_cmd *); | ||||||
| void	target_splice_sess_cmd_list(struct se_session *); | void	target_sess_cmd_list_set_waiting(struct se_session *); | ||||||
| void	target_wait_for_sess_cmds(struct se_session *, int); | void	target_wait_for_sess_cmds(struct se_session *, int); | ||||||
| 
 | 
 | ||||||
| int	core_alua_check_nonop_delay(struct se_cmd *); | int	core_alua_check_nonop_delay(struct se_cmd *); | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Roland Dreier
				Roland Dreier