Skip to content

Commit e460bc4

Browse files
neilbrownbrauner
authored andcommitted
ovl: narrow locking in ovl_create_over_whiteout()
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. Reviewed-by: Amir Goldstein <amir73il@gmail.com> Signed-off-by: NeilBrown <neil@brown.name> Link: https://lore.kernel.org/20250716004725.1206467-8-neil@brown.name Signed-off-by: Christian Brauner <brauner@kernel.org>
1 parent 4f622bd commit e460bc4

1 file changed

Lines changed: 6 additions & 7 deletions

File tree

fs/overlayfs/dir.c

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -433,9 +433,7 @@ static int ovl_create_over_whiteout(struct dentry *dentry, struct inode *inode,
433433
{
434434
struct ovl_fs *ofs = OVL_FS(dentry->d_sb);
435435
struct dentry *workdir = ovl_workdir(dentry);
436-
struct inode *wdir = workdir->d_inode;
437436
struct dentry *upperdir = ovl_dentry_upper(dentry->d_parent);
438-
struct inode *udir = upperdir->d_inode;
439437
struct dentry *upper;
440438
struct dentry *newdentry;
441439
int err;
@@ -506,22 +504,23 @@ static int ovl_create_over_whiteout(struct dentry *dentry, struct inode *inode,
506504

507505
err = ovl_do_rename(ofs, workdir, newdentry, upperdir, upper,
508506
RENAME_EXCHANGE);
507+
unlock_rename(workdir, upperdir);
509508
if (err)
510-
goto out_cleanup;
509+
goto out_cleanup_unlocked;
511510

512-
ovl_cleanup(ofs, wdir, upper);
511+
ovl_cleanup_unlocked(ofs, workdir, upper);
513512
} else {
514513
err = ovl_do_rename(ofs, workdir, newdentry, upperdir, upper, 0);
514+
unlock_rename(workdir, upperdir);
515515
if (err)
516-
goto out_cleanup;
516+
goto out_cleanup_unlocked;
517517
}
518518
ovl_dir_modified(dentry->d_parent, false);
519519
err = ovl_instantiate(dentry, inode, newdentry, hardlink, NULL);
520520
if (err) {
521-
ovl_cleanup(ofs, udir, newdentry);
521+
ovl_cleanup_unlocked(ofs, upperdir, newdentry);
522522
dput(newdentry);
523523
}
524-
unlock_rename(workdir, upperdir);
525524
out_dput:
526525
dput(upper);
527526
out:

0 commit comments

Comments
 (0)