ext4: switch to fscrypt_prepare_rename()
Signed-off-by: Eric Biggers <ebiggers@google.com> Signed-off-by: Theodore Ts'o <tytso@mit.edu>
This commit is contained in:
Родитель
697251816d
Коммит
07543d164b
|
@ -3516,12 +3516,6 @@ static int ext4_rename(struct inode *old_dir, struct dentry *old_dentry,
|
||||||
EXT4_I(old_dentry->d_inode)->i_projid)))
|
EXT4_I(old_dentry->d_inode)->i_projid)))
|
||||||
return -EXDEV;
|
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);
|
retval = dquot_initialize(old.dir);
|
||||||
if (retval)
|
if (retval)
|
||||||
return retval;
|
return retval;
|
||||||
|
@ -3550,13 +3544,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)
|
if (!old.bh || le32_to_cpu(old.de->inode) != old.inode->i_ino)
|
||||||
goto end_rename;
|
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.bh = ext4_find_entry(new.dir, &new.dentry->d_name,
|
||||||
&new.de, &new.inlined);
|
&new.de, &new.inlined);
|
||||||
if (IS_ERR(new.bh)) {
|
if (IS_ERR(new.bh)) {
|
||||||
|
@ -3722,19 +3709,6 @@ static int ext4_cross_rename(struct inode *old_dir, struct dentry *old_dentry,
|
||||||
int retval;
|
int retval;
|
||||||
struct timespec ctime;
|
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) &&
|
if ((ext4_test_inode_flag(new_dir, EXT4_INODE_PROJINHERIT) &&
|
||||||
!projid_eq(EXT4_I(new_dir)->i_projid,
|
!projid_eq(EXT4_I(new_dir)->i_projid,
|
||||||
EXT4_I(old_dentry->d_inode)->i_projid)) ||
|
EXT4_I(old_dentry->d_inode)->i_projid)) ||
|
||||||
|
@ -3861,12 +3835,19 @@ static int ext4_rename2(struct inode *old_dir, struct dentry *old_dentry,
|
||||||
struct inode *new_dir, struct dentry *new_dentry,
|
struct inode *new_dir, struct dentry *new_dentry,
|
||||||
unsigned int flags)
|
unsigned int flags)
|
||||||
{
|
{
|
||||||
|
int err;
|
||||||
|
|
||||||
if (unlikely(ext4_forced_shutdown(EXT4_SB(old_dir->i_sb))))
|
if (unlikely(ext4_forced_shutdown(EXT4_SB(old_dir->i_sb))))
|
||||||
return -EIO;
|
return -EIO;
|
||||||
|
|
||||||
if (flags & ~(RENAME_NOREPLACE | RENAME_EXCHANGE | RENAME_WHITEOUT))
|
if (flags & ~(RENAME_NOREPLACE | RENAME_EXCHANGE | RENAME_WHITEOUT))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
|
err = fscrypt_prepare_rename(old_dir, old_dentry, new_dir, new_dentry,
|
||||||
|
flags);
|
||||||
|
if (err)
|
||||||
|
return err;
|
||||||
|
|
||||||
if (flags & RENAME_EXCHANGE) {
|
if (flags & RENAME_EXCHANGE) {
|
||||||
return ext4_cross_rename(old_dir, old_dentry,
|
return ext4_cross_rename(old_dir, old_dentry,
|
||||||
new_dir, new_dentry);
|
new_dir, new_dentry);
|
||||||
|
|
Загрузка…
Ссылка в новой задаче