@@ -922,7 +922,7 @@ static int hugetlbfs_setattr(struct mnt_idmap *idmap,
922
922
unsigned int ia_valid = attr -> ia_valid ;
923
923
struct hugetlbfs_inode_info * info = HUGETLBFS_I (inode );
924
924
925
- error = setattr_prepare (& nop_mnt_idmap , dentry , attr );
925
+ error = setattr_prepare (idmap , dentry , attr );
926
926
if (error )
927
927
return error ;
928
928
@@ -939,7 +939,7 @@ static int hugetlbfs_setattr(struct mnt_idmap *idmap,
939
939
hugetlb_vmtruncate (inode , newsize );
940
940
}
941
941
942
- setattr_copy (& nop_mnt_idmap , inode , attr );
942
+ setattr_copy (idmap , inode , attr );
943
943
mark_inode_dirty (inode );
944
944
return 0 ;
945
945
}
@@ -974,6 +974,7 @@ static struct inode *hugetlbfs_get_root(struct super_block *sb,
974
974
static struct lock_class_key hugetlbfs_i_mmap_rwsem_key ;
975
975
976
976
static struct inode * hugetlbfs_get_inode (struct super_block * sb ,
977
+ struct mnt_idmap * idmap ,
977
978
struct inode * dir ,
978
979
umode_t mode , dev_t dev )
979
980
{
@@ -995,7 +996,7 @@ static struct inode *hugetlbfs_get_inode(struct super_block *sb,
995
996
struct hugetlbfs_inode_info * info = HUGETLBFS_I (inode );
996
997
997
998
inode -> i_ino = get_next_ino ();
998
- inode_init_owner (& nop_mnt_idmap , inode , dir , mode );
999
+ inode_init_owner (idmap , inode , dir , mode );
999
1000
lockdep_set_class (& inode -> i_mapping -> i_mmap_rwsem ,
1000
1001
& hugetlbfs_i_mmap_rwsem_key );
1001
1002
inode -> i_mapping -> a_ops = & hugetlbfs_aops ;
@@ -1039,7 +1040,7 @@ static int hugetlbfs_mknod(struct mnt_idmap *idmap, struct inode *dir,
1039
1040
{
1040
1041
struct inode * inode ;
1041
1042
1042
- inode = hugetlbfs_get_inode (dir -> i_sb , dir , mode , dev );
1043
+ inode = hugetlbfs_get_inode (dir -> i_sb , idmap , dir , mode , dev );
1043
1044
if (!inode )
1044
1045
return - ENOSPC ;
1045
1046
inode_set_mtime_to_ts (dir , inode_set_ctime_current (dir ));
@@ -1051,7 +1052,7 @@ static int hugetlbfs_mknod(struct mnt_idmap *idmap, struct inode *dir,
1051
1052
static int hugetlbfs_mkdir (struct mnt_idmap * idmap , struct inode * dir ,
1052
1053
struct dentry * dentry , umode_t mode )
1053
1054
{
1054
- int retval = hugetlbfs_mknod (& nop_mnt_idmap , dir , dentry ,
1055
+ int retval = hugetlbfs_mknod (idmap , dir , dentry ,
1055
1056
mode | S_IFDIR , 0 );
1056
1057
if (!retval )
1057
1058
inc_nlink (dir );
@@ -1062,7 +1063,7 @@ static int hugetlbfs_create(struct mnt_idmap *idmap,
1062
1063
struct inode * dir , struct dentry * dentry ,
1063
1064
umode_t mode , bool excl )
1064
1065
{
1065
- return hugetlbfs_mknod (& nop_mnt_idmap , dir , dentry , mode | S_IFREG , 0 );
1066
+ return hugetlbfs_mknod (idmap , dir , dentry , mode | S_IFREG , 0 );
1066
1067
}
1067
1068
1068
1069
static int hugetlbfs_tmpfile (struct mnt_idmap * idmap ,
@@ -1071,7 +1072,7 @@ static int hugetlbfs_tmpfile(struct mnt_idmap *idmap,
1071
1072
{
1072
1073
struct inode * inode ;
1073
1074
1074
- inode = hugetlbfs_get_inode (dir -> i_sb , dir , mode | S_IFREG , 0 );
1075
+ inode = hugetlbfs_get_inode (dir -> i_sb , idmap , dir , mode | S_IFREG , 0 );
1075
1076
if (!inode )
1076
1077
return - ENOSPC ;
1077
1078
inode_set_mtime_to_ts (dir , inode_set_ctime_current (dir ));
@@ -1083,10 +1084,11 @@ static int hugetlbfs_symlink(struct mnt_idmap *idmap,
1083
1084
struct inode * dir , struct dentry * dentry ,
1084
1085
const char * symname )
1085
1086
{
1087
+ const umode_t mode = S_IFLNK |S_IRWXUGO ;
1086
1088
struct inode * inode ;
1087
1089
int error = - ENOSPC ;
1088
1090
1089
- inode = hugetlbfs_get_inode (dir -> i_sb , dir , S_IFLNK | S_IRWXUGO , 0 );
1091
+ inode = hugetlbfs_get_inode (dir -> i_sb , idmap , dir , mode , 0 );
1090
1092
if (inode ) {
1091
1093
int l = strlen (symname )+ 1 ;
1092
1094
error = page_symlink (inode , symname , l );
@@ -1553,6 +1555,7 @@ static struct file_system_type hugetlbfs_fs_type = {
1553
1555
.init_fs_context = hugetlbfs_init_fs_context ,
1554
1556
.parameters = hugetlb_fs_parameters ,
1555
1557
.kill_sb = kill_litter_super ,
1558
+ .fs_flags = FS_ALLOW_IDMAP ,
1556
1559
};
1557
1560
1558
1561
static struct vfsmount * hugetlbfs_vfsmount [HUGE_MAX_HSTATE ];
@@ -1606,7 +1609,9 @@ struct file *hugetlb_file_setup(const char *name, size_t size,
1606
1609
}
1607
1610
1608
1611
file = ERR_PTR (- ENOSPC );
1609
- inode = hugetlbfs_get_inode (mnt -> mnt_sb , NULL , S_IFREG | S_IRWXUGO , 0 );
1612
+ /* hugetlbfs_vfsmount[] mounts do not use idmapped mounts. */
1613
+ inode = hugetlbfs_get_inode (mnt -> mnt_sb , & nop_mnt_idmap , NULL ,
1614
+ S_IFREG | S_IRWXUGO , 0 );
1610
1615
if (!inode )
1611
1616
goto out ;
1612
1617
if (creat_flags == HUGETLB_SHMFS_INODE )
0 commit comments