procfs: also fix proc_reg_get_unmapped_area() for !MMU case
Commitfad1a86e25
("procfs: call default get_unmapped_area on MMU-present architectures"), as its title says, took care of only the MMU case, leaving the !MMU side still in the regressed state (returning -EIO in all cases where pde->proc_fops->get_unmapped_area is NULL). From thefad1a86e25
changelog: "Commitc4fe244857
("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" Signed-off-by: Jan Beulich <jbeulich@suse.com> Cc: HATAYAMA Daisuke <d.hatayama@jp.fujitsu.com> Cc: Alexey Dobriyan <adobriyan@gmail.com> Cc: David S. Miller <davem@davemloft.net> Cc: <stable@vger.kernel.org> [3.12.x] Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
a0d8b00a33
commit
ae5758a1a7
1 changed files with 9 additions and 5 deletions
|
@ -292,16 +292,20 @@ proc_reg_get_unmapped_area(struct file *file, unsigned long orig_addr,
|
||||||
{
|
{
|
||||||
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_area)(struct file *, unsigned long, unsigned long,
|
|
||||||
unsigned long, unsigned long) = NULL;
|
|
||||||
if (use_pde(pde)) {
|
if (use_pde(pde)) {
|
||||||
|
typeof(proc_reg_get_unmapped_area) *get_area;
|
||||||
|
|
||||||
|
get_area = pde->proc_fops->get_unmapped_area;
|
||||||
#ifdef CONFIG_MMU
|
#ifdef CONFIG_MMU
|
||||||
get_area = current->mm->get_unmapped_area;
|
if (!get_area)
|
||||||
|
get_area = current->mm->get_unmapped_area;
|
||||||
#endif
|
#endif
|
||||||
if (pde->proc_fops->get_unmapped_area)
|
|
||||||
get_area = pde->proc_fops->get_unmapped_area;
|
|
||||||
if (get_area)
|
if (get_area)
|
||||||
rv = get_area(file, orig_addr, len, pgoff, flags);
|
rv = get_area(file, orig_addr, len, pgoff, flags);
|
||||||
|
else
|
||||||
|
rv = orig_addr;
|
||||||
unuse_pde(pde);
|
unuse_pde(pde);
|
||||||
}
|
}
|
||||||
return rv;
|
return rv;
|
||||||
|
|
Loading…
Reference in a new issue