mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 02:30:34 +02:00 
			
		
		
		
	scsi: core: No retries on abort success
Add a new optional routine, eh_should_retry_cmd(), in scsi_host_template that allows the transport to decide if a cmd is retryable. Return true if the transport is in a state the cmd should be retried on. Update scmd_eh_abort_handler() and scsi_eh_flush_done_q() to both call scsi_eh_should_retry_cmd() to check whether the command needs to be retried. The above changes were based on a patch by Mike Christie. Link: https://lore.kernel.org/r/1609969748-17684-3-git-send-email-muneendra.kumar@broadcom.com Reviewed-by: Himanshu Madhani <himanshu.madhani@oracle.com> Reviewed-by: Ewan D. Milne <emilne@redhat.com> Reviewed-by: Hannes Reinecke <hare@suse.de> Signed-off-by: Muneendra Kumar <muneendra.kumar@broadcom.com> Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
This commit is contained in:
		
							parent
							
								
									962c8dcdd5
								
							
						
					
					
						commit
						60bee27ba2
					
				
					 2 changed files with 21 additions and 2 deletions
				
			
		| 
						 | 
					@ -124,6 +124,17 @@ static bool scsi_cmd_retry_allowed(struct scsi_cmnd *cmd)
 | 
				
			||||||
	return ++cmd->retries <= cmd->allowed;
 | 
						return ++cmd->retries <= cmd->allowed;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static bool scsi_eh_should_retry_cmd(struct scsi_cmnd *cmd)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						struct scsi_device *sdev = cmd->device;
 | 
				
			||||||
 | 
						struct Scsi_Host *host = sdev->host;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (host->hostt->eh_should_retry_cmd)
 | 
				
			||||||
 | 
							return  host->hostt->eh_should_retry_cmd(cmd);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return true;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * scmd_eh_abort_handler - Handle command aborts
 | 
					 * scmd_eh_abort_handler - Handle command aborts
 | 
				
			||||||
 * @work:	command to be aborted.
 | 
					 * @work:	command to be aborted.
 | 
				
			||||||
| 
						 | 
					@ -159,7 +170,8 @@ scmd_eh_abort_handler(struct work_struct *work)
 | 
				
			||||||
						    "eh timeout, not retrying "
 | 
											    "eh timeout, not retrying "
 | 
				
			||||||
						    "aborted command\n"));
 | 
											    "aborted command\n"));
 | 
				
			||||||
			} else if (!scsi_noretry_cmd(scmd) &&
 | 
								} else if (!scsi_noretry_cmd(scmd) &&
 | 
				
			||||||
				   scsi_cmd_retry_allowed(scmd)) {
 | 
									   scsi_cmd_retry_allowed(scmd) &&
 | 
				
			||||||
 | 
									scsi_eh_should_retry_cmd(scmd)) {
 | 
				
			||||||
				SCSI_LOG_ERROR_RECOVERY(3,
 | 
									SCSI_LOG_ERROR_RECOVERY(3,
 | 
				
			||||||
					scmd_printk(KERN_WARNING, scmd,
 | 
										scmd_printk(KERN_WARNING, scmd,
 | 
				
			||||||
						    "retry aborted command\n"));
 | 
											    "retry aborted command\n"));
 | 
				
			||||||
| 
						 | 
					@ -2111,7 +2123,8 @@ void scsi_eh_flush_done_q(struct list_head *done_q)
 | 
				
			||||||
	list_for_each_entry_safe(scmd, next, done_q, eh_entry) {
 | 
						list_for_each_entry_safe(scmd, next, done_q, eh_entry) {
 | 
				
			||||||
		list_del_init(&scmd->eh_entry);
 | 
							list_del_init(&scmd->eh_entry);
 | 
				
			||||||
		if (scsi_device_online(scmd->device) &&
 | 
							if (scsi_device_online(scmd->device) &&
 | 
				
			||||||
		    !scsi_noretry_cmd(scmd) && scsi_cmd_retry_allowed(scmd)) {
 | 
							    !scsi_noretry_cmd(scmd) && scsi_cmd_retry_allowed(scmd) &&
 | 
				
			||||||
 | 
								scsi_eh_should_retry_cmd(scmd)) {
 | 
				
			||||||
			SCSI_LOG_ERROR_RECOVERY(3,
 | 
								SCSI_LOG_ERROR_RECOVERY(3,
 | 
				
			||||||
				scmd_printk(KERN_INFO, scmd,
 | 
									scmd_printk(KERN_INFO, scmd,
 | 
				
			||||||
					     "%s: flush retry cmd\n",
 | 
										     "%s: flush retry cmd\n",
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -314,6 +314,12 @@ struct scsi_host_template {
 | 
				
			||||||
	 * Status: OPTIONAL
 | 
						 * Status: OPTIONAL
 | 
				
			||||||
	 */
 | 
						 */
 | 
				
			||||||
	enum blk_eh_timer_return (*eh_timed_out)(struct scsi_cmnd *);
 | 
						enum blk_eh_timer_return (*eh_timed_out)(struct scsi_cmnd *);
 | 
				
			||||||
 | 
						/*
 | 
				
			||||||
 | 
						 * Optional routine that allows the transport to decide if a cmd
 | 
				
			||||||
 | 
						 * is retryable. Return true if the transport is in a state the
 | 
				
			||||||
 | 
						 * cmd should be retried on.
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						bool (*eh_should_retry_cmd)(struct scsi_cmnd *scmd);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* This is an optional routine that allows transport to initiate
 | 
						/* This is an optional routine that allows transport to initiate
 | 
				
			||||||
	 * LLD adapter or firmware reset using sysfs attribute.
 | 
						 * LLD adapter or firmware reset using sysfs attribute.
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue