fs: Give dentry to inode_change_ok() instead of inode
authorJan Kara <jack@suse.cz>
Wed, 14 Dec 2016 12:24:48 +0000 (13:24 +0100)
committerSasha Levin <alexander.levin@verizon.com>
Fri, 23 Dec 2016 13:56:35 +0000 (08:56 -0500)
[ Upstream commit 31051c85b5e2aaaf6315f74c72a732673632a905 ]

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.

References: CVE-2015-1350
Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Jan Kara <jack@suse.cz>
Signed-off-by: Philipp Hahn <hahn@univention.de>
Signed-off-by: Sasha Levin <alexander.levin@verizon.com>
51 files changed:
Documentation/filesystems/porting
drivers/staging/lustre/lustre/llite/llite_lib.c
fs/9p/vfs_inode.c
fs/9p/vfs_inode_dotl.c
fs/adfs/inode.c
fs/affs/inode.c
fs/attr.c
fs/btrfs/inode.c
fs/ceph/inode.c
fs/cifs/inode.c
fs/ecryptfs/inode.c
fs/exofs/inode.c
fs/ext2/inode.c
fs/ext3/inode.c
fs/ext4/inode.c
fs/f2fs/file.c
fs/fat/file.c
fs/fuse/dir.c
fs/gfs2/inode.c
fs/hfs/inode.c
fs/hfsplus/inode.c
fs/hostfs/hostfs_kern.c
fs/hpfs/inode.c
fs/hugetlbfs/inode.c
fs/jffs2/fs.c
fs/jfs/file.c
fs/kernfs/inode.c
fs/libfs.c
fs/logfs/file.c
fs/minix/file.c
fs/ncpfs/inode.c
fs/nfsd/nfsproc.c
fs/nilfs2/inode.c
fs/ntfs/inode.c
fs/ocfs2/dlmfs/dlmfs.c
fs/ocfs2/file.c
fs/omfs/file.c
fs/overlayfs/inode.c
fs/proc/base.c
fs/proc/generic.c
fs/proc/proc_sysctl.c
fs/ramfs/file-nommu.c
fs/reiserfs/inode.c
fs/sysv/file.c
fs/ubifs/file.c
fs/udf/file.c
fs/ufs/truncate.c
fs/utimes.c
fs/xfs/xfs_iops.c
include/linux/fs.h
mm/shmem.c

index e69274de8d0c9c1754cc40b8d99d78a724e63e50..0500895b768f7167a92f1d1b7bc85c5a0628b636 100644 (file)
@@ -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]
 
index a27af7882170f42924aed9d0685dde3cf24f8211..d6042599694844f735e1bbcf1f0460b0aada09e1 100644 (file)
@@ -1323,7 +1323,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))
index 53f1e8a217071c13e4a3bb90771b97274e727521..99c3c4ffe1d9aeb164c4f4aca907d3fbc955c663 100644 (file)
@@ -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;
 
index 4d3ecfb55fcf8da4c1211932b188c6d18bbe1a8e..ce7ab92f7e84fe4f62eec7390640b6b434d2bed2 100644 (file)
@@ -560,7 +560,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;
 
index 335055d828e45d082f24558ac5b1c155dac1fefb..f57baaa511aa5ceea8dbd03e1b040d46238c0d45 100644 (file)
@@ -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 -
index a022f4accd76b801566564b7c6de2d38f2e1cdfb..87953b94a5aed949db4198e57e6b3ecf46bc1877 100644 (file)
@@ -218,7 +218,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;
 
index 6530ced19697d49a9189fa289c9112187448fee3..85cae17db7846eb4e5534dbb31727a2d64b50437 100644 (file)
--- a/fs/attr.c
+++ b/fs/attr.c
 #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
index c4771af7fd6ffe42ef98b8f8b4a5c9823f25d610..757a34bdd2b9fec3544370f7329932d18329d46a 100644 (file)
@@ -4975,7 +4975,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;
 
index e876e1944519a330a2cc1f44e33a031139a35438..4484aaf5c47843462699e2090f369db148047d93 100644 (file)
@@ -1728,7 +1728,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;
 
index 9fb3bc26a2ab1b0d870d9e3edc693c015b99f07d..f82dfe7ae3e84a594730d6dc234ce7137bc9ca4e 100644 (file)
@@ -2134,7 +2134,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;
 
