summaryrefslogtreecommitdiff
path: root/fs/afs/dynroot.c
diff options
context:
space:
mode:
authorChristian Brauner <brauner@kernel.org>2025-03-10 11:09:25 +0100
committerChristian Brauner <brauner@kernel.org>2025-03-10 11:09:25 +0100
commitaccdd1198eaafd82d03390def709c9865ea5859b (patch)
tree65bb2110f468bcfc92d6da15fc1a96579e607725 /fs/afs/dynroot.c
parent00a7d39898c8010bfd5ff62af31ca5db34421b38 (diff)
parent823869e1e61607ab0d433de3c8abed221dc80a5e (diff)
Merge afs RCU pathwalk fix
Bring in the fix for afs_atcell_get_link() to handle RCU pathwalk from the afs branch for this cycle. This fix has to go upstream now. Signed-off-by: Christian Brauner <brauner@kernel.org>
Diffstat (limited to 'fs/afs/dynroot.c')
-rw-r--r--fs/afs/dynroot.c15
1 files changed, 13 insertions, 2 deletions
diff --git a/fs/afs/dynroot.c b/fs/afs/dynroot.c
index d8bf52f77d93..008698d706ca 100644
--- a/fs/afs/dynroot.c
+++ b/fs/afs/dynroot.c
@@ -314,12 +314,23 @@ static const char *afs_atcell_get_link(struct dentry *dentry, struct inode *inod
const char *name;
bool dotted = vnode->fid.vnode == 3;
- if (!net->ws_cell)
+ if (!dentry) {
+ /* We're in RCU-pathwalk. */
+ cell = rcu_dereference(net->ws_cell);
+ if (dotted)
+ name = cell->name - 1;
+ else
+ name = cell->name;
+ /* Shouldn't need to set a delayed call. */
+ return name;
+ }
+
+ if (!rcu_access_pointer(net->ws_cell))
return ERR_PTR(-ENOENT);
down_read(&net->cells_lock);
- cell = net->ws_cell;
+ cell = rcu_dereference_protected(net->ws_cell, lockdep_is_held(&net->cells_lock));
if (dotted)
name = cell->name - 1;
else