Commit 34a456eb authored by Linus Torvalds's avatar Linus Torvalds
Browse files

Merge tag 'fs.idmapped.helpers.v5.13' of...

Merge tag 'fs.idmapped.helpers.v5.13' of git://git.kernel.org/pub/scm/linux/kernel/git/brauner/linux

Pull fs mapping helper updates from Christian Brauner:
 "This adds kernel-doc to all new idmapping helpers and improves their
  naming which was triggered by a discussion with some fs developers.
  Some of the names are based on suggestions by Vivek and Al.

  Also remove the open-coded permission checking in a few places with
  simple helpers. Overall this should lead to more clarity and make it
  easier to maintain"

* tag 'fs.idmapped.helpers.v5.13' of git://git.kernel.org/pub/scm/linux/kernel/git/brauner/linux:
  fs: introduce two inode i_{u,g}id initialization helpers
  fs: introduce fsuidgid_has_mapping() helper
  fs: document and rename fsid helpers
  fs: document mapping helpers
parents cc15422c db998553
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -970,7 +970,7 @@ struct inode *__ext4_new_inode(struct user_namespace *mnt_userns,
		i_gid_write(inode, owner[1]);
	} else if (test_opt(sb, GRPID)) {
		inode->i_mode = mode;
		inode->i_uid = fsuid_into_mnt(mnt_userns);
		inode_fsuid_set(inode, mnt_userns);
		inode->i_gid = dir->i_gid;
	} else
		inode_init_owner(mnt_userns, inode, dir, mode);
+2 −2
Original line number Diff line number Diff line
@@ -2147,7 +2147,7 @@ EXPORT_SYMBOL(init_special_inode);
void inode_init_owner(struct user_namespace *mnt_userns, struct inode *inode,
		      const struct inode *dir, umode_t mode)
{
	inode->i_uid = fsuid_into_mnt(mnt_userns);
	inode_fsuid_set(inode, mnt_userns);
	if (dir && dir->i_mode & S_ISGID) {
		inode->i_gid = dir->i_gid;

@@ -2159,7 +2159,7 @@ void inode_init_owner(struct user_namespace *mnt_userns, struct inode *inode,
			 !capable_wrt_inode_uidgid(mnt_userns, dir, CAP_FSETID))
			mode &= ~S_ISGID;
	} else
		inode->i_gid = fsgid_into_mnt(mnt_userns);
		inode_fsgid_set(inode, mnt_userns);
	inode->i_mode = mode;
}
EXPORT_SYMBOL(inode_init_owner);
+3 −8
Original line number Diff line number Diff line
@@ -2824,16 +2824,14 @@ static int may_delete(struct user_namespace *mnt_userns, struct inode *dir,
static inline int may_create(struct user_namespace *mnt_userns,
			     struct inode *dir, struct dentry *child)
{
	struct user_namespace *s_user_ns;
	audit_inode_child(dir, child, AUDIT_TYPE_CHILD_CREATE);
	if (child->d_inode)
		return -EEXIST;
	if (IS_DEADDIR(dir))
		return -ENOENT;
	s_user_ns = dir->i_sb->s_user_ns;
	if (!kuid_has_mapping(s_user_ns, fsuid_into_mnt(mnt_userns)) ||
	    !kgid_has_mapping(s_user_ns, fsgid_into_mnt(mnt_userns)))
	if (!fsuidgid_has_mapping(dir->i_sb, mnt_userns))
		return -EOVERFLOW;

	return inode_permission(mnt_userns, dir, MAY_WRITE | MAY_EXEC);
}

@@ -3035,14 +3033,11 @@ static int may_o_create(struct user_namespace *mnt_userns,
			const struct path *dir, struct dentry *dentry,
			umode_t mode)
{
	struct user_namespace *s_user_ns;
	int error = security_path_mknod(dir, dentry, mode, 0);
	if (error)
		return error;

	s_user_ns = dir->dentry->d_sb->s_user_ns;
	if (!kuid_has_mapping(s_user_ns, fsuid_into_mnt(mnt_userns)) ||
	    !kgid_has_mapping(s_user_ns, fsgid_into_mnt(mnt_userns)))
	if (!fsuidgid_has_mapping(dir->dentry->d_sb, mnt_userns))
		return -EOVERFLOW;

	error = inode_permission(mnt_userns, dir->dentry->d_inode,
+5 −5
Original line number Diff line number Diff line
@@ -812,7 +812,7 @@ xfs_init_new_inode(

	if (dir && !(dir->i_mode & S_ISGID) &&
	    (mp->m_flags & XFS_MOUNT_GRPID)) {
		inode->i_uid = fsuid_into_mnt(mnt_userns);
		inode_fsuid_set(inode, mnt_userns);
		inode->i_gid = dir->i_gid;
		inode->i_mode = mode;
	} else {
@@ -1007,8 +1007,8 @@ xfs_create(
	/*
	 * Make sure that we have allocated dquot(s) on disk.
	 */
	error = xfs_qm_vop_dqalloc(dp, fsuid_into_mnt(mnt_userns),
			fsgid_into_mnt(mnt_userns), prid,
	error = xfs_qm_vop_dqalloc(dp, mapped_fsuid(mnt_userns),
			mapped_fsgid(mnt_userns), prid,
			XFS_QMOPT_QUOTALL | XFS_QMOPT_INHERIT,
			&udqp, &gdqp, &pdqp);
	if (error)
@@ -1158,8 +1158,8 @@ xfs_create_tmpfile(
	/*
	 * Make sure that we have allocated dquot(s) on disk.
	 */
	error = xfs_qm_vop_dqalloc(dp, fsuid_into_mnt(mnt_userns),
			fsgid_into_mnt(mnt_userns), prid,
	error = xfs_qm_vop_dqalloc(dp, mapped_fsuid(mnt_userns),
			mapped_fsgid(mnt_userns), prid,
			XFS_QMOPT_QUOTALL | XFS_QMOPT_INHERIT,
			&udqp, &gdqp, &pdqp);
	if (error)
+2 −2
Original line number Diff line number Diff line
@@ -182,8 +182,8 @@ xfs_symlink(
	/*
	 * Make sure that we have allocated dquot(s) on disk.
	 */
	error = xfs_qm_vop_dqalloc(dp, fsuid_into_mnt(mnt_userns),
			fsgid_into_mnt(mnt_userns), prid,
	error = xfs_qm_vop_dqalloc(dp, mapped_fsuid(mnt_userns),
			mapped_fsgid(mnt_userns), prid,
			XFS_QMOPT_QUOTALL | XFS_QMOPT_INHERIT,
			&udqp, &gdqp, &pdqp);
	if (error)
Loading