Skip to content

Commit

Permalink
procfs: also fix proc_reg_get_unmapped_area() for !MMU case
Browse files Browse the repository at this point in the history
Commit fad1a86 ("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 the fad1a86 changelog:

 "Commit c4fe244 ("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 <[email protected]>
Cc: HATAYAMA Daisuke <[email protected]>
Cc: Alexey Dobriyan <[email protected]>
Cc: David S. Miller <[email protected]>
Cc: <[email protected]>	[3.12.x]
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
  • Loading branch information
jbeulich authored and torvalds committed Dec 13, 2013
1 parent a0d8b00 commit ae5758a
Showing 1 changed file with 9 additions and 5 deletions.
14 changes: 9 additions & 5 deletions fs/proc/inode.c
Original file line number Diff line number Diff line change
Expand Up @@ -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));
unsigned long rv = -EIO;
unsigned long (*get_area)(struct file *, unsigned long, unsigned long,
unsigned long, unsigned long) = NULL;

if (use_pde(pde)) {
typeof(proc_reg_get_unmapped_area) *get_area;

get_area = pde->proc_fops->get_unmapped_area;
#ifdef CONFIG_MMU
get_area = current->mm->get_unmapped_area;
if (!get_area)
get_area = current->mm->get_unmapped_area;
#endif
if (pde->proc_fops->get_unmapped_area)
get_area = pde->proc_fops->get_unmapped_area;

if (get_area)
rv = get_area(file, orig_addr, len, pgoff, flags);
else
rv = orig_addr;
unuse_pde(pde);
}
return rv;
Expand Down

0 comments on commit ae5758a

Please sign in to comment.