diff options
Diffstat (limited to 'mm/shmem.c')
| -rw-r--r-- | mm/shmem.c | 36 |
1 files changed, 29 insertions, 7 deletions
diff --git a/mm/shmem.c b/mm/shmem.c index 8297623fcaed..902a14842b74 100644 --- a/mm/shmem.c +++ b/mm/shmem.c | |||
| @@ -2918,13 +2918,8 @@ static struct dentry_operations anon_ops = { | |||
| 2918 | .d_dname = simple_dname | 2918 | .d_dname = simple_dname |
| 2919 | }; | 2919 | }; |
| 2920 | 2920 | ||
| 2921 | /** | 2921 | static struct file *__shmem_file_setup(const char *name, loff_t size, |
| 2922 | * shmem_file_setup - get an unlinked file living in tmpfs | 2922 | unsigned long flags, unsigned int i_flags) |
| 2923 | * @name: name for dentry (to be seen in /proc/<pid>/maps | ||
| 2924 | * @size: size to be set for the file | ||
| 2925 | * @flags: VM_NORESERVE suppresses pre-accounting of the entire object size | ||
| 2926 | */ | ||
| 2927 | struct file *shmem_file_setup(const char *name, loff_t size, unsigned long flags) | ||
| 2928 | { | 2923 | { |
| 2929 | struct file *res; | 2924 | struct file *res; |
| 2930 | struct inode *inode; | 2925 | struct inode *inode; |
| @@ -2957,6 +2952,7 @@ struct file *shmem_file_setup(const char *name, loff_t size, unsigned long flags | |||
| 2957 | if (!inode) | 2952 | if (!inode) |
| 2958 | goto put_dentry; | 2953 | goto put_dentry; |
| 2959 | 2954 | ||
| 2955 | inode->i_flags |= i_flags; | ||
| 2960 | d_instantiate(path.dentry, inode); | 2956 | d_instantiate(path.dentry, inode); |
| 2961 | inode->i_size = size; | 2957 | inode->i_size = size; |
| 2962 | clear_nlink(inode); /* It is unlinked */ | 2958 | clear_nlink(inode); /* It is unlinked */ |
| @@ -2977,6 +2973,32 @@ put_memory: | |||
| 2977 | shmem_unacct_size(flags, size); | 2973 | shmem_unacct_size(flags, size); |
| 2978 | return res; | 2974 | return res; |
| 2979 | } | 2975 | } |
| 2976 | |||
| 2977 | /** | ||
| 2978 | * shmem_kernel_file_setup - get an unlinked file living in tmpfs which must be | ||
| 2979 | * kernel internal. There will be NO LSM permission checks against the | ||
| 2980 | * underlying inode. So users of this interface must do LSM checks at a | ||
| 2981 | * higher layer. The one user is the big_key implementation. LSM checks | ||
| 2982 | * are provided at the key level rather than the inode level. | ||
| 2983 | * @name: name for dentry (to be seen in /proc/<pid>/maps | ||
| 2984 | * @size: size to be set for the file | ||
| 2985 | * @flags: VM_NORESERVE suppresses pre-accounting of the entire object size | ||
| 2986 | */ | ||
| 2987 | struct file *shmem_kernel_file_setup(const char *name, loff_t size, unsigned long flags) | ||
| 2988 | { | ||
| 2989 | return __shmem_file_setup(name, size, flags, S_PRIVATE); | ||
| 2990 | } | ||
| 2991 | |||
| 2992 | /** | ||
| 2993 | * shmem_file_setup - get an unlinked file living in tmpfs | ||
| 2994 | * @name: name for dentry (to be seen in /proc/<pid>/maps | ||
| 2995 | * @size: size to be set for the file | ||
| 2996 | * @flags: VM_NORESERVE suppresses pre-accounting of the entire object size | ||
| 2997 | */ | ||
| 2998 | struct file *shmem_file_setup(const char *name, loff_t size, unsigned long flags) | ||
| 2999 | { | ||
| 3000 | return __shmem_file_setup(name, size, flags, 0); | ||
| 3001 | } | ||
| 2980 | EXPORT_SYMBOL_GPL(shmem_file_setup); | 3002 | EXPORT_SYMBOL_GPL(shmem_file_setup); |
| 2981 | 3003 | ||
| 2982 | /** | 3004 | /** |
