--- /dev/null
+diff -wur a/fs/ext4/inode.c b/fs/ext4/inode.c
+--- a/fs/ext4/inode.c
++++ b/fs/ext4/inode.c
+@@ -4766,8 +4766,9 @@ void ext4_set_inode_flags(struct inod
+ new_fl |= S_DIRSYNC;
+ if (ext4_should_use_dax(inode))
+ new_fl |= S_DAX;
+- if (flags & EXT4_ENCRYPT_FL)
++ if (flags & EXT4_ENCRYPT_FL &&
++ unlikely(test_opt(inode->i_sb, DIRDATA) != EXT4_MOUNT_DIRDATA))
+ new_fl |= S_ENCRYPTED;
+ if (flags & EXT4_CASEFOLD_FL)
+ new_fl |= S_CASEFOLD;
+ if (flags & EXT4_VERITY_FL)
+@@ -5753,8 +5757,9 @@ int ext4_getattr(const struct path *p
+ stat->attributes |= STATX_ATTR_APPEND;
+ if (flags & EXT4_COMPR_FL)
+ stat->attributes |= STATX_ATTR_COMPRESSED;
+- if (flags & EXT4_ENCRYPT_FL)
++ if (flags & EXT4_ENCRYPT_FL &&
++ unlikely(test_opt(inode->i_sb, DIRDATA) != EXT4_MOUNT_DIRDATA))
+ stat->attributes |= STATX_ATTR_ENCRYPTED;
+ if (flags & EXT4_IMMUTABLE_FL)
+ stat->attributes |= STATX_ATTR_IMMUTABLE;
+ if (flags & EXT4_NODUMP_FL)
+diff -wur a/fs/ext4/xattr.c b/fs/ext4/xattr.c
+--- a/fs/ext4/xattr.c
++++ b/fs/ext4/xattr.c
+@@ -654,6 +654,7 @@
+ up_read(&EXT4_I(inode)->xattr_sem);
+ return error;
+ }
++EXPORT_SYMBOL(ext4_xattr_get);
+
+ static int
+ ext4_xattr_list_entries(struct dentry *dentry, struct ext4_xattr_entry *entry,
+@@ -2413,12 +2415,17 @@
+ ext4_handle_sync(handle);
+ }
+
++ if (!error && name_index == EXT4_XATTR_INDEX_ENCRYPTION &&
++ strcmp(name, "c") == 0)
++ EXT4_I(inode)->i_flags |= EXT4_ENCRYPT_FL;
++
+ cleanup:
+ brelse(is.iloc.bh);
+ brelse(bs.bh);
+ ext4_write_unlock_xattr(inode, &no_expand);
+ return error;
+ }
++EXPORT_SYMBOL(ext4_xattr_set_handle);
+
+ int ext4_xattr_set_credits(struct inode *inode, size_t value_len,
+ bool is_create, int *credits)