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
					
				| @ -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)); | 	struct proc_dir_entry *pde = PDE(file_inode(file)); | ||||||
| 	unsigned long rv = -EIO; | 	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)) { | 	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) | 		if (get_unmapped_area) | ||||||
| 			rv = get_unmapped_area(file, orig_addr, len, pgoff, flags); | 			rv = get_unmapped_area(file, orig_addr, len, pgoff, flags); | ||||||
| 		unuse_pde(pde); | 		unuse_pde(pde); | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user