On Mon, Jun 1, 2020 at 6:57 PM Vivek Goyal <vgoyal@xxxxxxxxxx> wrote: > > Currently we use a variable "metacopy" which signifies that dentry > could be either uppermetacopy or lowermetacopy. Amir suggested that > we can move code around and use d.metacopy in such a way that we > don't need lowermetacopy and just can do away with uppermetacopy. > > So this patch replaces "metacopy" with "uppermetacopy". > > It also moves some code little higher to keep reading little simpler. > > Suggested-by: Amir Goldstein <amir73il@xxxxxxxxx> > Signed-off-by: Vivek Goyal <vgoyal@xxxxxxxxxx> Reviewed-by: Amir Goldstein <amir73il@xxxxxxxxx> > --- > fs/overlayfs/namei.c | 58 ++++++++++++++++++++++---------------------- > 1 file changed, 29 insertions(+), 29 deletions(-) > > diff --git a/fs/overlayfs/namei.c b/fs/overlayfs/namei.c > index c6208f84129f..3625d6633f50 100644 > --- a/fs/overlayfs/namei.c > +++ b/fs/overlayfs/namei.c > @@ -823,7 +823,7 @@ struct dentry *ovl_lookup(struct inode *dir, struct dentry *dentry, > struct dentry *this; > unsigned int i; > int err; > - bool metacopy = false; > + bool uppermetacopy = false; > struct ovl_lookup_data d = { > .sb = dentry->d_sb, > .name = dentry->d_name, > @@ -869,7 +869,7 @@ struct dentry *ovl_lookup(struct inode *dir, struct dentry *dentry, > goto out_put_upper; > > if (d.metacopy) > - metacopy = true; > + uppermetacopy = true; > } > > if (d.redirect) { > @@ -906,6 +906,22 @@ struct dentry *ovl_lookup(struct inode *dir, struct dentry *dentry, > if (!this) > continue; > > + if ((uppermetacopy || d.metacopy) && !ofs->config.metacopy) { > + err = -EPERM; > + pr_warn_ratelimited("refusing to follow metacopy origin" > + " for (%pd2)\n", dentry); > + goto out_put; > + } > + > + /* > + * Do not store intermediate metacopy dentries in chain, > + * except top most lower metacopy dentry > + */ > + if (d.metacopy && ctr) { > + dput(this); > + continue; > + } > + > /* > * If no origin fh is stored in upper of a merge dir, store fh > * of lower dir and set upper parent "impure". > @@ -940,17 +956,6 @@ struct dentry *ovl_lookup(struct inode *dir, struct dentry *dentry, > origin = this; > } > > - if (d.metacopy) > - metacopy = true; > - /* > - * Do not store intermediate metacopy dentries in chain, > - * except top most lower metacopy dentry > - */ > - if (d.metacopy && ctr) { > - dput(this); > - continue; > - } > - > stack[ctr].dentry = this; > stack[ctr].layer = lower.layer; > ctr++; > @@ -982,22 +987,17 @@ struct dentry *ovl_lookup(struct inode *dir, struct dentry *dentry, > } > } > > - if (metacopy) { > - /* > - * Found a metacopy dentry but did not find corresponding > - * data dentry > - */ > - if (d.metacopy) { > - err = -EIO; > - goto out_put; > - } > - > - err = -EPERM; > - if (!ofs->config.metacopy) { > - pr_warn_ratelimited("refusing to follow metacopy origin for (%pd2)\n", > - dentry); > - goto out_put; > - } > + /* > + * For regular non-metacopy upper dentries, there is no lower > + * path based lookup, hence ctr will be zero. If a dentry is found > + * using ORIGIN xattr on upper, install it in stack. > + * > + * For metacopy dentry, path based lookup will find lower dentries. > + * Just make sure a corresponding data dentry has been found. > + */ > + if (d.metacopy || (uppermetacopy && !ctr)) { > + err = -EIO; > + goto out_put; > } else if (!d.is_dir && upperdentry && !ctr && origin_path) { > if (WARN_ON(stack != NULL)) { > err = -EIO; > -- > 2.25.4 >