]> git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/blobdiff - fs/ext4/ialloc.c
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs
[mirror_ubuntu-artful-kernel.git] / fs / ext4 / ialloc.c
index ac644c31ca67472f3a16f91c6107e3d06772f66f..1eaa6cb96cd086f0274c2af014fa8c6e75d7ec80 100644 (file)
@@ -14,7 +14,6 @@
 
 #include <linux/time.h>
 #include <linux/fs.h>
-#include <linux/jbd2.h>
 #include <linux/stat.h>
 #include <linux/string.h>
 #include <linux/quotaops.h>
@@ -444,7 +443,7 @@ static int find_group_orlov(struct super_block *sb, struct inode *parent,
        ndirs = percpu_counter_read_positive(&sbi->s_dirs_counter);
 
        if (S_ISDIR(mode) &&
-           ((parent == sb->s_root->d_inode) ||
+           ((parent == d_inode(sb->s_root)) ||
             (ext4_test_inode_flag(parent, EXT4_INODE_TOPDIR)))) {
                int best_ndir = inodes_per_group;
                int ret = -1;
@@ -997,6 +996,12 @@ got:
        ei->i_block_group = group;
        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);
        if (IS_DIRSYNC(inode))
                ext4_handle_sync(handle);
@@ -1029,11 +1034,28 @@ got:
        ext4_set_inode_state(inode, EXT4_STATE_NEW);
 
        ei->i_extra_isize = EXT4_SB(sb)->s_want_extra_isize;
-
+#ifdef CONFIG_EXT4_FS_ENCRYPTION
+       if ((sbi->s_file_encryption_mode == EXT4_ENCRYPTION_MODE_INVALID) &&
+           (sbi->s_dir_encryption_mode == EXT4_ENCRYPTION_MODE_INVALID)) {
+               ei->i_inline_off = 0;
+               if (EXT4_HAS_INCOMPAT_FEATURE(sb,
+                       EXT4_FEATURE_INCOMPAT_INLINE_DATA))
+                       ext4_set_inode_state(inode,
+                       EXT4_STATE_MAY_INLINE_DATA);
+       } else {
+               /* Inline data and encryption are incompatible
+                * We turn off inline data since encryption is enabled */
+               ei->i_inline_off = 1;
+               if (EXT4_HAS_INCOMPAT_FEATURE(sb,
+                       EXT4_FEATURE_INCOMPAT_INLINE_DATA))
+                       ext4_clear_inode_state(inode,
+                       EXT4_STATE_MAY_INLINE_DATA);
+       }
+#else
        ei->i_inline_off = 0;
        if (EXT4_HAS_INCOMPAT_FEATURE(sb, EXT4_FEATURE_INCOMPAT_INLINE_DATA))
                ext4_set_inode_state(inode, EXT4_STATE_MAY_INLINE_DATA);
-
+#endif
        ret = inode;
        err = dquot_alloc_inode(inode);
        if (err)