@@ -922,7 +922,7 @@ static int hugetlbfs_setattr(struct mnt_idmap *idmap,
922922 unsigned int ia_valid = attr -> ia_valid ;
923923 struct hugetlbfs_inode_info * info = HUGETLBFS_I (inode );
924924
925- error = setattr_prepare (& nop_mnt_idmap , dentry , attr );
925+ error = setattr_prepare (idmap , dentry , attr );
926926 if (error )
927927 return error ;
928928
@@ -939,7 +939,7 @@ static int hugetlbfs_setattr(struct mnt_idmap *idmap,
939939 hugetlb_vmtruncate (inode , newsize );
940940 }
941941
942- setattr_copy (& nop_mnt_idmap , inode , attr );
942+ setattr_copy (idmap , inode , attr );
943943 mark_inode_dirty (inode );
944944 return 0 ;
945945}
@@ -974,6 +974,7 @@ static struct inode *hugetlbfs_get_root(struct super_block *sb,
974974static struct lock_class_key hugetlbfs_i_mmap_rwsem_key ;
975975
976976static struct inode * hugetlbfs_get_inode (struct super_block * sb ,
977+ struct mnt_idmap * idmap ,
977978 struct inode * dir ,
978979 umode_t mode , dev_t dev )
979980{
@@ -995,7 +996,7 @@ static struct inode *hugetlbfs_get_inode(struct super_block *sb,
995996 struct hugetlbfs_inode_info * info = HUGETLBFS_I (inode );
996997
997998 inode -> i_ino = get_next_ino ();
998- inode_init_owner (& nop_mnt_idmap , inode , dir , mode );
999+ inode_init_owner (idmap , inode , dir , mode );
9991000 lockdep_set_class (& inode -> i_mapping -> i_mmap_rwsem ,
10001001 & hugetlbfs_i_mmap_rwsem_key );
10011002 inode -> i_mapping -> a_ops = & hugetlbfs_aops ;
@@ -1039,7 +1040,7 @@ static int hugetlbfs_mknod(struct mnt_idmap *idmap, struct inode *dir,
10391040{
10401041 struct inode * inode ;
10411042
1042- inode = hugetlbfs_get_inode (dir -> i_sb , dir , mode , dev );
1043+ inode = hugetlbfs_get_inode (dir -> i_sb , idmap , dir , mode , dev );
10431044 if (!inode )
10441045 return - ENOSPC ;
10451046 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,
10511052static int hugetlbfs_mkdir (struct mnt_idmap * idmap , struct inode * dir ,
10521053 struct dentry * dentry , umode_t mode )
10531054{
1054- int retval = hugetlbfs_mknod (& nop_mnt_idmap , dir , dentry ,
1055+ int retval = hugetlbfs_mknod (idmap , dir , dentry ,
10551056 mode | S_IFDIR , 0 );
10561057 if (!retval )
10571058 inc_nlink (dir );
@@ -1062,7 +1063,7 @@ static int hugetlbfs_create(struct mnt_idmap *idmap,
10621063 struct inode * dir , struct dentry * dentry ,
10631064 umode_t mode , bool excl )
10641065{
1065- return hugetlbfs_mknod (& nop_mnt_idmap , dir , dentry , mode | S_IFREG , 0 );
1066+ return hugetlbfs_mknod (idmap , dir , dentry , mode | S_IFREG , 0 );
10661067}
10671068
10681069static int hugetlbfs_tmpfile (struct mnt_idmap * idmap ,
@@ -1071,7 +1072,7 @@ static int hugetlbfs_tmpfile(struct mnt_idmap *idmap,
10711072{
10721073 struct inode * inode ;
10731074
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 );
10751076 if (!inode )
10761077 return - ENOSPC ;
10771078 inode_set_mtime_to_ts (dir , inode_set_ctime_current (dir ));
@@ -1083,10 +1084,11 @@ static int hugetlbfs_symlink(struct mnt_idmap *idmap,
10831084 struct inode * dir , struct dentry * dentry ,
10841085 const char * symname )
10851086{
1087+ const umode_t mode = S_IFLNK |S_IRWXUGO ;
10861088 struct inode * inode ;
10871089 int error = - ENOSPC ;
10881090
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 );
10901092 if (inode ) {
10911093 int l = strlen (symname )+ 1 ;
10921094 error = page_symlink (inode , symname , l );
@@ -1553,6 +1555,7 @@ static struct file_system_type hugetlbfs_fs_type = {
15531555 .init_fs_context = hugetlbfs_init_fs_context ,
15541556 .parameters = hugetlb_fs_parameters ,
15551557 .kill_sb = kill_litter_super ,
1558+ .fs_flags = FS_ALLOW_IDMAP ,
15561559};
15571560
15581561static struct vfsmount * hugetlbfs_vfsmount [HUGE_MAX_HSTATE ];
@@ -1606,7 +1609,9 @@ struct file *hugetlb_file_setup(const char *name, size_t size,
16061609 }
16071610
16081611 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 );
16101615 if (!inode )
16111616 goto out ;
16121617 if (creat_flags == HUGETLB_SHMFS_INODE )
0 commit comments