mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 02:30:34 +02:00 
			
		
		
		
	scsi: core: Fix race on creating sense cache
When scsi_init_sense_cache(host) is called concurrently from different
hosts, each code path may find that no cache has been created and
allocate a new one. The lack of locking can lead to potentially
overriding a cache allocated by a different host.
Fix the issue by moving 'mutex_lock(&scsi_sense_cache_mutex)' before
scsi_select_sense_cache().
Fixes: 0a6ac4ee7c ("scsi: respect unchecked_isa_dma for blk-mq")
Cc: Stable <stable@vger.kernel.org>
Cc: Christoph Hellwig <hch@lst.de>
Cc: Hannes Reinecke <hare@suse.com>
Cc: Ewan D. Milne <emilne@redhat.com>
Signed-off-by: Ming Lei <ming.lei@redhat.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
			
			
This commit is contained in:
		
							parent
							
								
									0cdc58580b
								
							
						
					
					
						commit
						f9b0530fa0
					
				
					 1 changed files with 3 additions and 3 deletions
				
			
		| 
						 | 
				
			
			@ -84,11 +84,11 @@ int scsi_init_sense_cache(struct Scsi_Host *shost)
 | 
			
		|||
	struct kmem_cache *cache;
 | 
			
		||||
	int ret = 0;
 | 
			
		||||
 | 
			
		||||
	mutex_lock(&scsi_sense_cache_mutex);
 | 
			
		||||
	cache = scsi_select_sense_cache(shost->unchecked_isa_dma);
 | 
			
		||||
	if (cache)
 | 
			
		||||
		return 0;
 | 
			
		||||
		goto exit;
 | 
			
		||||
 | 
			
		||||
	mutex_lock(&scsi_sense_cache_mutex);
 | 
			
		||||
	if (shost->unchecked_isa_dma) {
 | 
			
		||||
		scsi_sense_isadma_cache =
 | 
			
		||||
			kmem_cache_create("scsi_sense_cache(DMA)",
 | 
			
		||||
| 
						 | 
				
			
			@ -104,7 +104,7 @@ int scsi_init_sense_cache(struct Scsi_Host *shost)
 | 
			
		|||
		if (!scsi_sense_cache)
 | 
			
		||||
			ret = -ENOMEM;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
 exit:
 | 
			
		||||
	mutex_unlock(&scsi_sense_cache_mutex);
 | 
			
		||||
	return ret;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue