diff options
| author | Chris Mason <mason@kernel.org> | 2026-10-07 10:38:39 +0000 |
|---|---|---|
| committer | Amir Goldstein <amir73il@gmail.com> | 2026-10-29 13:21:58 +0100 |
| commit | 0b691c3c59a58aa6a2fc3f87c10cc1e399f1d33f (patch) | |
| tree | b5ebe41e6be17e0bf2ab83f43e203c412b800ed2 /scripts/Makefile.thinlto | |
| parent | 15c6bd5cf109471baca7fbe46e8f574569257a28 (diff) | |
| download | linux-0b691c3c59a58aa6a2fc3f87c10cc1e399f1d33f.tar.gz linux-0b691c3c59a58aa6a2fc3f87c10cc1e399f1d33f.zip | |
ovl: do not take a name snapshot in RCU walk
A path lookup on an overlay over FUSE loops in the kernel for ever and
stalls RCU.
take_dentry_name_snapshot() needs a dentry that the caller keeps alive,
because for a dead dentry the refcount of an external name stays at
zero and the function retries without end. In RCU walk
ovl_revalidate_real() holds no reference on the real dentry, and the
eviction of the overlay inode on another CPU can drop the last one.
With a delay in ovl_revalidate_real(), a stat() loop on a 48 byte name
in an overlay over FUSE, raced with drop_caches, spun for ever in
take_dentry_name_snapshot() and stalled RCU.
Fix this by using try_take_dentry_name_snapshot() in RCU walk, and by
returning -ECHILD when it fails.
Fixes: 5be1fa8abd7b ("Pass parent directory inode and expected name to ->d_revalidate()")
Cc: stable@vger.kernel.org
Signed-off-by: Chris Mason <mason@kernel.org>
Signed-off-by: Josef Bacik <josef@toxicpanda.com>
[amir: use try_take_dentry_name_snapshot() instead of open coded snapshot]
Signed-off-by: Amir Goldstein <amir73il@gmail.com>
Diffstat (limited to 'scripts/Makefile.thinlto')
0 files changed, 0 insertions, 0 deletions