@@ -2274,7 +2274,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;
index fc850b55db67a27a99663596e1e8c711c8d71237..661dd53f0040345be8bf04ba2c07b183a628ed58 100644 (file)
@@ -942,7 +942,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) {
index 786e4cc8c889cc8903f7d734ee3e255c0aeb24f8..159c30c18395e53571080852f58ae5eae502bc0a 100644 (file)
@@ -1038,7 +1038,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;
 
index f460ae36d5b78addfd9cc1a6eb6c4287887a946e..f08604366cb5b322dbbab13b296e6cab477de43a 100644 (file)
@@ -1547,7 +1547,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;
 
index 2ee2dc4351d1630b375da3b9aaa062840ce1afc9..3613e87c688f0ba23cca1b9735148e50bef690e5 100644 (file)
@@ -3244,7 +3244,7 @@ int ext3_setattr(struct dentry *dentry, struct iattr *attr)
        int error, rc = 0;
        const unsigned int ia_valid = attr->ia_valid;
 
-       error = inode_change_ok(inode, attr);
+       error = setattr_prepare(dentry, attr);
        if (error)
                return error;
 
index 9b55c6f71bf20687af62ebc7fe43fffcc763ddbf..5beca5c5413e6ee146a4d48508785ec8bd28bc47 100644 (file)
@@ -4751,7 +4751,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;
 
index 2b52e48d74824dd67cfb8975a09b246a701a870f..85e40c0fdcc4333e1f8ce8a2d382b7036f01bba4 100644 (file)
@@ -617,7 +617,7 @@ int f2fs_setattr(struct dentry *dentry, struct iattr *attr)
        struct f2fs_inode_info *fi = F2FS_I(inode);
        int err;
 
-       err = inode_change_ok(inode, attr);
+       err = setattr_prepare(dentry, attr);
        if (err)
                return err;
 
index 442d50a0e33e6a37daf2c315a2a424f43ddfcdaa..5d37650483c62e1685d5268c249eda3a0aa5d5f7 100644 (file)
@@ -388,7 +388,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)
index e9c31bcf44a70223d023e15df0c3ff07f5c760b1..88b09a33d117acfe0a606b52b0fe2b8ab91ae52b 100644 (file)
@@ -1620,7 +1620,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;
 
index 1b3ca7a2e3fcfb807d4505d81bace6b698272bff..6f7f848a3c4e438fd8db5801ded3f09294bf2669 100644 (file)
@@ -1759,7 +1759,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;
 
index b99ebddb10cb5b5e2d422c0f2151fc926455d26b..6409b8b4afd4badc3ae303dc117306d91c91bd19 100644 (file)
@@ -604,7 +604,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;
 
index 6dd107d7421ec05368845846d6a9cd9f558e9d23..d87c8a27e0638661e4cb466c34e95ae1a7300128 100644 (file)
@@ -246,7 +246,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;
 
index f895a85d9304800fa66c0628e299672408f9000c..81ce4e4ad0f97bc70491caa4bc4450b9e3f1e799 100644 (file)
@@ -812,7 +812,7 @@ static int hostfs_setattr(struct dentry *dentry, struct iattr *attr)
 
        int fd = HOSTFS_I(inode)->fd;
 
-       err = inode_change_ok(inode, attr);
+       err = setattr_prepare(dentry, attr);
        if (err)
                return err;
 
index 933c73780813198b8953376eaa1e595d786e36e1..efbed9520fdcbf7d092dad0f149d21b13dead54a 100644 (file)
@@ -272,7 +272,7 @@ int hpfs_setattr(struct dentry *dentry, struct iattr *attr)
        if ((attr->ia_valid & ATTR_SIZE) && attr->ia_size > inode->i_size)
                goto out_unlock;
 
-       error = inode_change_ok(inode, attr);
+       error = setattr_prepare(dentry, attr);
        if (error)
                goto out_unlock;
 
index 87724c1d7be66361a4b36fc5365818f02bd6b60b..a533d8c6648915f0edde8c6c8e47bc2982b1e569 100644 (file)
@@ -400,7 +400,7 @@ static int hugetlbfs_setattr(struct dentry *dentry, struct iattr *attr)
 
        BUG_ON(!inode);
 
-       error = inode_change_ok(inode, attr);
+       error = setattr_prepare(dentry, attr);
        if (error)
                return error;
 
index fe5ea080b4ec810f29589b257f605389067dadf4..6273abad377f1a29e6ece72a92e81c89e6f099ed 100644 (file)
@@ -193,7 +193,7 @@ int jffs2_setattr(struct dentry *dentry, struct iattr *iattr)
        struct inode *inode = d_inode(dentry);
        int rc;
 
-       rc = inode_change_ok(inode, iattr);
+       rc = setattr_prepare(dentry, iattr);
        if (rc)
                return rc;
 
index e98d39d75cf41a3f63c889958f87804dbb6aacf2..66d6362a9007d044fe622df16ce09ca1bf1abde5 100644 (file)
@@ -103,7 +103,7 @@ int jfs_setattr(struct dentry *dentry, struct iattr *iattr)
        struct inode *inode = d_inode(dentry);
        int rc;
 
-       rc = inode_change_ok(inode, iattr);
+       rc = setattr_prepare(dentry, iattr);
        if (rc)
                return rc;
 
index 756dd56aaf60acd337fb251fb287cbd382d57740..a17c850a49588dfc4ab6c4e8c54a69329731b459 100644 (file)
@@ -119,7 +119,7 @@ int kernfs_iop_setattr(struct dentry *dentry, struct iattr *iattr)
                return -EINVAL;
 
        mutex_lock(&kernfs_mutex);
-       error = inode_change_ok(inode, iattr);
+       error = setattr_prepare(dentry, iattr);
        if (error)
                goto out;
 
index f4641fd27bda879f4d51c912bfbac98babcf0434..50edbdc23cefec9f8f823163aa0735fb06e1f547 100644 (file)
@@ -371,7 +371,7 @@ int simple_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;
 
index 1a6f0167b16a7a4b657138ed7c366e8fe3151dfd..3abe1414c3f48d91893e49878273f537a452c35a 100644 (file)
@@ -244,7 +244,7 @@ static int logfs_setattr(struct dentry *dentry, struct iattr *attr)
        struct inode *inode = d_inode(dentry);
        int err = 0;
 
-       err = inode_change_ok(inode, attr);
+       err = setattr_prepare(dentry, attr);
        if (err)
                return err;
 
index 94f0eb9a6e2c1f77db3b3d5095092cf47c655976..a6a4797aa0d40cb89d99d00edbfd32ef590de86c 100644 (file)
@@ -26,7 +26,7 @@ static int minix_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;
 
index 9605a2f635490ddf498c72049d7b40d84e7f977b..7b1261bc2deea1b3e85c990555849f9014cec58d 100644 (file)
@@ -884,7 +884,7 @@ int ncp_notify_change(struct dentry *dentry, struct iattr *attr)
        /* ageing the dentry to force validation */
        ncp_age_dentry(server, dentry);
 
-       result = inode_change_ok(inode, attr);
+       result = setattr_prepare(dentry, attr);
        if (result < 0)
                goto out;
 
index 4cd78ef4c95c4def33831856e863a36fc850ff59..44f6f4f5eee045b27db23bd812d6af27bde4eff6 100644 (file)
@@ -74,10 +74,10 @@ nfsd_proc_setattr(struct svc_rqst *rqstp, struct nfsd_sattrargs *argp,
         * which only requires access, and "set-[ac]time-to-X" which
         * requires ownership.
         * So if it looks like it might be "set both to the same time which
-        * is close to now", and if inode_change_ok fails, then we
+        * is close to now", and if setattr_prepare fails, then we
         * convert to "set to now" instead of "set to explicit time"
         *
-        * We only call inode_change_ok as the last test as technically
+        * We only call setattr_prepare as the last test as technically
         * it is not an interface that we should be using.
         */
 #define BOTH_TIME_SET (ATTR_ATIME_SET | ATTR_MTIME_SET)
@@ -92,17 +92,15 @@ nfsd_proc_setattr(struct svc_rqst *rqstp, struct nfsd_sattrargs *argp,
                 * request is.  We require it be within 30 minutes of now.
                 */
                time_t delta = iap->ia_atime.tv_sec - get_seconds();
-               struct inode *inode;
 
                nfserr = fh_verify(rqstp, fhp, 0, NFSD_MAY_NOP);
                if (nfserr)
                        goto done;
-               inode = d_inode(fhp->fh_dentry);
 
                if (delta < 0)
                        delta = -delta;
                if (delta < MAX_TOUCH_TIME_ERROR &&
-                   inode_change_ok(inode, iap) != 0) {
+                   setattr_prepare(fhp->fh_dentry, iap) != 0) {
                        /*
                         * Turn off ATTR_[AM]TIME_SET but leave ATTR_[AM]TIME.
                         * This will cause notify_change to set these times
index 258d9fe2521a52f1a6d96d310d90bd0890434634..b40df2bb5ee4d15858b5cb29d360789e5b97d9ac 100644 (file)
@@ -839,7 +839,7 @@ int nilfs_setattr(struct dentry *dentry, struct iattr *iattr)
        struct super_block *sb = inode->i_sb;
        int err;
 
-       err = inode_change_ok(inode, iattr);
+       err = setattr_prepare(dentry, iattr);
        if (err)
                return err;
 
index d284f07eda7754e721bfd2782ba410f04ae145e4..c178763893f3e17ec79e62d1d05d9ef82bea6116 100644 (file)
@@ -2893,7 +2893,7 @@ int ntfs_setattr(struct dentry *dentry, struct iattr *attr)
        int err;
        unsigned int ia_valid = attr->ia_valid;
 
-       err = inode_change_ok(vi, attr);
+       err = setattr_prepare(dentry, attr);
        if (err)
                goto out;
        /* We do not support NTFS ACLs yet. */
index b5cf27dcb18a78c71c3ef62410c3e4e7e7e641f9..43ac2289c613d0d6c69d1d613c504e718e3edf7d 100644 (file)
@@ -211,7 +211,7 @@ static int dlmfs_file_setattr(struct dentry *dentry, struct iattr *attr)
        struct inode *inode = d_inode(dentry);
 
        attr->ia_valid &= ~ATTR_SIZE;
-       error = inode_change_ok(inode, attr);
+       error = setattr_prepare(dentry, attr);
        if (error)
                return error;
 
index e00be7f509db647528d3c2d8e7011fd2864f6411..bc06b982e9eab20b4452ec04d72caaae1bc78a9a 100644 (file)
@@ -1150,7 +1150,7 @@ int ocfs2_setattr(struct dentry *dentry, struct iattr *attr)
        if (!(attr->ia_valid & OCFS2_VALID_ATTRS))
                return 0;
 
-       status = inode_change_ok(inode, attr);
+       status = setattr_prepare(dentry, attr);
        if (status)
                return status;
 
index d9e26cfbb793113f15b73bde769e49b69932bc9c..bf83e6644333f5edb4c7dfb6a4ad68415ad7e6ea 100644 (file)
@@ -349,7 +349,7 @@ static int omfs_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;
 
index 0bb8347c0d8b418a86c4369df71ba023c6464034..d293034ae2cb3602f0268732f64b4806914e0b5e 100644 (file)
@@ -54,7 +54,7 @@ int ovl_setattr(struct dentry *dentry, struct iattr *attr)
         * inode_newsize_ok() will always check against MAX_LFS_FILESIZE and not
         * check for a swapfile (which this won't be anyway).
         */
-       err = inode_change_ok(dentry->d_inode, attr);
+       err = setattr_prepare(dentry, attr);
        if (err)
                return err;
 
index 239dca3fb676bc8a886d2a4349ed3a9ed19ea705..fab32ad5d96d1c80b1348f38429a395cd8b66365 100644 (file)
@@ -517,7 +517,7 @@ int proc_setattr(struct dentry *dentry, struct iattr *attr)
        if (attr->ia_valid & ATTR_MODE)
                return -EPERM;
 
-       error = inode_change_ok(inode, attr);
+       error = setattr_prepare(dentry, attr);
        if (error)
                return error;
 
index e5dee5c3188eb10e94742fbb57bb3b3564fa61bb..d99099fe62d4a6c7215fb02d05f73539e7c21048 100644 (file)
@@ -105,7 +105,7 @@ static int proc_notify_change(struct dentry *dentry, struct iattr *iattr)
        struct proc_dir_entry *de = PDE(inode);
        int error;
 
-       error = inode_change_ok(inode, iattr);
+       error = setattr_prepare(dentry, iattr);
        if (error)
                return error;
 
index fdda62e6115e1c4584cc88d360c27de7a26e1793..0dea606074c75db6d1d8546a2d673f727b020283 100644 (file)
@@ -753,7 +753,7 @@ static int proc_sys_setattr(struct dentry *dentry, struct iattr *attr)
        if (attr->ia_valid & (ATTR_MODE | ATTR_UID | ATTR_GID))
                return -EPERM;
 
-       error = inode_change_ok(inode, attr);
+       error = setattr_prepare(dentry, attr);
        if (error)
                return error;
 
index ba1323a94924962299d27cbe67d76ff4e0056bb9..aab2593f3179fb4f62e8309f8317f07751c7caca 100644 (file)
@@ -168,7 +168,7 @@ static int ramfs_nommu_setattr(struct dentry *dentry, struct iattr *ia)
        int ret = 0;
 
        /* POSIX UID/GID verification for setting inode attributes */
-       ret = inode_change_ok(inode, ia);
+       ret = setattr_prepare(dentry, ia);
        if (ret)
                return ret;
 
index f6f2fbad9777d3cc9fd50e9295973ed6f10577a2..7da1232a78e33d60671793cd42d9b55813f335e1 100644 (file)
@@ -3312,7 +3312,7 @@ int reiserfs_setattr(struct dentry *dentry, struct iattr *attr)
        unsigned int ia_valid;
        int error;
 
-       error = inode_change_ok(inode, attr);
+       error = setattr_prepare(dentry, attr);
        if (error)
                return error;
 
index 82ddc09061e2891cec1a877d43dc2c248719114e..7ba997e31aeb9bfb3f0474dd55933061c63e11df 100644 (file)
@@ -33,7 +33,7 @@ static int sysv_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;
 
index 75e9b2db14ab0bca63f450dd1e4ae496869a6953..2dc8ce485c5155c50f74b861cea61f40bdbc38e6 100644 (file)
@@ -1263,7 +1263,7 @@ int ubifs_setattr(struct dentry *dentry, struct iattr *attr)
 
        dbg_gen("ino %lu, mode %#x, ia_valid %#x",
                inode->i_ino, inode->i_mode, attr->ia_valid);
-       err = inode_change_ok(inode, attr);
+       err = setattr_prepare(dentry, attr);
        if (err)
                return err;
 
index 7a95b8fed302daa3321915f555ba70cd5fcfd9a4..889f1e5da50743b2e147410c8fc3241eb480622f 100644 (file)
@@ -252,7 +252,7 @@ static int udf_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;
 
index 21154704c16801ea6525f4152637dc3d16b4bdd8..a958b36f40bbc50741e273c1ed4937bd6ed7ebc8 100644 (file)
@@ -496,7 +496,7 @@ int ufs_setattr(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);
        if (error)
                return error;
 
index aa138d64560a6a3c2133bc70d57e367cc8c1476d..61abc3051377f092186376931ebd021caff52a7c 100644 (file)
@@ -81,7 +81,7 @@ static int utimes_common(struct path *path, struct timespec *times)
                        newattrs.ia_valid |= ATTR_MTIME_SET;
                }
                /*
-                * Tell inode_change_ok(), that this is an explicit time
+                * Tell setattr_prepare(), that this is an explicit time
                 * update, even if neither ATTR_ATIME_SET nor ATTR_MTIME_SET
                 * were used.
                 */
@@ -90,7 +90,7 @@ static int utimes_common(struct path *path, struct timespec *times)
                /*
                 * If times is NULL (or both times are UTIME_NOW),
                 * then we need to check permissions, because
-                * inode_change_ok() won't do it.
+                * setattr_prepare() won't do it.
                 */
                error = -EACCES;
                 if (IS_IMMUTABLE(inode))
index 274b8b99edfa162743f607857170d9ca832c9418..4e4d6511185b1c8a39f1d0611b053600869bf51d 100644 (file)
@@ -552,14 +552,14 @@ xfs_vn_change_ok(
        if (XFS_FORCED_SHUTDOWN(mp))
                return -EIO;
 
-       return inode_change_ok(inode, iattr);
+       return setattr_prepare(dentry, iattr);
 }
 
 /*
  * Set non-size attributes of an inode.
  *
  * Caution: The caller of this function is responsible for calling
- * inode_change_ok() or otherwise verifying the change is fine.
+ * setattr_prepare() or otherwise verifying the change is fine.
  */
 int
 xfs_setattr_nonsize(
@@ -770,7 +770,7 @@ xfs_vn_setattr_nonsize(
  * Truncate file.  Must have write permission and not be a directory.
  *
  * Caution: The caller of this function is responsible for calling
- * inode_change_ok() or otherwise verifying the change is fine.
+ * setattr_prepare() or otherwise verifying the change is fine.
  */
 int
 xfs_setattr_size(
index ae327f6a53f696069f8e4ec30ecf8b3dbf073ece..31c3d818c981514a9861c6e72ff9b911bb959a5b 100644 (file)
@@ -2816,7 +2816,7 @@ extern int buffer_migrate_page(struct address_space *,
 #define buffer_migrate_page NULL
 #endif
 
-extern int inode_change_ok(const struct inode *, struct iattr *);
+extern int setattr_prepare(struct dentry *, struct iattr *);
 extern int inode_newsize_ok(const struct inode *, loff_t offset);
 extern void setattr_copy(struct inode *inode, const struct iattr *attr);
 
index 46511ad90bc51db0b45bad1c910e7a91e042639f..feaaf6ea1b862acea21413149c76404b42dd6e35 100644 (file)
@@ -548,7 +548,7 @@ static int shmem_setattr(struct dentry *dentry, struct iattr *attr)
        struct shmem_inode_info *info = SHMEM_I(inode);
        int error;
 
-       error = inode_change_ok(inode, attr);
+       error = setattr_prepare(dentry, attr);
        if (error)
                return error;