On Fri, Jul 11, 2025 at 1:21 AM NeilBrown <neil@xxxxxxxxxx> wrote: > > Unlock the parents immediately after the rename, and use > ovl_cleanup_unlocked() for cleanup, which takes a separate lock. > > This makes way for future changes where locks are taken on individual > dentries rather than the whole directory. > > Signed-off-by: NeilBrown <neil@xxxxxxxxxx> > --- > fs/overlayfs/dir.c | 13 ++++++------- > 1 file changed, 6 insertions(+), 7 deletions(-) > > diff --git a/fs/overlayfs/dir.c b/fs/overlayfs/dir.c > index b3d858654f23..687d5e12289c 100644 > --- a/fs/overlayfs/dir.c > +++ b/fs/overlayfs/dir.c > @@ -432,9 +432,7 @@ static int ovl_create_over_whiteout(struct dentry *dentry, struct inode *inode, > { > struct ovl_fs *ofs = OVL_FS(dentry->d_sb); > struct dentry *workdir = ovl_workdir(dentry); > - struct inode *wdir = workdir->d_inode; > struct dentry *upperdir = ovl_dentry_upper(dentry->d_parent); > - struct inode *udir = upperdir->d_inode; > struct dentry *upper; > struct dentry *newdentry; > int err; > @@ -505,22 +503,23 @@ static int ovl_create_over_whiteout(struct dentry *dentry, struct inode *inode, > > err = ovl_do_rename(ofs, workdir, newdentry, upperdir, upper, > RENAME_EXCHANGE); > + unlock_rename(workdir, upperdir); > if (err) > - goto out_cleanup_locked; > + goto out_cleanup; > > - ovl_cleanup(ofs, wdir, upper); > + ovl_cleanup_unlocked(ofs, workdir, upper); > } else { > err = ovl_do_rename(ofs, workdir, newdentry, upperdir, upper, 0); > + unlock_rename(workdir, upperdir); > if (err) > - goto out_cleanup_locked; > + goto out_cleanup; > } With my suggested changes to labels in patch 3, those lines would change to out_cleanup => out_cleanup_unlocked Other that that feel free to add: Reviewed-by: Amir Goldstein <amir73il@xxxxxxxxx> Thanks, Amir. > ovl_dir_modified(dentry->d_parent, false); > err = ovl_instantiate(dentry, inode, newdentry, hardlink, NULL); > if (err) { > - ovl_cleanup(ofs, udir, newdentry); > + ovl_cleanup_unlocked(ofs, upperdir, newdentry); > dput(newdentry); > } > - unlock_rename(workdir, upperdir); > out_dput: > dput(upper); > out: > -- > 2.49.0 >