Skip to content

Commit 09d56cc

Browse files
neilbrownbrauner
authored andcommitted
ovl: narrow locking in ovl_check_rename_whiteout()
ovl_check_rename_whiteout() now only holds the directory lock when needed, and takes it again if necessary. This makes way for future changes where locks are taken on individual dentries rather than the whole directory. Reviewed-by: Amir Goldstein <[email protected]> Signed-off-by: NeilBrown <[email protected]> Link: https://lore.kernel.org/[email protected] Signed-off-by: Christian Brauner <[email protected]>
1 parent 8afa0a7 commit 09d56cc

File tree

1 file changed

+7
-8
lines changed

1 file changed

+7
-8
lines changed

fs/overlayfs/super.c

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -556,7 +556,6 @@ static int ovl_get_upper(struct super_block *sb, struct ovl_fs *ofs,
556556
static int ovl_check_rename_whiteout(struct ovl_fs *ofs)
557557
{
558558
struct dentry *workdir = ofs->workdir;
559-
struct inode *dir = d_inode(workdir);
560559
struct dentry *temp;
561560
struct dentry *dest;
562561
struct dentry *whiteout;
@@ -577,19 +576,22 @@ static int ovl_check_rename_whiteout(struct ovl_fs *ofs)
577576
err = PTR_ERR(dest);
578577
if (IS_ERR(dest)) {
579578
dput(temp);
580-
goto out_unlock;
579+
ovl_parent_unlock(workdir);
580+
return err;
581581
}
582582

583583
/* Name is inline and stable - using snapshot as a copy helper */
584584
take_dentry_name_snapshot(&name, temp);
585585
err = ovl_do_rename(ofs, workdir, temp, workdir, dest, RENAME_WHITEOUT);
586+
ovl_parent_unlock(workdir);
586587
if (err) {
587588
if (err == -EINVAL)
588589
err = 0;
589590
goto cleanup_temp;
590591
}
591592

592-
whiteout = ovl_lookup_upper(ofs, name.name.name, workdir, name.name.len);
593+
whiteout = ovl_lookup_upper_unlocked(ofs, name.name.name,
594+
workdir, name.name.len);
593595
err = PTR_ERR(whiteout);
594596
if (IS_ERR(whiteout))
595597
goto cleanup_temp;
@@ -598,18 +600,15 @@ static int ovl_check_rename_whiteout(struct ovl_fs *ofs)
598600

599601
/* Best effort cleanup of whiteout and temp file */
600602
if (err)
601-
ovl_cleanup(ofs, dir, whiteout);
603+
ovl_cleanup_unlocked(ofs, workdir, whiteout);
602604
dput(whiteout);
603605

604606
cleanup_temp:
605-
ovl_cleanup(ofs, dir, temp);
607+
ovl_cleanup_unlocked(ofs, workdir, temp);
606608
release_dentry_name_snapshot(&name);
607609
dput(temp);
608610
dput(dest);
609611

610-
out_unlock:
611-
ovl_parent_unlock(workdir);
612-
613612
return err;
614613
}
615614

0 commit comments

Comments
 (0)