diff options
| author | Christian Brauner <brauner@kernel.org> | 2026-10-09 23:51:53 +0200 |
|---|---|---|
| committer | Christian Brauner <brauner@kernel.org> | 2026-10-14 22:08:03 +0200 |
| commit | bcec7fc2e224088daf94448d663b02e0d0b9c717 (patch) | |
| tree | 19022ef8ce0af6aa31a28de28fa89395900b1e3a /scripts/Makefile.thinlto | |
| parent | 59e483739f2fd14327ece3f60c4995d060ca46b7 (diff) | |
| download | linux-bcec7fc2e224088daf94448d663b02e0d0b9c717.tar.gz linux-bcec7fc2e224088daf94448d663b02e0d0b9c717.zip | |
9p: free the session after a grace period
v9fs_vfs_get_link_dotl() reads ->cache from the v9fs_session_info in
sb->s_fs_info to decide whether the symlink target sits in the page
cache. It does that before it looks at the dentry, so it also does it in
rcu pathwalk mode. Without loose or metadata caching the dentries have
no ->d_revalidate() that would make the walk leave rcu mode before it
gets there.
v9fs_kill_super() frees the session and clears sb->s_fs_info without
waiting for a grace period. Right now a pathwalk can't still be in
v9fs_vfs_get_link_dotl() at that point, but only by accident. umount(2)
waits for a grace period in namespace_unlock() before it drops the
mount. And a mount whose last reference goes away elsewhere, like the
chdir out of a lazily unmounted directory, still gets a grace period
from bdi_unregister(). v9fs_fill_super() sets up a private bdi, so
generic_shutdown_super() unregisters it from kill_anon_super() and
bdi_remove_from_list() waits in synchronize_rcu_expedited() before
v9fs_kill_super() frees the session. That grace period protects the rcu
readers of bdi_list in the writeback code. It has nothing to do with
pathwalk.
Don't rely on it. Keep sb->s_fs_info and free the session after a grace
period.
Fixes: 712da38d134b ("9p: Enable symlink caching in page cache")
Cc: stable@vger.kernel.org
Link: https://patch.msgid.link/20261009-work-fixes-rcu-v1-3-7446d2d335e6@kernel.org
Signed-off-by: Christian Brauner (Amutable) <brauner@kernel.org>
Diffstat (limited to 'scripts/Makefile.thinlto')
0 files changed, 0 insertions, 0 deletions
