diff options
Diffstat (limited to 'fs/inode.c')
| -rw-r--r-- | fs/inode.c | 58 | 
1 files changed, 29 insertions, 29 deletions
diff --git a/fs/inode.c b/fs/inode.c index f453eb58fd03..4558dc2f1355 100644 --- a/fs/inode.c +++ b/fs/inode.c @@ -5,6 +5,7 @@   */  #include <linux/export.h>  #include <linux/fs.h> +#include <linux/filelock.h>  #include <linux/mm.h>  #include <linux/backing-dev.h>  #include <linux/hash.h> @@ -1893,7 +1894,7 @@ bool atime_needs_update(const struct path *path, struct inode *inode)  	/* Atime updates will likely cause i_uid and i_gid to be written  	 * back improprely if their true value is unknown to the vfs.  	 */ -	if (HAS_UNMAPPED_ID(mnt_user_ns(mnt), inode)) +	if (HAS_UNMAPPED_ID(mnt_idmap(mnt), inode))  		return false;  	if (IS_NOATIME(inode)) @@ -1953,7 +1954,7 @@ EXPORT_SYMBOL(touch_atime);   * response to write or truncate. Return 0 if nothing has to be changed.   * Negative value on error (change should be denied).   */ -int dentry_needs_remove_privs(struct user_namespace *mnt_userns, +int dentry_needs_remove_privs(struct mnt_idmap *idmap,  			      struct dentry *dentry)  {  	struct inode *inode = d_inode(dentry); @@ -1963,7 +1964,7 @@ int dentry_needs_remove_privs(struct user_namespace *mnt_userns,  	if (IS_NOSEC(inode))  		return 0; -	mask = setattr_should_drop_suidgid(mnt_userns, inode); +	mask = setattr_should_drop_suidgid(idmap, inode);  	ret = security_inode_need_killpriv(dentry);  	if (ret < 0)  		return ret; @@ -1972,7 +1973,7 @@ int dentry_needs_remove_privs(struct user_namespace *mnt_userns,  	return mask;  } -static int __remove_privs(struct user_namespace *mnt_userns, +static int __remove_privs(struct mnt_idmap *idmap,  			  struct dentry *dentry, int kill)  {  	struct iattr newattrs; @@ -1982,7 +1983,7 @@ static int __remove_privs(struct user_namespace *mnt_userns,  	 * Note we call this on write, so notify_change will not  	 * encounter any conflicting delegations:  	 */ -	return notify_change(mnt_userns, dentry, &newattrs, NULL); +	return notify_change(idmap, dentry, &newattrs, NULL);  }  static int __file_remove_privs(struct file *file, unsigned int flags) @@ -1995,7 +1996,7 @@ static int __file_remove_privs(struct file *file, unsigned int flags)  	if (IS_NOSEC(inode) || !S_ISREG(inode->i_mode))  		return 0; -	kill = dentry_needs_remove_privs(file_mnt_user_ns(file), dentry); +	kill = dentry_needs_remove_privs(file_mnt_idmap(file), dentry);  	if (kill < 0)  		return kill; @@ -2003,7 +2004,7 @@ static int __file_remove_privs(struct file *file, unsigned int flags)  		if (flags & IOCB_NOWAIT)  			return -EAGAIN; -		error = __remove_privs(file_mnt_user_ns(file), dentry, kill); +		error = __remove_privs(file_mnt_idmap(file), dentry, kill);  	}  	if (!error) @@ -2279,21 +2280,21 @@ EXPORT_SYMBOL(init_special_inode);  /**   * inode_init_owner - Init uid,gid,mode for new inode according to posix standards - * @mnt_userns:	User namespace of the mount the inode was created from + * @idmap: idmap of the mount the inode was created from   * @inode: New inode   * @dir: Directory inode   * @mode: mode of the new inode   * - * If the inode has been created through an idmapped mount the user namespace of - * the vfsmount must be passed through @mnt_userns. This function will then take - * care to map the inode according to @mnt_userns before checking permissions + * If the inode has been created through an idmapped mount the idmap of + * the vfsmount must be passed through @idmap. This function will then take + * care to map the inode according to @idmap before checking permissions   * and initializing i_uid and i_gid. On non-idmapped mounts or if permission - * checking is to be performed on the raw inode simply passs init_user_ns. + * checking is to be performed on the raw inode simply pass @nop_mnt_idmap.   */ -void inode_init_owner(struct user_namespace *mnt_userns, struct inode *inode, +void inode_init_owner(struct mnt_idmap *idmap, struct inode *inode,  		      const struct inode *dir, umode_t mode)  { -	inode_fsuid_set(inode, mnt_userns); +	inode_fsuid_set(inode, idmap);  	if (dir && dir->i_mode & S_ISGID) {  		inode->i_gid = dir->i_gid; @@ -2301,32 +2302,32 @@ void inode_init_owner(struct user_namespace *mnt_userns, struct inode *inode,  		if (S_ISDIR(mode))  			mode |= S_ISGID;  	} else -		inode_fsgid_set(inode, mnt_userns); +		inode_fsgid_set(inode, idmap);  	inode->i_mode = mode;  }  EXPORT_SYMBOL(inode_init_owner);  /**   * inode_owner_or_capable - check current task permissions to inode - * @mnt_userns:	user namespace of the mount the inode was found from + * @idmap: idmap of the mount the inode was found from   * @inode: inode being checked   *   * Return true if current either has CAP_FOWNER in a namespace with the   * inode owner uid mapped, or owns the file.   * - * If the inode has been found through an idmapped mount the user namespace of - * the vfsmount must be passed through @mnt_userns. This function will then take - * care to map the inode according to @mnt_userns before checking permissions. + * If the inode has been found through an idmapped mount the idmap of + * the vfsmount must be passed through @idmap. This function will then take + * care to map the inode according to @idmap before checking permissions.   * On non-idmapped mounts or if permission checking is to be performed on the - * raw inode simply passs init_user_ns. + * raw inode simply passs @nop_mnt_idmap.   */ -bool inode_owner_or_capable(struct user_namespace *mnt_userns, +bool inode_owner_or_capable(struct mnt_idmap *idmap,  			    const struct inode *inode)  {  	vfsuid_t vfsuid;  	struct user_namespace *ns; -	vfsuid = i_uid_into_vfsuid(mnt_userns, inode); +	vfsuid = i_uid_into_vfsuid(idmap, inode);  	if (vfsuid_eq_kuid(vfsuid, current_fsuid()))  		return true; @@ -2458,7 +2459,7 @@ EXPORT_SYMBOL(current_time);  /**   * in_group_or_capable - check whether caller is CAP_FSETID privileged - * @mnt_userns: user namespace of the mount @inode was found from + * @idmap:	idmap of the mount @inode was found from   * @inode:	inode to check   * @vfsgid:	the new/current vfsgid of @inode   * @@ -2468,19 +2469,19 @@ EXPORT_SYMBOL(current_time);   *   * Return: true if the caller is sufficiently privileged, false if not.   */ -bool in_group_or_capable(struct user_namespace *mnt_userns, +bool in_group_or_capable(struct mnt_idmap *idmap,  			 const struct inode *inode, vfsgid_t vfsgid)  {  	if (vfsgid_in_group_p(vfsgid))  		return true; -	if (capable_wrt_inode_uidgid(mnt_userns, inode, CAP_FSETID)) +	if (capable_wrt_inode_uidgid(idmap, inode, CAP_FSETID))  		return true;  	return false;  }  /**   * mode_strip_sgid - handle the sgid bit for non-directories - * @mnt_userns: User namespace of the mount the inode was created from + * @idmap: idmap of the mount the inode was created from   * @dir: parent directory inode   * @mode: mode of the file to be created in @dir   * @@ -2492,15 +2493,14 @@ bool in_group_or_capable(struct user_namespace *mnt_userns,   *   * Return: the new mode to use for the file   */ -umode_t mode_strip_sgid(struct user_namespace *mnt_userns, +umode_t mode_strip_sgid(struct mnt_idmap *idmap,  			const struct inode *dir, umode_t mode)  {  	if ((mode & (S_ISGID | S_IXGRP)) != (S_ISGID | S_IXGRP))  		return mode;  	if (S_ISDIR(mode) || !dir || !(dir->i_mode & S_ISGID))  		return mode; -	if (in_group_or_capable(mnt_userns, dir, -				i_gid_into_vfsgid(mnt_userns, dir))) +	if (in_group_or_capable(idmap, dir, i_gid_into_vfsgid(idmap, dir)))  		return mode;  	return mode & ~S_ISGID;  }  |