mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 02:30:34 +02:00 
			
		
		
		
	procfs: call default get_unmapped_area on MMU-present architectures
Commit c4fe244857 ("sparc: fix PCI device proc file mmap(2)") added
proc_reg_get_unmapped_area in proc_reg_file_ops and
proc_reg_file_ops_no_compat, by which now mmap always returns EIO if
get_unmapped_area method is not defined for the target procfs file,
which causes regression of mmap on /proc/vmcore.
To address this issue, like get_unmapped_area(), call default
current->mm->get_unmapped_area on MMU-present architectures if
pde->proc_fops->get_unmapped_area, i.e.  the one in actual file
operation in the procfs file, is not defined.
Reported-by: Michael Holzheu <holzheu@linux.vnet.ibm.com>
Signed-off-by: HATAYAMA Daisuke <d.hatayama@jp.fujitsu.com>
Cc: Alexey Dobriyan <adobriyan@gmail.com>
Cc: David S. Miller <davem@davemloft.net>
Tested-by: Michael Holzheu <holzheu@linux.vnet.ibm.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
			
			
This commit is contained in:
		
							parent
							
								
									2cbe3b0af8
								
							
						
					
					
						commit
						fad1a86e25
					
				
					 1 changed files with 6 additions and 2 deletions
				
			
		| 
						 | 
				
			
			@ -289,9 +289,13 @@ static unsigned long proc_reg_get_unmapped_area(struct file *file, unsigned long
 | 
			
		|||
{
 | 
			
		||||
	struct proc_dir_entry *pde = PDE(file_inode(file));
 | 
			
		||||
	unsigned long rv = -EIO;
 | 
			
		||||
	unsigned long (*get_unmapped_area)(struct file *, unsigned long, unsigned long, unsigned long, unsigned long);
 | 
			
		||||
	unsigned long (*get_unmapped_area)(struct file *, unsigned long, unsigned long, unsigned long, unsigned long) = NULL;
 | 
			
		||||
	if (use_pde(pde)) {
 | 
			
		||||
		get_unmapped_area = pde->proc_fops->get_unmapped_area;
 | 
			
		||||
#ifdef CONFIG_MMU
 | 
			
		||||
		get_unmapped_area = current->mm->get_unmapped_area;
 | 
			
		||||
#endif
 | 
			
		||||
		if (pde->proc_fops->get_unmapped_area)
 | 
			
		||||
			get_unmapped_area = pde->proc_fops->get_unmapped_area;
 | 
			
		||||
		if (get_unmapped_area)
 | 
			
		||||
			rv = get_unmapped_area(file, orig_addr, len, pgoff, flags);
 | 
			
		||||
		unuse_pde(pde);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue