return 0;
 }
 
+static inline struct ext4_crypt_info *ext4_encryption_info(struct inode *inode)
+{
+       return EXT4_I(inode)->i_crypt_info;
+}
+
 #else
 static inline int ext4_has_encryption_key(struct inode *inode)
 {
 {
        return 0;
 }
+static inline struct ext4_crypt_info *ext4_encryption_info(struct inode *inode)
+{
+       return NULL;
+}
 #endif
 
 
 
        ext4_group_t i;
        ext4_group_t flex_group;
        struct ext4_group_info *grp;
+       int encrypt = 0;
 
        /* Cannot create files in a deleted directory */
        if (!dir || !dir->i_nlink)
                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;
        ngroups = ext4_get_groups_count(sb);
        trace_ext4_request_inode(dir, mode);
        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);
                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);
        if (err) {
                ext4_std_error(sb, err);
 
                inode->i_op = &ext4_file_inode_operations;
                inode->i_fop = &ext4_file_operations;
                ext4_set_aops(inode);
-               err = 0;
-#ifdef CONFIG_EXT4_FS_ENCRYPTION
-               if (!err && (ext4_encrypted_inode(dir) ||
-                            DUMMY_ENCRYPTION_ENABLED(EXT4_SB(dir->i_sb)))) {
-                       err = ext4_inherit_context(dir, inode);
-                       if (err) {
-                               clear_nlink(inode);
-                               unlock_new_inode(inode);
-                               iput(inode);
-                       }
-               }
-#endif
-               if (!err)
-                       err = ext4_add_nondir(handle, dentry, inode);
+               err = ext4_add_nondir(handle, dentry, inode);
                if (!err && IS_DIRSYNC(dir))
                        ext4_handle_sync(handle);
        }
        err = ext4_init_new_dir(handle, dir, inode);
        if (err)
                goto out_clear_inode;
-#ifdef CONFIG_EXT4_FS_ENCRYPTION
-       if (ext4_encrypted_inode(dir) ||
-           DUMMY_ENCRYPTION_ENABLED(EXT4_SB(dir->i_sb))) {
-               err = ext4_inherit_context(dir, inode);
-               if (err)
-                       goto out_clear_inode;
-       }
-#endif
        err = ext4_mark_inode_dirty(handle, inode);
        if (!err)
                err = ext4_add_entry(handle, dentry, inode);
                        err = -ENOMEM;
                        goto err_drop_inode;
                }
-               err = ext4_inherit_context(dir, inode);
-               if (err)
-                       goto err_drop_inode;
-               err = ext4_get_encryption_info(inode);
-               if (err)
-                       goto err_drop_inode;
                istr.name = (const unsigned char *) symname;
                istr.len = len;
                ostr.name = sd->encrypted_path;