Commit 91ef18b5 authored by Jan Kara's avatar Jan Kara Committed by Theodore Ts'o
Browse files

ext4: mark inodes without acls in __ext4_iget()

Mark inodes without acls with cache_no_acl() in __ext4_iget() so that
path lookup can run in RCU mode from the start. This is interesting in
particular for the case where the file owner does the lookup because in
that case end up constantly hitting the slow path otherwise. We drop out
from the fast path (because ACL state is unknown) but never end up calling
check_acl() to cache ACL state.

The problem was originally analyzed by Linus and fix tested by Matheusz,
I'm just putting it into mergeable form :).

Link: https://lore.kernel.org/all/CAHk-=whSzc75TLLPWskV0xuaHR4tpWBr=LduqhcCFr4kCmme_w@mail.gmail.com


Reported-by: default avatarMateusz Guzik <mjguzik@gmail.com>
Reported-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: default avatarJan Kara <jack@suse.cz>
Reviewed-by: default avatarBaokun Li <libaokun1@huawei.com>
Message-ID: <20251125101340.24276-2-jack@suse.cz>
Signed-off-by: default avatarTheodore Ts'o <tytso@mit.edu>
parent cab8cbcb
Loading
Loading
Loading
Loading
+3 −1
Original line number Diff line number Diff line
@@ -5508,7 +5508,9 @@ struct inode *__ext4_iget(struct super_block *sb, unsigned long ino,
	if (ret)
		goto bad_inode;
	brelse(iloc.bh);

	/* Initialize the "no ACL's" state for the simple cases */
	if (!ext4_test_inode_state(inode, EXT4_STATE_XATTR) && !ei->i_file_acl)
		cache_no_acl(inode);
	unlock_new_inode(inode);
	return inode;