Skip to content

Commit a07052e

Browse files
neilbrownbrauner
authored andcommitted
ovl: narrow locking in ovl_create_upper()
Drop the directory lock immediately after the ovl_create_real() call and take a separate lock later for cleanup in ovl_cleanup_unlocked() - if needed. 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-6-neil@brown.name Signed-off-by: Christian Brauner <brauner@kernel.org>
1 parent a735bdf commit a07052e

1 file changed

Lines changed: 5 additions & 7 deletions

File tree

fs/overlayfs/dir.c

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -326,9 +326,9 @@ static int ovl_create_upper(struct dentry *dentry, struct inode *inode,
326326
ovl_lookup_upper(ofs, dentry->d_name.name,
327327
upperdir, dentry->d_name.len),
328328
attr);
329-
err = PTR_ERR(newdentry);
329+
inode_unlock(udir);
330330
if (IS_ERR(newdentry))
331-
goto out_unlock;
331+
return PTR_ERR(newdentry);
332332

333333
if (ovl_type_merge(dentry->d_parent) && d_is_dir(newdentry) &&
334334
!ovl_allow_offline_changes(ofs)) {
@@ -340,14 +340,12 @@ static int ovl_create_upper(struct dentry *dentry, struct inode *inode,
340340
err = ovl_instantiate(dentry, inode, newdentry, !!attr->hardlink, NULL);
341341
if (err)
342342
goto out_cleanup;
343-
out_unlock:
344-
inode_unlock(udir);
345-
return err;
343+
return 0;
346344

347345
out_cleanup:
348-
ovl_cleanup(ofs, udir, newdentry);
346+
ovl_cleanup_unlocked(ofs, upperdir, newdentry);
349347
dput(newdentry);
350-
goto out_unlock;
348+
return err;
351349
}
352350

353351
static struct dentry *ovl_clear_empty(struct dentry *dentry,

0 commit comments

Comments
 (0)