On Tue, Sep 5, 2017 at 10:46 AM, Miklos Szeredi <mszeredi@xxxxxxxxxx> wrote: > Add a separate flags argument (in addition to the open flags) to control > the behavior of d_real(). > > Signed-off-by: Miklos Szeredi <mszeredi@xxxxxxxxxx> > --- ... > --- a/fs/overlayfs/super.c > +++ b/fs/overlayfs/super.c > > static struct dentry *ovl_d_real(struct dentry *dentry, > const struct inode *inode, > - unsigned int open_flags) > + unsigned int open_flags, unsigned int flags) > { > struct dentry *real; > int err; > @@ -102,7 +102,7 @@ static struct dentry *ovl_d_real(struct dentry *dentry, > goto bug; > > /* Handle recursion */ > - real = d_real(real, inode, open_flags); > + real = d_real(real, inode, open_flags, 0); > Shouldn't recursion pass on flags? The answer is probably per flag. The 2 currently proposed flags don't end up in recursion anyway, although it is arguable that D_REAL_ALL should end up in recursion because according to comment it should behave the same as d_real for regular files. For the purpose for which D_REAL_ALL was proposed (atime update) the recursion case doesn't really matter. Maybe a flag D_REAL_NORECURSE and then for update_ovl_inode_times() use D_REAL_ALL|D_REAL_NORECURSE Alternatively, update_ovl_inode_times() could use D_REAL_UPPER and then we explicitly say that we don't care about lower mtime/ctime modifications. Amir.