|
@@ -726,11 +726,25 @@ struct inode *__ext4_new_inode(handle_t *handle, struct inode *dir,
|
|
ext4_group_t i;
|
|
ext4_group_t i;
|
|
ext4_group_t flex_group;
|
|
ext4_group_t flex_group;
|
|
struct ext4_group_info *grp;
|
|
struct ext4_group_info *grp;
|
|
|
|
+ int encrypt = 0;
|
|
|
|
|
|
/* Cannot create files in a deleted directory */
|
|
/* Cannot create files in a deleted directory */
|
|
if (!dir || !dir->i_nlink)
|
|
if (!dir || !dir->i_nlink)
|
|
return ERR_PTR(-EPERM);
|
|
return ERR_PTR(-EPERM);
|
|
|
|
|
|
|
|
+ if ((ext4_encrypted_inode(dir) ||
|
|
|
|
+ DUMMY_ENCRYPTION_ENABLED(EXT4_SB(dir->i_sb))) &&
|
|
|
|
+ (S_ISREG(mode) || S_ISDIR(mode) || S_ISLNK(mode))) {
|
|
|
|
+ err = ext4_get_encryption_info(dir);
|
|
|
|
+ if (err)
|
|
|
|
+ return ERR_PTR(err);
|
|
|
|
+ if (ext4_encryption_info(dir) == NULL)
|
|
|
|
+ return ERR_PTR(-EPERM);
|
|
|
|
+ if (!handle)
|
|
|
|
+ nblocks += EXT4_DATA_TRANS_BLOCKS(dir->i_sb);
|
|
|
|
+ encrypt = 1;
|
|
|
|
+ }
|
|
|
|
+
|
|
sb = dir->i_sb;
|
|
sb = dir->i_sb;
|
|
ngroups = ext4_get_groups_count(sb);
|
|
ngroups = ext4_get_groups_count(sb);
|
|
trace_ext4_request_inode(dir, mode);
|
|
trace_ext4_request_inode(dir, mode);
|
|
@@ -996,12 +1010,6 @@ got:
|
|
ei->i_block_group = group;
|
|
ei->i_block_group = group;
|
|
ei->i_last_alloc_group = ~0;
|
|
ei->i_last_alloc_group = ~0;
|
|
|
|
|
|
- /* If the directory encrypted, then we should encrypt the inode. */
|
|
|
|
- if ((S_ISDIR(mode) || S_ISREG(mode) || S_ISLNK(mode)) &&
|
|
|
|
- (ext4_encrypted_inode(dir) ||
|
|
|
|
- DUMMY_ENCRYPTION_ENABLED(sbi)))
|
|
|
|
- ext4_set_inode_flag(inode, EXT4_INODE_ENCRYPT);
|
|
|
|
-
|
|
|
|
ext4_set_inode_flags(inode);
|
|
ext4_set_inode_flags(inode);
|
|
if (IS_DIRSYNC(inode))
|
|
if (IS_DIRSYNC(inode))
|
|
ext4_handle_sync(handle);
|
|
ext4_handle_sync(handle);
|
|
@@ -1063,6 +1071,12 @@ got:
|
|
ei->i_datasync_tid = handle->h_transaction->t_tid;
|
|
ei->i_datasync_tid = handle->h_transaction->t_tid;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ if (encrypt) {
|
|
|
|
+ err = ext4_inherit_context(dir, inode);
|
|
|
|
+ if (err)
|
|
|
|
+ goto fail_free_drop;
|
|
|
|
+ }
|
|
|
|
+
|
|
err = ext4_mark_inode_dirty(handle, inode);
|
|
err = ext4_mark_inode_dirty(handle, inode);
|
|
if (err) {
|
|
if (err) {
|
|
ext4_std_error(sb, err);
|
|
ext4_std_error(sb, err);
|