diff options
| -rw-r--r-- | include/linux/shmem_fs.h | 2 | ||||
| -rw-r--r-- | mm/shmem.c | 36 | ||||
| -rw-r--r-- | security/keys/big_key.c | 2 |
3 files changed, 32 insertions, 8 deletions
diff --git a/include/linux/shmem_fs.h b/include/linux/shmem_fs.h index 30aa0dc60d75..9d55438bc4ad 100644 --- a/include/linux/shmem_fs.h +++ b/include/linux/shmem_fs.h | |||
| @@ -47,6 +47,8 @@ extern int shmem_init(void); | |||
| 47 | extern int shmem_fill_super(struct super_block *sb, void *data, int silent); | 47 | extern int shmem_fill_super(struct super_block *sb, void *data, int silent); |
| 48 | extern struct file *shmem_file_setup(const char *name, | 48 | extern struct file *shmem_file_setup(const char *name, |
| 49 | loff_t size, unsigned long flags); | 49 | loff_t size, unsigned long flags); |
| 50 | extern struct file *shmem_kernel_file_setup(const char *name, loff_t size, | ||
| 51 | unsigned long flags); | ||
| 50 | extern int shmem_zero_setup(struct vm_area_struct *); | 52 | extern int shmem_zero_setup(struct vm_area_struct *); |
| 51 | extern int shmem_lock(struct file *file, int lock, struct user_struct *user); | 53 | extern int shmem_lock(struct file *file, int lock, struct user_struct *user); |
| 52 | extern void shmem_unlock_mapping(struct address_space *mapping); | 54 | extern void shmem_unlock_mapping(struct address_space *mapping); |
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 | /** |
diff --git a/security/keys/big_key.c b/security/keys/big_key.c index 7f44c3207a9b..8137b27d641d 100644 --- a/security/keys/big_key.c +++ b/security/keys/big_key.c | |||
| @@ -70,7 +70,7 @@ int big_key_instantiate(struct key *key, struct key_preparsed_payload *prep) | |||
| 70 | * | 70 | * |
| 71 | * TODO: Encrypt the stored data with a temporary key. | 71 | * TODO: Encrypt the stored data with a temporary key. |
| 72 | */ | 72 | */ |
| 73 | file = shmem_file_setup("", datalen, 0); | 73 | file = shmem_kernel_file_setup("", datalen, 0); |
| 74 | if (IS_ERR(file)) { | 74 | if (IS_ERR(file)) { |
| 75 | ret = PTR_ERR(file); | 75 | ret = PTR_ERR(file); |
| 76 | goto err_quota; | 76 | goto err_quota; |
