Skip to content

Commit 91e78a1

Browse files
giuseppebrauner
authored andcommitted
hugetlbfs: support idmapped mounts
pass down the idmapped mount information to the different helper functions. Differently, hugetlb_file_setup() will continue to not have any mapping since it is only used from contexts where idmapped mounts are not used. Signed-off-by: Giuseppe Scrivano <gscrivan@redhat.com> Link: https://lore.kernel.org/r/20240229152405.105031-1-gscrivan@redhat.com Signed-off-by: Christian Brauner <brauner@kernel.org>
1 parent 6b91bfa commit 91e78a1

File tree

1 file changed

+14
-9
lines changed

1 file changed

+14
-9
lines changed

fs/hugetlbfs/inode.c

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -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,
974974
static struct lock_class_key hugetlbfs_i_mmap_rwsem_key;
975975

976976
static 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,
10511052
static 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

10681069
static 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

15581561
static 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

Comments
 (0)