summaryrefslogtreecommitdiffstats
path: root/fs/ext4
diff options
context:
space:
mode:
authorEric Biggers <ebiggers@google.com>2017-10-18 20:21:57 -0400
committerTheodore Ts'o <tytso@mit.edu>2017-10-18 20:21:57 -0400
commit07543d164ba79e34c61f0f8aeb4af9cd86c88d2c (patch)
tree9be5c584d001737f99cdfc553c25981eecd68305 /fs/ext4
parent697251816d64572098a2d26791a1c49c3723f5b1 (diff)
ext4: switch to fscrypt_prepare_rename()
Signed-off-by: Eric Biggers <ebiggers@google.com> Signed-off-by: Theodore Ts'o <tytso@mit.edu>
Diffstat (limited to 'fs/ext4')
-rw-r--r--fs/ext4/namei.c33
1 files changed, 7 insertions, 26 deletions
diff --git a/fs/ext4/namei.c b/fs/ext4/namei.c
index b2058500f1dc..b2fbc2b87bcf 100644
--- a/fs/ext4/namei.c
+++ b/fs/ext4/namei.c
@@ -3516,12 +3516,6 @@ static int ext4_rename(struct inode *old_dir, struct dentry *old_dentry,
3516 EXT4_I(old_dentry->d_inode)->i_projid))) 3516 EXT4_I(old_dentry->d_inode)->i_projid)))
3517 return -EXDEV; 3517 return -EXDEV;
3518 3518
3519 if ((ext4_encrypted_inode(old_dir) &&
3520 !fscrypt_has_encryption_key(old_dir)) ||
3521 (ext4_encrypted_inode(new_dir) &&
3522 !fscrypt_has_encryption_key(new_dir)))
3523 return -ENOKEY;
3524
3525 retval = dquot_initialize(old.dir); 3519 retval = dquot_initialize(old.dir);
3526 if (retval) 3520 if (retval)
3527 return retval; 3521 return retval;
@@ -3550,13 +3544,6 @@ static int ext4_rename(struct inode *old_dir, struct dentry *old_dentry,
3550 if (!old.bh || le32_to_cpu(old.de->inode) != old.inode->i_ino) 3544 if (!old.bh || le32_to_cpu(old.de->inode) != old.inode->i_ino)
3551 goto end_rename; 3545 goto end_rename;
3552 3546
3553 if ((old.dir != new.dir) &&
3554 ext4_encrypted_inode(new.dir) &&
3555 !fscrypt_has_permitted_context(new.dir, old.inode)) {
3556 retval = -EPERM;
3557 goto end_rename;
3558 }
3559
3560 new.bh = ext4_find_entry(new.dir, &new.dentry->d_name, 3547 new.bh = ext4_find_entry(new.dir, &new.dentry->d_name,
3561 &new.de, &new.inlined); 3548 &new.de, &new.inlined);
3562 if (IS_ERR(new.bh)) { 3549 if (IS_ERR(new.bh)) {
@@ -3722,19 +3709,6 @@ static int ext4_cross_rename(struct inode *old_dir, struct dentry *old_dentry,
3722 int retval; 3709 int retval;
3723 struct timespec ctime; 3710 struct timespec ctime;
3724 3711
3725 if ((ext4_encrypted_inode(old_dir) &&
3726 !fscrypt_has_encryption_key(old_dir)) ||
3727 (ext4_encrypted_inode(new_dir) &&
3728 !fscrypt_has_encryption_key(new_dir)))
3729 return -ENOKEY;
3730
3731 if ((ext4_encrypted_inode(old_dir) ||
3732 ext4_encrypted_inode(new_dir)) &&
3733 (old_dir != new_dir) &&
3734 (!fscrypt_has_permitted_context(new_dir, old.inode) ||
3735 !fscrypt_has_permitted_context(old_dir, new.inode)))
3736 return -EPERM;
3737
3738 if ((ext4_test_inode_flag(new_dir, EXT4_INODE_PROJINHERIT) && 3712 if ((ext4_test_inode_flag(new_dir, EXT4_INODE_PROJINHERIT) &&
3739 !projid_eq(EXT4_I(new_dir)->i_projid, 3713 !projid_eq(EXT4_I(new_dir)->i_projid,
3740 EXT4_I(old_dentry->d_inode)->i_projid)) || 3714 EXT4_I(old_dentry->d_inode)->i_projid)) ||
@@ -3861,12 +3835,19 @@ static int ext4_rename2(struct inode *old_dir, struct dentry *old_dentry,
3861 struct inode *new_dir, struct dentry *new_dentry, 3835 struct inode *new_dir, struct dentry *new_dentry,
3862 unsigned int flags) 3836 unsigned int flags)
3863{ 3837{
3838 int err;
3839
3864 if (unlikely(ext4_forced_shutdown(EXT4_SB(old_dir->i_sb)))) 3840 if (unlikely(ext4_forced_shutdown(EXT4_SB(old_dir->i_sb))))
3865 return -EIO; 3841 return -EIO;
3866 3842
3867 if (flags & ~(RENAME_NOREPLACE | RENAME_EXCHANGE | RENAME_WHITEOUT)) 3843 if (flags & ~(RENAME_NOREPLACE | RENAME_EXCHANGE | RENAME_WHITEOUT))
3868 return -EINVAL; 3844 return -EINVAL;
3869 3845
3846 err = fscrypt_prepare_rename(old_dir, old_dentry, new_dir, new_dentry,
3847 flags);
3848 if (err)
3849 return err;
3850
3870 if (flags & RENAME_EXCHANGE) { 3851 if (flags & RENAME_EXCHANGE) {
3871 return ext4_cross_rename(old_dir, old_dentry, 3852 return ext4_cross_rename(old_dir, old_dentry,
3872 new_dir, new_dentry); 3853 new_dir, new_dentry);