Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs
Pull vfs changes from Al Viro. "A lot of misc stuff. The obvious groups: * Miklos' atomic_open series; kills the damn abuse of ->d_revalidate() by NFS, which was the major stumbling block for all work in that area. * ripping security_file_mmap() and dealing with deadlocks in the area; sanitizing the neighborhood of vm_mmap()/vm_munmap() in general. * ->encode_fh() switched to saner API; insane fake dentry in mm/cleancache.c gone. * assorted annotations in fs (endianness, __user) * parts of Artem's ->s_dirty work (jff2 and reiserfs parts) * ->update_time() work from Josef. * other bits and pieces all over the place. Normally it would've been in two or three pull requests, but signal.git stuff had eaten a lot of time during this cycle ;-/" Fix up trivial conflicts in Documentation/filesystems/vfs.txt (the 'truncate_range' inode method was removed by the VM changes, the VFS update adds an 'update_time()' method), and in fs/btrfs/ulist.[ch] (due to sparse fix added twice, with other changes nearby). * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs: (95 commits) nfs: don't open in ->d_revalidate vfs: retry last component if opening stale dentry vfs: nameidata_to_filp(): don't throw away file on error vfs: nameidata_to_filp(): inline __dentry_open() vfs: do_dentry_open(): don't put filp vfs: split __dentry_open() vfs: do_last() common post lookup vfs: do_last(): add audit_inode before open vfs: do_last(): only return EISDIR for O_CREAT vfs: do_last(): check LOOKUP_DIRECTORY vfs: do_last(): make ENOENT exit RCU safe vfs: make follow_link check RCU safe vfs: do_last(): use inode variable vfs: do_last(): inline walk_component() vfs: do_last(): make exit RCU safe vfs: split do_lookup() Btrfs: move over to use ->update_time fs: introduce inode operation ->update_time reiserfs: get rid of resierfs_sync_super reiserfs: mark the superblock as dirty a bit later ...
This commit is contained in:
54
mm/mmap.c
54
mm/mmap.c
@@ -971,15 +971,13 @@ static inline unsigned long round_hint_to_min(unsigned long hint)
|
||||
* The caller must hold down_write(¤t->mm->mmap_sem).
|
||||
*/
|
||||
|
||||
static unsigned long do_mmap_pgoff(struct file *file, unsigned long addr,
|
||||
unsigned long do_mmap_pgoff(struct file *file, unsigned long addr,
|
||||
unsigned long len, unsigned long prot,
|
||||
unsigned long flags, unsigned long pgoff)
|
||||
{
|
||||
struct mm_struct * mm = current->mm;
|
||||
struct inode *inode;
|
||||
vm_flags_t vm_flags;
|
||||
int error;
|
||||
unsigned long reqprot = prot;
|
||||
|
||||
/*
|
||||
* Does the application expect PROT_READ to imply PROT_EXEC?
|
||||
@@ -1101,39 +1099,9 @@ static unsigned long do_mmap_pgoff(struct file *file, unsigned long addr,
|
||||
}
|
||||
}
|
||||
|
||||
error = security_file_mmap(file, reqprot, prot, flags, addr, 0);
|
||||
if (error)
|
||||
return error;
|
||||
|
||||
return mmap_region(file, addr, len, flags, vm_flags, pgoff);
|
||||
}
|
||||
|
||||
unsigned long do_mmap(struct file *file, unsigned long addr,
|
||||
unsigned long len, unsigned long prot,
|
||||
unsigned long flag, unsigned long offset)
|
||||
{
|
||||
if (unlikely(offset + PAGE_ALIGN(len) < offset))
|
||||
return -EINVAL;
|
||||
if (unlikely(offset & ~PAGE_MASK))
|
||||
return -EINVAL;
|
||||
return do_mmap_pgoff(file, addr, len, prot, flag, offset >> PAGE_SHIFT);
|
||||
}
|
||||
EXPORT_SYMBOL(do_mmap);
|
||||
|
||||
unsigned long vm_mmap(struct file *file, unsigned long addr,
|
||||
unsigned long len, unsigned long prot,
|
||||
unsigned long flag, unsigned long offset)
|
||||
{
|
||||
unsigned long ret;
|
||||
struct mm_struct *mm = current->mm;
|
||||
|
||||
down_write(&mm->mmap_sem);
|
||||
ret = do_mmap(file, addr, len, prot, flag, offset);
|
||||
up_write(&mm->mmap_sem);
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL(vm_mmap);
|
||||
|
||||
SYSCALL_DEFINE6(mmap_pgoff, unsigned long, addr, unsigned long, len,
|
||||
unsigned long, prot, unsigned long, flags,
|
||||
unsigned long, fd, unsigned long, pgoff)
|
||||
@@ -1165,10 +1133,7 @@ SYSCALL_DEFINE6(mmap_pgoff, unsigned long, addr, unsigned long, len,
|
||||
|
||||
flags &= ~(MAP_EXECUTABLE | MAP_DENYWRITE);
|
||||
|
||||
down_write(¤t->mm->mmap_sem);
|
||||
retval = do_mmap_pgoff(file, addr, len, prot, flags, pgoff);
|
||||
up_write(¤t->mm->mmap_sem);
|
||||
|
||||
retval = vm_mmap_pgoff(file, addr, len, prot, flags, pgoff);
|
||||
if (file)
|
||||
fput(file);
|
||||
out:
|
||||
@@ -1629,7 +1594,9 @@ get_unmapped_area(struct file *file, unsigned long addr, unsigned long len,
|
||||
if (addr & ~PAGE_MASK)
|
||||
return -EINVAL;
|
||||
|
||||
return arch_rebalance_pgtables(addr, len);
|
||||
addr = arch_rebalance_pgtables(addr, len);
|
||||
error = security_mmap_addr(addr);
|
||||
return error ? error : addr;
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL(get_unmapped_area);
|
||||
@@ -1819,7 +1786,7 @@ int expand_downwards(struct vm_area_struct *vma,
|
||||
return -ENOMEM;
|
||||
|
||||
address &= PAGE_MASK;
|
||||
error = security_file_mmap(NULL, 0, 0, 0, address, 1);
|
||||
error = security_mmap_addr(address);
|
||||
if (error)
|
||||
return error;
|
||||
|
||||
@@ -2159,7 +2126,6 @@ int do_munmap(struct mm_struct *mm, unsigned long start, size_t len)
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(do_munmap);
|
||||
|
||||
int vm_munmap(unsigned long start, size_t len)
|
||||
{
|
||||
@@ -2207,10 +2173,6 @@ static unsigned long do_brk(unsigned long addr, unsigned long len)
|
||||
if (!len)
|
||||
return addr;
|
||||
|
||||
error = security_file_mmap(NULL, 0, 0, 0, addr, 1);
|
||||
if (error)
|
||||
return error;
|
||||
|
||||
flags = VM_DATA_DEFAULT_FLAGS | VM_ACCOUNT | mm->def_flags;
|
||||
|
||||
error = get_unmapped_area(NULL, addr, len, 0, MAP_FIXED);
|
||||
@@ -2563,10 +2525,6 @@ int install_special_mapping(struct mm_struct *mm,
|
||||
vma->vm_ops = &special_mapping_vmops;
|
||||
vma->vm_private_data = pages;
|
||||
|
||||
ret = security_file_mmap(NULL, 0, 0, 0, vma->vm_start, 1);
|
||||
if (ret)
|
||||
goto out;
|
||||
|
||||
ret = insert_vm_struct(mm, vma);
|
||||
if (ret)
|
||||
goto out;
|
||||
|
Reference in New Issue
Block a user