On Mon, Oct 2, 2023 at 5:36 AM Al Viro <viro@xxxxxxxxxxxxxxxxxx> wrote: > > d_inode_rcu() is right - we might be in rcu pathwalk; > however, OVL_E() hides plain d_inode() on the same dentry... > > Signed-off-by: Al Viro <viro@xxxxxxxxxxxxxxxxxx> Reviewed-by: Amir Goldstein <amir73il@xxxxxxxxx> However, ovl_lowerstack(oe) does not appear to be stable in RCU walk... > --- > fs/overlayfs/super.c | 6 ++++-- > 1 file changed, 4 insertions(+), 2 deletions(-) > > diff --git a/fs/overlayfs/super.c b/fs/overlayfs/super.c > index f09184b865ec..905d3aaf4e55 100644 > --- a/fs/overlayfs/super.c > +++ b/fs/overlayfs/super.c > @@ -104,8 +104,8 @@ static int ovl_revalidate_real(struct dentry *d, unsigned int flags, bool weak) > static int ovl_dentry_revalidate_common(struct dentry *dentry, > unsigned int flags, bool weak) > { > - struct ovl_entry *oe = OVL_E(dentry); > - struct ovl_path *lowerstack = ovl_lowerstack(oe); > + struct ovl_entry *oe; > + struct ovl_path *lowerstack; > struct inode *inode = d_inode_rcu(dentry); > struct dentry *upper; > unsigned int i; > @@ -115,6 +115,8 @@ static int ovl_dentry_revalidate_common(struct dentry *dentry, > if (!inode) > return -ECHILD; > > + oe = OVL_I_E(inode); > + lowerstack = ovl_lowerstack(oe); > upper = ovl_i_dentry_upper(inode); > if (upper) > ret = ovl_revalidate_real(upper, flags, weak); > -- > 2.39.2 >