You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
fs: Give dentry to inode_change_ok() instead of inode
inode_change_ok() will be resposible for clearing capabilities and IMA extended attributes and as such will need dentry. Give it as an argument to inode_change_ok() instead of an inode. Also rename inode_change_ok() to setattr_prepare() to better relect that it does also some modifications in addition to checks. Reviewed-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Jan Kara <jack@suse.cz>
This commit is contained in:
@@ -287,8 +287,8 @@ implementing on-disk size changes. Start with a copy of the old inode_setattr
|
||||
and vmtruncate, and the reorder the vmtruncate + foofs_vmtruncate sequence to
|
||||
be in order of zeroing blocks using block_truncate_page or similar helpers,
|
||||
size update and on finally on-disk truncation which should not fail.
|
||||
inode_change_ok now includes the size checks for ATTR_SIZE and must be called
|
||||
in the beginning of ->setattr unconditionally.
|
||||
setattr_prepare (which used to be inode_change_ok) now includes the size checks
|
||||
for ATTR_SIZE and must be called in the beginning of ->setattr unconditionally.
|
||||
|
||||
[mandatory]
|
||||
|
||||
|
||||
@@ -1192,7 +1192,7 @@ int ll_setattr_raw(struct dentry *dentry, struct iattr *attr, bool hsm_import)
|
||||
attr->ia_valid |= ATTR_MTIME | ATTR_CTIME;
|
||||
}
|
||||
|
||||
/* POSIX: check before ATTR_*TIME_SET set (from inode_change_ok) */
|
||||
/* POSIX: check before ATTR_*TIME_SET set (from setattr_prepare) */
|
||||
if (attr->ia_valid & TIMES_SET_FLAGS) {
|
||||
if ((!uid_eq(current_fsuid(), inode->i_uid)) &&
|
||||
!capable(CFS_CAP_FOWNER))
|
||||
|
||||
+1
-1
@@ -1094,7 +1094,7 @@ static int v9fs_vfs_setattr(struct dentry *dentry, struct iattr *iattr)
|
||||
struct p9_wstat wstat;
|
||||
|
||||
p9_debug(P9_DEBUG_VFS, "\n");
|
||||
retval = inode_change_ok(d_inode(dentry), iattr);
|
||||
retval = setattr_prepare(dentry, iattr);
|
||||
if (retval)
|
||||
return retval;
|
||||
|
||||
|
||||
@@ -558,7 +558,7 @@ int v9fs_vfs_setattr_dotl(struct dentry *dentry, struct iattr *iattr)
|
||||
|
||||
p9_debug(P9_DEBUG_VFS, "\n");
|
||||
|
||||
retval = inode_change_ok(inode, iattr);
|
||||
retval = setattr_prepare(dentry, iattr);
|
||||
if (retval)
|
||||
return retval;
|
||||
|
||||
|
||||
+1
-1
@@ -303,7 +303,7 @@ adfs_notify_change(struct dentry *dentry, struct iattr *attr)
|
||||
unsigned int ia_valid = attr->ia_valid;
|
||||
int error;
|
||||
|
||||
error = inode_change_ok(inode, attr);
|
||||
error = setattr_prepare(dentry, attr);
|
||||
|
||||
/*
|
||||
* we can't change the UID or GID of any file -
|
||||
|
||||
+1
-1
@@ -219,7 +219,7 @@ affs_notify_change(struct dentry *dentry, struct iattr *attr)
|
||||
|
||||
pr_debug("notify_change(%lu,0x%x)\n", inode->i_ino, attr->ia_valid);
|
||||
|
||||
error = inode_change_ok(inode,attr);
|
||||
error = setattr_prepare(dentry, attr);
|
||||
if (error)
|
||||
goto out;
|
||||
|
||||
|
||||
@@ -17,19 +17,22 @@
|
||||
#include <linux/ima.h>
|
||||
|
||||
/**
|
||||
* inode_change_ok - check if attribute changes to an inode are allowed
|
||||
* @inode: inode to check
|
||||
* setattr_prepare - check if attribute changes to a dentry are allowed
|
||||
* @dentry: dentry to check
|
||||
* @attr: attributes to change
|
||||
*
|
||||
* Check if we are allowed to change the attributes contained in @attr
|
||||
* in the given inode. This includes the normal unix access permission
|
||||
* checks, as well as checks for rlimits and others.
|
||||
* in the given dentry. This includes the normal unix access permission
|
||||
* checks, as well as checks for rlimits and others. The function also clears
|
||||
* SGID bit from mode if user is not allowed to set it. Also file capabilities
|
||||
* and IMA extended attributes are cleared if ATTR_KILL_PRIV is set.
|
||||
*
|
||||
* Should be called as the first thing in ->setattr implementations,
|
||||
* possibly after taking additional locks.
|
||||
*/
|
||||
int inode_change_ok(const struct inode *inode, struct iattr *attr)
|
||||
int setattr_prepare(struct dentry *dentry, struct iattr *attr)
|
||||
{
|
||||
struct inode *inode = d_inode(dentry);
|
||||
unsigned int ia_valid = attr->ia_valid;
|
||||
|
||||
/*
|
||||
@@ -79,7 +82,7 @@ int inode_change_ok(const struct inode *inode, struct iattr *attr)
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(inode_change_ok);
|
||||
EXPORT_SYMBOL(setattr_prepare);
|
||||
|
||||
/**
|
||||
* inode_newsize_ok - may this inode be truncated to a given size
|
||||
|
||||
+1
-1
@@ -5042,7 +5042,7 @@ static int btrfs_setattr(struct dentry *dentry, struct iattr *attr)
|
||||
if (btrfs_root_readonly(root))
|
||||
return -EROFS;
|
||||
|
||||
err = inode_change_ok(inode, attr);
|
||||
err = setattr_prepare(dentry, attr);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
|
||||
+1
-1
@@ -2123,7 +2123,7 @@ int ceph_setattr(struct dentry *dentry, struct iattr *attr)
|
||||
if (ceph_snap(inode) != CEPH_NOSNAP)
|
||||
return -EROFS;
|
||||
|
||||
err = inode_change_ok(inode, attr);
|
||||
err = setattr_prepare(dentry, attr);
|
||||
if (err != 0)
|
||||
return err;
|
||||
|
||||
|
||||
+2
-2
@@ -2154,7 +2154,7 @@ cifs_setattr_unix(struct dentry *direntry, struct iattr *attrs)
|
||||
if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_PERM)
|
||||
attrs->ia_valid |= ATTR_FORCE;
|
||||
|
||||
rc = inode_change_ok(inode, attrs);
|
||||
rc = setattr_prepare(direntry, attrs);
|
||||
if (rc < 0)
|
||||
goto out;
|
||||
|
||||
@@ -2294,7 +2294,7 @@ cifs_setattr_nounix(struct dentry *direntry, struct iattr *attrs)
|
||||
if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_PERM)
|
||||
attrs->ia_valid |= ATTR_FORCE;
|
||||
|
||||
rc = inode_change_ok(inode, attrs);
|
||||
rc = setattr_prepare(direntry, attrs);
|
||||
if (rc < 0) {
|
||||
free_xid(xid);
|
||||
return rc;
|
||||
|
||||
+1
-1
@@ -927,7 +927,7 @@ static int ecryptfs_setattr(struct dentry *dentry, struct iattr *ia)
|
||||
}
|
||||
mutex_unlock(&crypt_stat->cs_mutex);
|
||||
|
||||
rc = inode_change_ok(inode, ia);
|
||||
rc = setattr_prepare(dentry, ia);
|
||||
if (rc)
|
||||
goto out;
|
||||
if (ia->ia_valid & ATTR_SIZE) {
|
||||
|
||||
+1
-1
@@ -1034,7 +1034,7 @@ int exofs_setattr(struct dentry *dentry, struct iattr *iattr)
|
||||
if (unlikely(error))
|
||||
return error;
|
||||
|
||||
error = inode_change_ok(inode, iattr);
|
||||
error = setattr_prepare(dentry, iattr);
|
||||
if (unlikely(error))
|
||||
return error;
|
||||
|
||||
|
||||
+1
-1
@@ -1580,7 +1580,7 @@ int ext2_setattr(struct dentry *dentry, struct iattr *iattr)
|
||||
struct inode *inode = d_inode(dentry);
|
||||
int error;
|
||||
|
||||
error = inode_change_ok(inode, iattr);
|
||||
error = setattr_prepare(dentry, iattr);
|
||||
if (error)
|
||||
return error;
|
||||
|
||||
|
||||
+1
-1
@@ -5073,7 +5073,7 @@ int ext4_setattr(struct dentry *dentry, struct iattr *attr)
|
||||
int orphan = 0;
|
||||
const unsigned int ia_valid = attr->ia_valid;
|
||||
|
||||
error = inode_change_ok(inode, attr);
|
||||
error = setattr_prepare(dentry, attr);
|
||||
if (error)
|
||||
return error;
|
||||
|
||||
|
||||
+1
-1
@@ -680,7 +680,7 @@ int f2fs_setattr(struct dentry *dentry, struct iattr *attr)
|
||||
struct inode *inode = d_inode(dentry);
|
||||
int err;
|
||||
|
||||
err = inode_change_ok(inode, attr);
|
||||
err = setattr_prepare(dentry, attr);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
|
||||
+1
-1
@@ -450,7 +450,7 @@ int fat_setattr(struct dentry *dentry, struct iattr *attr)
|
||||
attr->ia_valid &= ~TIMES_SET_FLAGS;
|
||||
}
|
||||
|
||||
error = inode_change_ok(inode, attr);
|
||||
error = setattr_prepare(dentry, attr);
|
||||
attr->ia_valid = ia_valid;
|
||||
if (error) {
|
||||
if (sbi->options.quiet)
|
||||
|
||||
+1
-1
@@ -1609,7 +1609,7 @@ int fuse_do_setattr(struct dentry *dentry, struct iattr *attr,
|
||||
if (!(fc->flags & FUSE_DEFAULT_PERMISSIONS))
|
||||
attr->ia_valid |= ATTR_FORCE;
|
||||
|
||||
err = inode_change_ok(inode, attr);
|
||||
err = setattr_prepare(dentry, attr);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
|
||||
+1
-1
@@ -1932,7 +1932,7 @@ static int gfs2_setattr(struct dentry *dentry, struct iattr *attr)
|
||||
if (IS_IMMUTABLE(inode) || IS_APPEND(inode))
|
||||
goto out;
|
||||
|
||||
error = inode_change_ok(inode, attr);
|
||||
error = setattr_prepare(dentry, attr);
|
||||
if (error)
|
||||
goto out;
|
||||
|
||||
|
||||
+1
-1
@@ -605,7 +605,7 @@ int hfs_inode_setattr(struct dentry *dentry, struct iattr * attr)
|
||||
struct hfs_sb_info *hsb = HFS_SB(inode->i_sb);
|
||||
int error;
|
||||
|
||||
error = inode_change_ok(inode, attr); /* basic permission checks */
|
||||
error = setattr_prepare(dentry, attr); /* basic permission checks */
|
||||
if (error)
|
||||
return error;
|
||||
|
||||
|
||||
+1
-1
@@ -245,7 +245,7 @@ static int hfsplus_setattr(struct dentry *dentry, struct iattr *attr)
|
||||
struct inode *inode = d_inode(dentry);
|
||||
int error;
|
||||
|
||||
error = inode_change_ok(inode, attr);
|
||||
error = setattr_prepare(dentry, attr);
|
||||
if (error)
|
||||
return error;
|
||||
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user