mirror of
				git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
				synced 2025-09-18 22:14:16 +00:00 
			
		
		
		
	scsi: aacraid: use scsi_host_busy_iter() to wait for outstanding commands
Instead of traversing the list of possible commands by hands we should be using scsi_host_busy_iter() to figure out if there are outstanding commands. Link: https://lore.kernel.org/r/20200228075318.91255-12-hare@suse.de Reviewed-by: Christoph Hellwig <hch@lst.de> Acked-by: Balsundar P < Balsundar.P@microchip.com> Signed-off-by: Hannes Reinecke <hare@suse.de> Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
This commit is contained in:
		
							parent
							
								
									dcece99e86
								
							
						
					
					
						commit
						f4a0c9dbc6
					
				
					 1 changed files with 17 additions and 18 deletions
				
			
		|  | @ -272,36 +272,35 @@ static void aac_queue_init(struct aac_dev * dev, struct aac_queue * q, u32 *mem, | |||
| 	q->entries = qsize; | ||||
| } | ||||
| 
 | ||||
| static bool wait_for_io_iter(struct scsi_cmnd *cmd, void *data, bool rsvd) | ||||
| { | ||||
| 	int *active = data; | ||||
| 
 | ||||
| 	if (cmd->SCp.phase == AAC_OWNER_FIRMWARE) | ||||
| 		*active = *active + 1; | ||||
| 	return true; | ||||
| } | ||||
| static void aac_wait_for_io_completion(struct aac_dev *aac) | ||||
| { | ||||
| 	unsigned long flagv = 0; | ||||
| 	int i = 0; | ||||
| 	int i = 0, active; | ||||
| 
 | ||||
| 	for (i = 60; i; --i) { | ||||
| 		struct scsi_device *dev; | ||||
| 		struct scsi_cmnd *command; | ||||
| 		int active = 0; | ||||
| 
 | ||||
| 		__shost_for_each_device(dev, aac->scsi_host_ptr) { | ||||
| 			spin_lock_irqsave(&dev->list_lock, flagv); | ||||
| 			list_for_each_entry(command, &dev->cmd_list, list) { | ||||
| 				if (command->SCp.phase == AAC_OWNER_FIRMWARE) { | ||||
| 					active++; | ||||
| 					break; | ||||
| 				} | ||||
| 			} | ||||
| 			spin_unlock_irqrestore(&dev->list_lock, flagv); | ||||
| 			if (active) | ||||
| 				break; | ||||
| 
 | ||||
| 		} | ||||
| 		active = 0; | ||||
| 		scsi_host_busy_iter(aac->scsi_host_ptr, | ||||
| 				    wait_for_io_iter, &active); | ||||
| 		/*
 | ||||
| 		 * We can exit If all the commands are complete | ||||
| 		 */ | ||||
| 		if (active == 0) | ||||
| 			break; | ||||
| 		dev_info(&aac->pdev->dev, | ||||
| 			 "Wait for %d commands to complete\n", active); | ||||
| 		ssleep(1); | ||||
| 	} | ||||
| 	if (active) | ||||
| 		dev_err(&aac->pdev->dev, | ||||
| 			"%d outstanding commands during shutdown\n", active); | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  |  | |||
		Loading…
	
	Add table
		
		Reference in a new issue
	
	 Hannes Reinecke
						Hannes Reinecke