diff options
Diffstat (limited to 'fs/ext4')
-rw-r--r-- | fs/ext4/namei.c | 33 |
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); |