]> www.infradead.org Git - users/willy/pagecache.git/commit
make take_dentry_name_snapshot() lockless
authorAl Viro <viro@zeniv.linux.org.uk>
Mon, 9 Dec 2024 03:27:51 +0000 (22:27 -0500)
committerAl Viro <viro@zeniv.linux.org.uk>
Fri, 17 Jan 2025 22:46:06 +0000 (17:46 -0500)
commit1c9be84a9074b2b91c0db6b88174145504acf0ef
tree3f9730128a07edb4b5efab31909f6c70a3314974
parent58cf9c383c5c686668082f83f7e0f3e0bd5cc2e3
make take_dentry_name_snapshot() lockless

Use ->d_seq instead of grabbing ->d_lock; in case of shortname dentries
that avoids any stores to shared data objects and in case of long names
we are down to (unavoidable) atomic_inc on the external_name refcount.

Makes the thing safer as well - the areas where ->d_seq is held odd are
all nested inside the areas where ->d_lock is held, and the latter are
much more numerous.

NOTE: now that there is a lockless path where we might try to grab
a reference to an already doomed external_name instance, it is no
longer possible for external_name.u.count and external_name.u.head
to share space (kudos to Linus for spotting that).

To reduce the noise this commit just make external_name.u a struct
(instead of union); the next commit will dissolve it.

Reviewed-by: Jeff Layton <jlayton@kernel.org>
Reviewed-by: Jan Kara <jack@suse.cz>
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
fs/dcache.c