Skip to content

Commit c69566b

Browse files
neilbrownbrauner
authored andcommitted
ovl: narrow locking on ovl_remove_and_whiteout()
This code: performs a lookup_upper creates a whiteout object renames the whiteout over the result of the lookup The create and the rename must be locked separately for proposed directory locking changes. This patch takes a first step of moving the lookup out of the locked region. A subsequent patch will separate the create from the rename. Signed-off-by: NeilBrown <neil@brown.name> Link: https://lore.kernel.org/20250716004725.1206467-17-neil@brown.name Reviewed-by: Amir Goldstein <amir73il@gmail.com> Signed-off-by: Christian Brauner <brauner@kernel.org>
1 parent 241062a commit c69566b

1 file changed

Lines changed: 10 additions & 13 deletions

File tree

fs/overlayfs/dir.c

Lines changed: 10 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -770,15 +770,11 @@ static int ovl_remove_and_whiteout(struct dentry *dentry,
770770
goto out;
771771
}
772772

773-
err = ovl_lock_rename_workdir(workdir, NULL, upperdir, NULL);
774-
if (err)
775-
goto out_dput;
776-
777-
upper = ovl_lookup_upper(ofs, dentry->d_name.name, upperdir,
778-
dentry->d_name.len);
773+
upper = ovl_lookup_upper_unlocked(ofs, dentry->d_name.name, upperdir,
774+
dentry->d_name.len);
779775
err = PTR_ERR(upper);
780776
if (IS_ERR(upper))
781-
goto out_unlock;
777+
goto out_dput;
782778

783779
err = -ESTALE;
784780
if ((opaquedir && upper != opaquedir) ||
@@ -787,17 +783,18 @@ static int ovl_remove_and_whiteout(struct dentry *dentry,
787783
goto out_dput_upper;
788784
}
789785

790-
err = ovl_cleanup_and_whiteout(ofs, upperdir, upper);
786+
err = ovl_lock_rename_workdir(workdir, NULL, upperdir, upper);
791787
if (err)
792-
goto out_d_drop;
788+
goto out_dput_upper;
789+
790+
err = ovl_cleanup_and_whiteout(ofs, upperdir, upper);
791+
if (!err)
792+
ovl_dir_modified(dentry->d_parent, true);
793793

794-
ovl_dir_modified(dentry->d_parent, true);
795-
out_d_drop:
796794
d_drop(dentry);
795+
unlock_rename(workdir, upperdir);
797796
out_dput_upper:
798797
dput(upper);
799-
out_unlock:
800-
unlock_rename(workdir, upperdir);
801798
out_dput:
802799
dput(opaquedir);
803800
out:

0 commit comments

Comments
 (0)