@@ -1068,7 +1068,7 @@ static int shmem_getattr(struct mnt_idmap *idmap,
1068
1068
stat -> attributes_mask |= (STATX_ATTR_APPEND |
1069
1069
STATX_ATTR_IMMUTABLE |
1070
1070
STATX_ATTR_NODUMP );
1071
- generic_fillattr (& nop_mnt_idmap , inode , stat );
1071
+ generic_fillattr (idmap , inode , stat );
1072
1072
1073
1073
if (shmem_is_huge (NULL , inode , 0 , false))
1074
1074
stat -> blksize = HPAGE_PMD_SIZE ;
@@ -1091,7 +1091,7 @@ static int shmem_setattr(struct mnt_idmap *idmap,
1091
1091
bool update_mtime = false;
1092
1092
bool update_ctime = true;
1093
1093
1094
- error = setattr_prepare (& nop_mnt_idmap , dentry , attr );
1094
+ error = setattr_prepare (idmap , dentry , attr );
1095
1095
if (error )
1096
1096
return error ;
1097
1097
@@ -1129,9 +1129,9 @@ static int shmem_setattr(struct mnt_idmap *idmap,
1129
1129
}
1130
1130
}
1131
1131
1132
- setattr_copy (& nop_mnt_idmap , inode , attr );
1132
+ setattr_copy (idmap , inode , attr );
1133
1133
if (attr -> ia_valid & ATTR_MODE )
1134
- error = posix_acl_chmod (& nop_mnt_idmap , dentry , inode -> i_mode );
1134
+ error = posix_acl_chmod (idmap , dentry , inode -> i_mode );
1135
1135
if (!error && update_ctime ) {
1136
1136
inode -> i_ctime = current_time (inode );
1137
1137
if (update_mtime )
@@ -2329,8 +2329,9 @@ static void shmem_set_inode_flags(struct inode *inode, unsigned int fsflags)
2329
2329
#define shmem_initxattrs NULL
2330
2330
#endif
2331
2331
2332
- static struct inode * shmem_get_inode (struct super_block * sb , struct inode * dir ,
2333
- umode_t mode , dev_t dev , unsigned long flags )
2332
+ static struct inode * shmem_get_inode (struct mnt_idmap * idmap , struct super_block * sb ,
2333
+ struct inode * dir , umode_t mode , dev_t dev ,
2334
+ unsigned long flags )
2334
2335
{
2335
2336
struct inode * inode ;
2336
2337
struct shmem_inode_info * info ;
@@ -2343,7 +2344,7 @@ static struct inode *shmem_get_inode(struct super_block *sb, struct inode *dir,
2343
2344
inode = new_inode (sb );
2344
2345
if (inode ) {
2345
2346
inode -> i_ino = ino ;
2346
- inode_init_owner (& nop_mnt_idmap , inode , dir , mode );
2347
+ inode_init_owner (idmap , inode , dir , mode );
2347
2348
inode -> i_blocks = 0 ;
2348
2349
inode -> i_atime = inode -> i_mtime = inode -> i_ctime = current_time (inode );
2349
2350
inode -> i_generation = get_random_u32 ();
@@ -2921,7 +2922,7 @@ shmem_mknod(struct mnt_idmap *idmap, struct inode *dir,
2921
2922
struct inode * inode ;
2922
2923
int error = - ENOSPC ;
2923
2924
2924
- inode = shmem_get_inode (dir -> i_sb , dir , mode , dev , VM_NORESERVE );
2925
+ inode = shmem_get_inode (idmap , dir -> i_sb , dir , mode , dev , VM_NORESERVE );
2925
2926
if (inode ) {
2926
2927
error = simple_acl_create (dir , inode );
2927
2928
if (error )
@@ -2952,7 +2953,7 @@ shmem_tmpfile(struct mnt_idmap *idmap, struct inode *dir,
2952
2953
struct inode * inode ;
2953
2954
int error = - ENOSPC ;
2954
2955
2955
- inode = shmem_get_inode (dir -> i_sb , dir , mode , 0 , VM_NORESERVE );
2956
+ inode = shmem_get_inode (idmap , dir -> i_sb , dir , mode , 0 , VM_NORESERVE );
2956
2957
if (inode ) {
2957
2958
error = security_inode_init_security (inode , dir ,
2958
2959
NULL ,
@@ -2975,8 +2976,8 @@ static int shmem_mkdir(struct mnt_idmap *idmap, struct inode *dir,
2975
2976
{
2976
2977
int error ;
2977
2978
2978
- if (( error = shmem_mknod (& nop_mnt_idmap , dir , dentry ,
2979
- mode | S_IFDIR , 0 )) )
2979
+ error = shmem_mknod (idmap , dir , dentry , mode | S_IFDIR , 0 );
2980
+ if ( error )
2980
2981
return error ;
2981
2982
inc_nlink (dir );
2982
2983
return 0 ;
@@ -2985,7 +2986,7 @@ static int shmem_mkdir(struct mnt_idmap *idmap, struct inode *dir,
2985
2986
static int shmem_create (struct mnt_idmap * idmap , struct inode * dir ,
2986
2987
struct dentry * dentry , umode_t mode , bool excl )
2987
2988
{
2988
- return shmem_mknod (& nop_mnt_idmap , dir , dentry , mode | S_IFREG , 0 );
2989
+ return shmem_mknod (idmap , dir , dentry , mode | S_IFREG , 0 );
2989
2990
}
2990
2991
2991
2992
/*
@@ -3055,7 +3056,7 @@ static int shmem_whiteout(struct mnt_idmap *idmap,
3055
3056
if (!whiteout )
3056
3057
return - ENOMEM ;
3057
3058
3058
- error = shmem_mknod (& nop_mnt_idmap , old_dir , whiteout ,
3059
+ error = shmem_mknod (idmap , old_dir , whiteout ,
3059
3060
S_IFCHR | WHITEOUT_MODE , WHITEOUT_DEV );
3060
3061
dput (whiteout );
3061
3062
if (error )
@@ -3098,7 +3099,7 @@ static int shmem_rename2(struct mnt_idmap *idmap,
3098
3099
if (flags & RENAME_WHITEOUT ) {
3099
3100
int error ;
3100
3101
3101
- error = shmem_whiteout (& nop_mnt_idmap , old_dir , old_dentry );
3102
+ error = shmem_whiteout (idmap , old_dir , old_dentry );
3102
3103
if (error )
3103
3104
return error ;
3104
3105
}
@@ -3136,7 +3137,7 @@ static int shmem_symlink(struct mnt_idmap *idmap, struct inode *dir,
3136
3137
if (len > PAGE_SIZE )
3137
3138
return - ENAMETOOLONG ;
3138
3139
3139
- inode = shmem_get_inode (dir -> i_sb , dir , S_IFLNK | 0777 , 0 ,
3140
+ inode = shmem_get_inode (idmap , dir -> i_sb , dir , S_IFLNK | 0777 , 0 ,
3140
3141
VM_NORESERVE );
3141
3142
if (!inode )
3142
3143
return - ENOSPC ;
@@ -3819,7 +3820,8 @@ static int shmem_fill_super(struct super_block *sb, struct fs_context *fc)
3819
3820
#endif
3820
3821
uuid_gen (& sb -> s_uuid );
3821
3822
3822
- inode = shmem_get_inode (sb , NULL , S_IFDIR | sbinfo -> mode , 0 , VM_NORESERVE );
3823
+ inode = shmem_get_inode (& nop_mnt_idmap , sb , NULL , S_IFDIR | sbinfo -> mode , 0 ,
3824
+ VM_NORESERVE );
3823
3825
if (!inode )
3824
3826
goto failed ;
3825
3827
inode -> i_uid = sbinfo -> uid ;
@@ -4044,7 +4046,11 @@ static struct file_system_type shmem_fs_type = {
4044
4046
.parameters = shmem_fs_parameters ,
4045
4047
#endif
4046
4048
.kill_sb = kill_litter_super ,
4049
+ #ifdef CONFIG_SHMEM
4050
+ .fs_flags = FS_USERNS_MOUNT | FS_ALLOW_IDMAP ,
4051
+ #else
4047
4052
.fs_flags = FS_USERNS_MOUNT ,
4053
+ #endif
4048
4054
};
4049
4055
4050
4056
void __init shmem_init (void )
@@ -4196,7 +4202,7 @@ EXPORT_SYMBOL_GPL(shmem_truncate_range);
4196
4202
#define shmem_vm_ops generic_file_vm_ops
4197
4203
#define shmem_anon_vm_ops generic_file_vm_ops
4198
4204
#define shmem_file_operations ramfs_file_operations
4199
- #define shmem_get_inode (sb , dir , mode , dev , flags ) ramfs_get_inode(sb, dir, mode, dev)
4205
+ #define shmem_get_inode (idmap , sb , dir , mode , dev , flags ) ramfs_get_inode(sb, dir, mode, dev)
4200
4206
#define shmem_acct_size (flags , size ) 0
4201
4207
#define shmem_unacct_size (flags , size ) do {} while (0)
4202
4208
@@ -4219,8 +4225,11 @@ static struct file *__shmem_file_setup(struct vfsmount *mnt, const char *name, l
4219
4225
if (shmem_acct_size (flags , size ))
4220
4226
return ERR_PTR (- ENOMEM );
4221
4227
4222
- inode = shmem_get_inode (mnt -> mnt_sb , NULL , S_IFREG | S_IRWXUGO , 0 ,
4223
- flags );
4228
+ if (is_idmapped_mnt (mnt ))
4229
+ return ERR_PTR (- EINVAL );
4230
+
4231
+ inode = shmem_get_inode (& nop_mnt_idmap , mnt -> mnt_sb , NULL ,
4232
+ S_IFREG | S_IRWXUGO , 0 , flags );
4224
4233
if (unlikely (!inode )) {
4225
4234
shmem_unacct_size (flags , size );
4226
4235
return ERR_PTR (- ENOSPC );
0 commit comments