Re: [PATCH v10 2/5] ext4: introduce ext4_put_ea_inode() for safe deferred iput

From: Zhou, Yun

Date: Mon Jun 29 2026 - 06:12:38 EST




On 6/29/26 16:23, Jan Kara wrote:
CAUTION: This email comes from a non Wind River email account!
Do not click links or open attachments unless you recognize the sender and know the content is safe.

On Sun 28-06-26 16:13:18, Zhou, Yun wrote:


On 6/27/26 00:53, Jan Kara wrote:
On Thu 25-06-26 23:29:38, Yun Zhou wrote:
+
+/*
+ * Drain all pending deferred EA inode iputs. Must be called before
+ * freeing resources that eviction depends on (quota, block allocator).
+ * Loops because worker iput may trigger eviction that re-queues.
+ */

Can you please explain how iput of EA inode can trigger iput of another EA
inode? So far I don't think that's possible but perhaps I'm missing
something.

+static inline void ext4_drain_ea_inode_work(struct ext4_sb_info *sbi)
+{
+ while (flush_delayed_work(&sbi->s_ea_inode_work) ||
+ !llist_empty(&sbi->s_ea_inode_to_free))
+ ;
+}


On a corrupted fs, an evicted ea_inode might still have xattrs and point to
another ea inode, which creates a potential "re-arm" scenario.

That should be caught when loading such EA inode into memory and result in
EFSCORRUPTED at that point. So please add such check to __ext4_iget().


My apologies, I overlooked this. There is actually already a relevant check in check_igot_inode(). So, the Sashiko AI report is sometimes inaccurate.

if (flags & EXT4_IGET_EA_INODE) {
if (!(EXT4_I(inode)->i_flags & EXT4_EA_INODE_FL)) {
err_str = "missing EA_INODE flag";
goto error;
}
if (ext4_test_inode_state(inode, EXT4_STATE_XATTR) ||
EXT4_I(inode)->i_file_acl) {
err_str = "ea_inode with extended attributes";
goto error;
}