diff options
author | Christian Brauner <brauner@kernel.org> | 2025-03-10 11:09:25 +0100 |
---|---|---|
committer | Christian Brauner <brauner@kernel.org> | 2025-03-10 11:09:25 +0100 |
commit | accdd1198eaafd82d03390def709c9865ea5859b (patch) | |
tree | 65bb2110f468bcfc92d6da15fc1a96579e607725 /fs/afs/dynroot.c | |
parent | 00a7d39898c8010bfd5ff62af31ca5db34421b38 (diff) | |
parent | 823869e1e61607ab0d433de3c8abed221dc80a5e (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.c | 15 |
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 |