On Wed, 2026-02-04 at 15:57 +1100, NeilBrown wrote: > From: NeilBrown <[email protected]> > > Rather than using lock_rename(), use the more obvious is_subdir() for > ensuring that neither upper nor workdir contain the other. > Also be explicit in the comment that the two directories cannot be the > same. > > As this is a point-it-time sanity check and does not provide any > on-going guarantees, the removal of locking does not introduce any > interesting races. > > Signed-off-by: NeilBrown <[email protected]> > --- > fs/overlayfs/super.c | 15 +++++---------- > 1 file changed, 5 insertions(+), 10 deletions(-) > > diff --git a/fs/overlayfs/super.c b/fs/overlayfs/super.c > index ba9146f22a2c..2fd3e0aee50e 100644 > --- a/fs/overlayfs/super.c > +++ b/fs/overlayfs/super.c > @@ -451,18 +451,13 @@ static int ovl_lower_dir(const char *name, const struct > path *path, > return 0; > } > > -/* Workdir should not be subdir of upperdir and vice versa */ > +/* > + * Workdir should not be subdir of upperdir and vice versa, and > + * they should not be the same. > + */ > static bool ovl_workdir_ok(struct dentry *workdir, struct dentry *upperdir) > { > - bool ok = false; > - > - if (workdir != upperdir) { > - struct dentry *trap = lock_rename(workdir, upperdir); > - if (!IS_ERR(trap)) > - unlock_rename(workdir, upperdir); > - ok = (trap == NULL); > - } > - return ok; > + return !is_subdir(workdir, upperdir) && !is_subdir(upperdir, workdir); > } > > static int ovl_setup_trap(struct super_block *sb, struct dentry *dir,
Reviewed-by: Jeff Layton <[email protected]>
