Merge branch 'master' into next
Conflicts: fs/namei.c Manually merged per: diff --cc fs/namei.c index 734f2b5,bbc15c2..0000000 --- a/fs/namei.c +++ b/fs/namei.c @@@ -860,9 -848,8 +849,10 @@@ static int __link_path_walk(const char nd->flags |= LOOKUP_CONTINUE; err = exec_permission_lite(inode); if (err == -EAGAIN) - err = vfs_permission(nd, MAY_EXEC); + err = inode_permission(nd->path.dentry->d_inode, + MAY_EXEC); + if (!err) + err = ima_path_check(&nd->path, MAY_EXEC); if (err) break; @@@ -1525,14 -1506,9 +1509,14 @@@ int may_open(struct path *path, int acc flag &= ~O_TRUNC; } - error = vfs_permission(nd, acc_mode); + error = inode_permission(inode, acc_mode); if (error) return error; + - error = ima_path_check(&nd->path, ++ error = ima_path_check(path, + acc_mode & (MAY_READ | MAY_WRITE | MAY_EXEC)); + if (error) + return error; /* * An append-only file must be opened in append mode for writing. */ Signed-off-by: James Morris <jmorris@namei.org>
This commit is contained in:
104
mm/shmem.c
104
mm/shmem.c
@@ -14,31 +14,39 @@
|
||||
* Copyright (c) 2004, Luke Kenneth Casson Leighton <lkcl@lkcl.net>
|
||||
* Copyright (c) 2004 Red Hat, Inc., James Morris <jmorris@redhat.com>
|
||||
*
|
||||
* tiny-shmem:
|
||||
* Copyright (c) 2004, 2008 Matt Mackall <mpm@selenic.com>
|
||||
*
|
||||
* This file is released under the GPL.
|
||||
*/
|
||||
|
||||
#include <linux/fs.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/vfs.h>
|
||||
#include <linux/mount.h>
|
||||
#include <linux/file.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/swap.h>
|
||||
|
||||
static struct vfsmount *shm_mnt;
|
||||
|
||||
#ifdef CONFIG_SHMEM
|
||||
/*
|
||||
* This virtual memory filesystem is heavily based on the ramfs. It
|
||||
* extends ramfs by the ability to use swap and honor resource limits
|
||||
* which makes it a completely usable filesystem.
|
||||
*/
|
||||
|
||||
#include <linux/module.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/fs.h>
|
||||
#include <linux/xattr.h>
|
||||
#include <linux/exportfs.h>
|
||||
#include <linux/generic_acl.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/mman.h>
|
||||
#include <linux/file.h>
|
||||
#include <linux/swap.h>
|
||||
#include <linux/pagemap.h>
|
||||
#include <linux/string.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/backing-dev.h>
|
||||
#include <linux/shmem_fs.h>
|
||||
#include <linux/mount.h>
|
||||
#include <linux/writeback.h>
|
||||
#include <linux/vfs.h>
|
||||
#include <linux/blkdev.h>
|
||||
@@ -921,7 +929,11 @@ found:
|
||||
error = 1;
|
||||
if (!inode)
|
||||
goto out;
|
||||
/* Precharge page using GFP_KERNEL while we can wait */
|
||||
/*
|
||||
* Charge page using GFP_KERNEL while we can wait.
|
||||
* Charged back to the user(not to caller) when swap account is used.
|
||||
* add_to_page_cache() will be called with GFP_NOWAIT.
|
||||
*/
|
||||
error = mem_cgroup_cache_charge(page, current->mm, GFP_KERNEL);
|
||||
if (error)
|
||||
goto out;
|
||||
@@ -1313,15 +1325,19 @@ repeat:
|
||||
} else {
|
||||
shmem_swp_unmap(entry);
|
||||
spin_unlock(&info->lock);
|
||||
unlock_page(swappage);
|
||||
page_cache_release(swappage);
|
||||
if (error == -ENOMEM) {
|
||||
/* allow reclaim from this memory cgroup */
|
||||
error = mem_cgroup_shrink_usage(current->mm,
|
||||
error = mem_cgroup_shrink_usage(swappage,
|
||||
current->mm,
|
||||
gfp);
|
||||
if (error)
|
||||
if (error) {
|
||||
unlock_page(swappage);
|
||||
page_cache_release(swappage);
|
||||
goto failed;
|
||||
}
|
||||
}
|
||||
unlock_page(swappage);
|
||||
page_cache_release(swappage);
|
||||
goto repeat;
|
||||
}
|
||||
} else if (sgp == SGP_READ && !filepage) {
|
||||
@@ -1372,7 +1388,7 @@ repeat:
|
||||
|
||||
/* Precharge page while we can wait, compensate after */
|
||||
error = mem_cgroup_cache_charge(filepage, current->mm,
|
||||
gfp & ~__GFP_HIGHMEM);
|
||||
GFP_KERNEL);
|
||||
if (error) {
|
||||
page_cache_release(filepage);
|
||||
shmem_unacct_blocks(info->flags, 1);
|
||||
@@ -1445,7 +1461,6 @@ static int shmem_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
|
||||
if (error)
|
||||
return ((error == -ENOMEM) ? VM_FAULT_OOM : VM_FAULT_SIGBUS);
|
||||
|
||||
mark_page_accessed(vmf->page);
|
||||
return ret | VM_FAULT_LOCKED;
|
||||
}
|
||||
|
||||
@@ -2487,7 +2502,6 @@ static struct file_system_type tmpfs_fs_type = {
|
||||
.get_sb = shmem_get_sb,
|
||||
.kill_sb = kill_litter_super,
|
||||
};
|
||||
static struct vfsmount *shm_mnt;
|
||||
|
||||
static int __init init_tmpfs(void)
|
||||
{
|
||||
@@ -2526,7 +2540,51 @@ out4:
|
||||
shm_mnt = ERR_PTR(error);
|
||||
return error;
|
||||
}
|
||||
module_init(init_tmpfs)
|
||||
|
||||
#else /* !CONFIG_SHMEM */
|
||||
|
||||
/*
|
||||
* tiny-shmem: simple shmemfs and tmpfs using ramfs code
|
||||
*
|
||||
* This is intended for small system where the benefits of the full
|
||||
* shmem code (swap-backed and resource-limited) are outweighed by
|
||||
* their complexity. On systems without swap this code should be
|
||||
* effectively equivalent, but much lighter weight.
|
||||
*/
|
||||
|
||||
#include <linux/ramfs.h>
|
||||
|
||||
static struct file_system_type tmpfs_fs_type = {
|
||||
.name = "tmpfs",
|
||||
.get_sb = ramfs_get_sb,
|
||||
.kill_sb = kill_litter_super,
|
||||
};
|
||||
|
||||
static int __init init_tmpfs(void)
|
||||
{
|
||||
BUG_ON(register_filesystem(&tmpfs_fs_type) != 0);
|
||||
|
||||
shm_mnt = kern_mount(&tmpfs_fs_type);
|
||||
BUG_ON(IS_ERR(shm_mnt));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int shmem_unuse(swp_entry_t entry, struct page *page)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
#define shmem_file_operations ramfs_file_operations
|
||||
#define shmem_vm_ops generic_file_vm_ops
|
||||
#define shmem_get_inode ramfs_get_inode
|
||||
#define shmem_acct_size(a, b) 0
|
||||
#define shmem_unacct_size(a, b) do {} while (0)
|
||||
#define SHMEM_MAX_BYTES LLONG_MAX
|
||||
|
||||
#endif /* CONFIG_SHMEM */
|
||||
|
||||
/* common code */
|
||||
|
||||
/**
|
||||
* shmem_file_setup - get an unlinked file living in tmpfs
|
||||
@@ -2570,12 +2628,20 @@ struct file *shmem_file_setup(char *name, loff_t size, unsigned long flags)
|
||||
if (!inode)
|
||||
goto close_file;
|
||||
|
||||
SHMEM_I(inode)->flags = flags & VM_ACCOUNT;
|
||||
#ifdef CONFIG_SHMEM
|
||||
SHMEM_I(inode)->flags = (flags & VM_NORESERVE) ? 0 : VM_ACCOUNT;
|
||||
#endif
|
||||
d_instantiate(dentry, inode);
|
||||
inode->i_size = size;
|
||||
inode->i_nlink = 0; /* It is unlinked */
|
||||
init_file(file, shm_mnt, dentry, FMODE_WRITE | FMODE_READ,
|
||||
&shmem_file_operations);
|
||||
&shmem_file_operations);
|
||||
|
||||
#ifndef CONFIG_MMU
|
||||
error = ramfs_nommu_expand_for_mapping(inode, size);
|
||||
if (error)
|
||||
goto close_file;
|
||||
#endif
|
||||
return file;
|
||||
|
||||
close_file:
|
||||
@@ -2608,3 +2674,5 @@ int shmem_zero_setup(struct vm_area_struct *vma)
|
||||
vma->vm_ops = &shmem_vm_ops;
|
||||
return 0;
|
||||
}
|
||||
|
||||
module_init(init_tmpfs)
|
||||
|
Reference in New Issue
Block a user