diff options
author | Al Viro <viro@zeniv.linux.org.uk> | 2023-11-07 18:35:37 +0100 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2023-11-25 08:31:04 +0100 |
commit | b31559f8e471f402cd71117f35b9cde52d192138 (patch) | |
tree | 6419ab71ed94d5b5ba54c6d7d632d7be5ce8eb3b | |
parent | switch nfsd_client_rmdir() to use of simple_recursive_removal() (diff) | |
download | linux-b31559f8e471f402cd71117f35b9cde52d192138.tar.xz linux-b31559f8e471f402cd71117f35b9cde52d192138.zip |
coda_flag_children(): cope with dentries turning negative
->d_lock on parent does not stabilize ->d_inode of child.
We don't do much with that inode in there, but we need
at least to avoid struct inode getting freed under us...
[rcu_read_lock() is not needed here, since parent's ->d_lock
provides an rcu-critical area]
Reviewed-by: Christian Brauner <brauner@kernel.org>
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
-rw-r--r-- | fs/coda/cache.c | 6 |
1 files changed, 3 insertions, 3 deletions
diff --git a/fs/coda/cache.c b/fs/coda/cache.c index 3b8c4513118f..d6254cf9f397 100644 --- a/fs/coda/cache.c +++ b/fs/coda/cache.c @@ -94,12 +94,12 @@ static void coda_flag_children(struct dentry *parent, int flag) spin_lock(&parent->d_lock); list_for_each_entry(de, &parent->d_subdirs, d_child) { + struct inode *inode = d_inode_rcu(de); /* don't know what to do with negative dentries */ - if (d_inode(de) ) - coda_flag_inode(d_inode(de), flag); + if (inode) + coda_flag_inode(inode, flag); } spin_unlock(&parent->d_lock); - return; } void coda_flag_inode_children(struct inode *inode, int flag) |