diff options
| author | Al Viro <[email protected]> | 2024-12-09 03:27:51 +0000 |
|---|---|---|
| committer | Al Viro <[email protected]> | 2025-01-17 22:46:06 +0000 |
| commit | 1c9be84a9074b2b91c0db6b88174145504acf0ef (patch) | |
| tree | 3f9730128a07edb4b5efab31909f6c70a3314974 /fs/ext4/fast_commit.c | |
| parent | dcache: back inline names with a struct-wrapped array of unsigned long (diff) | |
| download | kernel-1c9be84a9074b2b91c0db6b88174145504acf0ef.tar.gz kernel-1c9be84a9074b2b91c0db6b88174145504acf0ef.zip | |
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 <[email protected]>
Reviewed-by: Jan Kara <[email protected]>
Signed-off-by: Al Viro <[email protected]>
Diffstat (limited to 'fs/ext4/fast_commit.c')
0 files changed, 0 insertions, 0 deletions
