mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 02:30:34 +02:00 
			
		
		
		
	sg: disable interrupts inside sg_copy_buffer
The callers of sg_copy_buffer must disable interrupts before calling it (since it uses kmap_atomic). Some callers use it on interrupt-disabled code but some need to take the trouble to disable interrupts just for this. No wonder they forget about it and we hit a bug like: http://bugzilla.kernel.org/show_bug.cgi?id=11529 James said that it might be better to disable interrupts inside the function rather than risk the callers getting it wrong. Signed-off-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp> Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
This commit is contained in:
		
							parent
							
								
									2dc75d3c3b
								
							
						
					
					
						commit
						50bed2e286
					
				
					 1 changed files with 4 additions and 0 deletions
				
			
		| 
						 | 
					@ -422,9 +422,12 @@ static size_t sg_copy_buffer(struct scatterlist *sgl, unsigned int nents,
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	unsigned int offset = 0;
 | 
						unsigned int offset = 0;
 | 
				
			||||||
	struct sg_mapping_iter miter;
 | 
						struct sg_mapping_iter miter;
 | 
				
			||||||
 | 
						unsigned long flags;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	sg_miter_start(&miter, sgl, nents, SG_MITER_ATOMIC);
 | 
						sg_miter_start(&miter, sgl, nents, SG_MITER_ATOMIC);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						local_irq_save(flags);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	while (sg_miter_next(&miter) && offset < buflen) {
 | 
						while (sg_miter_next(&miter) && offset < buflen) {
 | 
				
			||||||
		unsigned int len;
 | 
							unsigned int len;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -442,6 +445,7 @@ static size_t sg_copy_buffer(struct scatterlist *sgl, unsigned int nents,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	sg_miter_stop(&miter);
 | 
						sg_miter_stop(&miter);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						local_irq_restore(flags);
 | 
				
			||||||
	return offset;
 | 
						return offset;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue