Merge tag 'fscrypt-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tytso...
[sfrench/cifs-2.6.git] / fs / ext4 / namei.c
index bd48a8d83961bcc560525fd6b88933f8aa6ce532..798b3ac680db1b4f8c4510a0bd66d0510d11216a 100644 (file)
@@ -1539,24 +1539,14 @@ static struct dentry *ext4_lookup(struct inode *dir, struct dentry *dentry, unsi
        struct inode *inode;
        struct ext4_dir_entry_2 *de;
        struct buffer_head *bh;
+       int err;
 
-       if (ext4_encrypted_inode(dir)) {
-               int res = fscrypt_get_encryption_info(dir);
-
-               /*
-                * DCACHE_ENCRYPTED_WITH_KEY is set if the dentry is
-                * created while the directory was encrypted and we
-                * have access to the key.
-                */
-               if (fscrypt_has_encryption_key(dir))
-                       fscrypt_set_encrypted_dentry(dentry);
-               fscrypt_set_d_op(dentry);
-               if (res && res != -ENOKEY)
-                       return ERR_PTR(res);
-       }
+       err = fscrypt_prepare_lookup(dir, dentry, flags);
+       if (err)
+               return ERR_PTR(err);
 
-       if (dentry->d_name.len > EXT4_NAME_LEN)
-              return ERR_PTR(-ENAMETOOLONG);
+       if (dentry->d_name.len > EXT4_NAME_LEN)
+               return ERR_PTR(-ENAMETOOLONG);
 
        bh = ext4_find_entry(dir, &dentry->d_name, &de, NULL);
        if (IS_ERR(bh))
@@ -3222,9 +3212,10 @@ static int ext4_link(struct dentry *old_dentry,
 
        if (inode->i_nlink >= EXT4_LINK_MAX)
                return -EMLINK;
-       if (ext4_encrypted_inode(dir) &&
-                       !fscrypt_has_permitted_context(dir, inode))
-               return -EPERM;
+
+       err = fscrypt_prepare_link(old_dentry, dir, dentry);
+       if (err)
+               return err;
 
        if ((ext4_test_inode_flag(dir, EXT4_INODE_PROJINHERIT)) &&
           (!projid_eq(EXT4_I(dir)->i_projid,
@@ -3516,12 +3507,6 @@ static int ext4_rename(struct inode *old_dir, struct dentry *old_dentry,
                        EXT4_I(old_dentry->d_inode)->i_projid)))
                return -EXDEV;
 
-       if ((ext4_encrypted_inode(old_dir) &&
-            !fscrypt_has_encryption_key(old_dir)) ||
-           (ext4_encrypted_inode(new_dir) &&
-            !fscrypt_has_encryption_key(new_dir)))
-               return -ENOKEY;
-
        retval = dquot_initialize(old.dir);
        if (retval)
                return retval;
@@ -3550,13 +3535,6 @@ static int ext4_rename(struct inode *old_dir, struct dentry *old_dentry,
        if (!old.bh || le32_to_cpu(old.de->inode) != old.inode->i_ino)
                goto end_rename;
 
-       if ((old.dir != new.dir) &&
-           ext4_encrypted_inode(new.dir) &&
-           !fscrypt_has_permitted_context(new.dir, old.inode)) {
-               retval = -EPERM;
-               goto end_rename;
-       }
-
        new.bh = ext4_find_entry(new.dir, &new.dentry->d_name,
                                 &new.de, &new.inlined);
        if (IS_ERR(new.bh)) {
@@ -3722,19 +3700,6 @@ static int ext4_cross_rename(struct inode *old_dir, struct dentry *old_dentry,
        int retval;
        struct timespec ctime;
 
-       if ((ext4_encrypted_inode(old_dir) &&
-            !fscrypt_has_encryption_key(old_dir)) ||
-           (ext4_encrypted_inode(new_dir) &&
-            !fscrypt_has_encryption_key(new_dir)))
-               return -ENOKEY;
-
-       if ((ext4_encrypted_inode(old_dir) ||
-            ext4_encrypted_inode(new_dir)) &&
-           (old_dir != new_dir) &&
-           (!fscrypt_has_permitted_context(new_dir, old.inode) ||
-            !fscrypt_has_permitted_context(old_dir, new.inode)))
-               return -EPERM;
-
        if ((ext4_test_inode_flag(new_dir, EXT4_INODE_PROJINHERIT) &&
             !projid_eq(EXT4_I(new_dir)->i_projid,
                        EXT4_I(old_dentry->d_inode)->i_projid)) ||
@@ -3861,12 +3826,19 @@ static int ext4_rename2(struct inode *old_dir, struct dentry *old_dentry,
                        struct inode *new_dir, struct dentry *new_dentry,
                        unsigned int flags)
 {
+       int err;
+
        if (unlikely(ext4_forced_shutdown(EXT4_SB(old_dir->i_sb))))
                return -EIO;
 
        if (flags & ~(RENAME_NOREPLACE | RENAME_EXCHANGE | RENAME_WHITEOUT))
                return -EINVAL;
 
+       err = fscrypt_prepare_rename(old_dir, old_dentry, new_dir, new_dentry,
+                                    flags);
+       if (err)
+               return err;
+
        if (flags & RENAME_EXCHANGE) {
                return ext4_cross_rename(old_dir, old_dentry,
                                         new_dir, new_dentry);