coda_flag_children(): cope with dentries turning negative
authorAl Viro <viro@zeniv.linux.org.uk>
Tue, 7 Nov 2023 17:35:37 +0000 (12:35 -0500)
committerAl Viro <viro@zeniv.linux.org.uk>
Sat, 25 Nov 2023 07:31:04 +0000 (02:31 -0500)
->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>
fs/coda/cache.c

index 3b8c4513118f4870afdaf3e7f5751d009d5953b5..d6254cf9f39728bce8936316e5695214cc08dcdd 100644 (file)
@@ -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)