Skip to content

Commit 22f289c

Browse files
braunerMiklos Szeredi
authored andcommitted
ovl: use ovl_lookup_upper() wrapper
Introduce ovl_lookup_upper() as a simple wrapper around lookup_one(). Make it clear in the helper's name that this only operates on the upper layer. The wrapper will take upper layer's idmapping into account when checking permission in lookup_one(). Cc: <linux-unionfs@vger.kernel.org> Tested-by: Giuseppe Scrivano <gscrivan@redhat.com> Reviewed-by: Amir Goldstein <amir73il@gmail.com> Signed-off-by: Christian Brauner (Microsoft) <brauner@kernel.org> Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
1 parent a15506e commit 22f289c

6 files changed

Lines changed: 37 additions & 28 deletions

File tree

fs/overlayfs/copy_up.c

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -486,7 +486,7 @@ static int ovl_create_index(struct dentry *dentry, struct dentry *origin,
486486
if (err)
487487
goto out;
488488

489-
index = lookup_one_len(name.name, indexdir, name.len);
489+
index = ovl_lookup_upper(ofs, name.name, indexdir, name.len);
490490
if (IS_ERR(index)) {
491491
err = PTR_ERR(index);
492492
} else {
@@ -535,8 +535,8 @@ static int ovl_link_up(struct ovl_copy_up_ctx *c)
535535
return err;
536536

537537
inode_lock_nested(udir, I_MUTEX_PARENT);
538-
upper = lookup_one_len(c->dentry->d_name.name, upperdir,
539-
c->dentry->d_name.len);
538+
upper = ovl_lookup_upper(ofs, c->dentry->d_name.name, upperdir,
539+
c->dentry->d_name.len);
540540
err = PTR_ERR(upper);
541541
if (!IS_ERR(upper)) {
542542
err = ovl_do_link(ofs, ovl_dentry_upper(c->dentry), udir, upper);
@@ -699,7 +699,8 @@ static int ovl_copy_up_workdir(struct ovl_copy_up_ctx *c)
699699
goto cleanup;
700700
}
701701

702-
upper = lookup_one_len(c->destname.name, c->destdir, c->destname.len);
702+
upper = ovl_lookup_upper(ofs, c->destname.name, c->destdir,
703+
c->destname.len);
703704
err = PTR_ERR(upper);
704705
if (IS_ERR(upper))
705706
goto cleanup;
@@ -751,7 +752,8 @@ static int ovl_copy_up_tmpfile(struct ovl_copy_up_ctx *c)
751752

752753
inode_lock_nested(udir, I_MUTEX_PARENT);
753754

754-
upper = lookup_one_len(c->destname.name, c->destdir, c->destname.len);
755+
upper = ovl_lookup_upper(ofs, c->destname.name, c->destdir,
756+
c->destname.len);
755757
err = PTR_ERR(upper);
756758
if (!IS_ERR(upper)) {
757759
err = ovl_do_link(ofs, temp, udir, upper);

fs/overlayfs/dir.c

Lines changed: 15 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ struct dentry *ovl_lookup_temp(struct ovl_fs *ofs, struct dentry *workdir)
5151
/* counter is allowed to wrap, since temp dentries are ephemeral */
5252
snprintf(name, sizeof(name), "#%x", atomic_inc_return(&temp_id));
5353

54-
temp = lookup_one_len(name, workdir, strlen(name));
54+
temp = ovl_lookup_upper(ofs, name, workdir, strlen(name));
5555
if (!IS_ERR(temp) && temp->d_inode) {
5656
pr_err("workdir/%s already exists\n", name);
5757
dput(temp);
@@ -155,8 +155,8 @@ int ovl_mkdir_real(struct ovl_fs *ofs, struct inode *dir,
155155
* to it unhashed and negative. If that happens, try to
156156
* lookup a new hashed and positive dentry.
157157
*/
158-
d = lookup_one_len(dentry->d_name.name, dentry->d_parent,
159-
dentry->d_name.len);
158+
d = ovl_lookup_upper(ofs, dentry->d_name.name, dentry->d_parent,
159+
dentry->d_name.len);
160160
if (IS_ERR(d)) {
161161
pr_warn("failed lookup after mkdir (%pd2, err=%i).\n",
162162
dentry, err);
@@ -333,9 +333,8 @@ static int ovl_create_upper(struct dentry *dentry, struct inode *inode,
333333

334334
inode_lock_nested(udir, I_MUTEX_PARENT);
335335
newdentry = ovl_create_real(ofs, udir,
336-
lookup_one_len(dentry->d_name.name,
337-
upperdir,
338-
dentry->d_name.len),
336+
ovl_lookup_upper(ofs, dentry->d_name.name,
337+
upperdir, dentry->d_name.len),
339338
attr);
340339
err = PTR_ERR(newdentry);
341340
if (IS_ERR(newdentry))
@@ -488,8 +487,8 @@ static int ovl_create_over_whiteout(struct dentry *dentry, struct inode *inode,
488487
if (err)
489488
goto out;
490489

491-
upper = lookup_one_len(dentry->d_name.name, upperdir,
492-
dentry->d_name.len);
490+
upper = ovl_lookup_upper(ofs, dentry->d_name.name, upperdir,
491+
dentry->d_name.len);
493492
err = PTR_ERR(upper);
494493
if (IS_ERR(upper))
495494
goto out_unlock;
@@ -771,8 +770,8 @@ static int ovl_remove_and_whiteout(struct dentry *dentry,
771770
if (err)
772771
goto out_dput;
773772

774-
upper = lookup_one_len(dentry->d_name.name, upperdir,
775-
dentry->d_name.len);
773+
upper = ovl_lookup_upper(ofs, dentry->d_name.name, upperdir,
774+
dentry->d_name.len);
776775
err = PTR_ERR(upper);
777776
if (IS_ERR(upper))
778777
goto out_unlock;
@@ -819,8 +818,8 @@ static int ovl_remove_upper(struct dentry *dentry, bool is_dir,
819818
}
820819

821820
inode_lock_nested(dir, I_MUTEX_PARENT);
822-
upper = lookup_one_len(dentry->d_name.name, upperdir,
823-
dentry->d_name.len);
821+
upper = ovl_lookup_upper(ofs, dentry->d_name.name, upperdir,
822+
dentry->d_name.len);
824823
err = PTR_ERR(upper);
825824
if (IS_ERR(upper))
826825
goto out_unlock;
@@ -1195,8 +1194,8 @@ static int ovl_rename(struct user_namespace *mnt_userns, struct inode *olddir,
11951194

11961195
trap = lock_rename(new_upperdir, old_upperdir);
11971196

1198-
olddentry = lookup_one_len(old->d_name.name, old_upperdir,
1199-
old->d_name.len);
1197+
olddentry = ovl_lookup_upper(ofs, old->d_name.name, old_upperdir,
1198+
old->d_name.len);
12001199
err = PTR_ERR(olddentry);
12011200
if (IS_ERR(olddentry))
12021201
goto out_unlock;
@@ -1205,8 +1204,8 @@ static int ovl_rename(struct user_namespace *mnt_userns, struct inode *olddir,
12051204
if (!ovl_matches_upper(old, olddentry))
12061205
goto out_dput_old;
12071206

1208-
newdentry = lookup_one_len(new->d_name.name, new_upperdir,
1209-
new->d_name.len);
1207+
newdentry = ovl_lookup_upper(ofs, new->d_name.name, new_upperdir,
1208+
new->d_name.len);
12101209
err = PTR_ERR(newdentry);
12111210
if (IS_ERR(newdentry))
12121211
goto out_dput_old;

fs/overlayfs/overlayfs.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
#include <linux/kernel.h>
88
#include <linux/uuid.h>
99
#include <linux/fs.h>
10+
#include <linux/namei.h>
1011
#include "ovl_entry.h"
1112

1213
#undef pr_fmt
@@ -310,6 +311,13 @@ static inline struct dentry *ovl_do_tmpfile(struct ovl_fs *ofs,
310311
return ret;
311312
}
312313

314+
static inline struct dentry *ovl_lookup_upper(struct ovl_fs *ofs,
315+
const char *name,
316+
struct dentry *base, int len)
317+
{
318+
return lookup_one(ovl_upper_mnt_userns(ofs), name, base, len);
319+
}
320+
313321
static inline bool ovl_open_flags_need_copy_up(int flags)
314322
{
315323
if (!flags)

fs/overlayfs/readdir.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1013,7 +1013,7 @@ void ovl_cleanup_whiteouts(struct ovl_fs *ofs, struct dentry *upper,
10131013
if (WARN_ON(!p->is_whiteout || !p->is_upper))
10141014
continue;
10151015

1016-
dentry = lookup_one_len(p->name, upper, p->len);
1016+
dentry = ovl_lookup_upper(ofs, p->name, upper, p->len);
10171017
if (IS_ERR(dentry)) {
10181018
pr_err("lookup '%s/%.*s' failed (%i)\n",
10191019
upper->d_name.name, p->len, p->name,
@@ -1113,7 +1113,7 @@ static int ovl_workdir_cleanup_recurse(struct ovl_fs *ofs, struct path *path,
11131113
err = -EINVAL;
11141114
break;
11151115
}
1116-
dentry = lookup_one_len(p->name, path->dentry, p->len);
1116+
dentry = ovl_lookup_upper(ofs, p->name, path->dentry, p->len);
11171117
if (IS_ERR(dentry))
11181118
continue;
11191119
if (dentry->d_inode)
@@ -1181,7 +1181,7 @@ int ovl_indexdir_cleanup(struct ovl_fs *ofs)
11811181
if (p->len == 2 && p->name[1] == '.')
11821182
continue;
11831183
}
1184-
index = lookup_one_len(p->name, indexdir, p->len);
1184+
index = ovl_lookup_upper(ofs, p->name, indexdir, p->len);
11851185
if (IS_ERR(index)) {
11861186
err = PTR_ERR(index);
11871187
index = NULL;

fs/overlayfs/super.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -761,7 +761,7 @@ static struct dentry *ovl_workdir_create(struct ovl_fs *ofs,
761761

762762
inode_lock_nested(dir, I_MUTEX_PARENT);
763763
retry:
764-
work = lookup_one_len(name, ofs->workbasedir, strlen(name));
764+
work = ovl_lookup_upper(ofs, name, ofs->workbasedir, strlen(name));
765765

766766
if (!IS_ERR(work)) {
767767
struct iattr attr = {
@@ -1289,7 +1289,7 @@ static int ovl_check_rename_whiteout(struct ovl_fs *ofs)
12891289
goto cleanup_temp;
12901290
}
12911291

1292-
whiteout = lookup_one_len(name.name.name, workdir, name.name.len);
1292+
whiteout = ovl_lookup_upper(ofs, name.name.name, workdir, name.name.len);
12931293
err = PTR_ERR(whiteout);
12941294
if (IS_ERR(whiteout))
12951295
goto cleanup_temp;
@@ -1321,7 +1321,7 @@ static struct dentry *ovl_lookup_or_create(struct ovl_fs *ofs,
13211321
struct dentry *child;
13221322

13231323
inode_lock_nested(parent->d_inode, I_MUTEX_PARENT);
1324-
child = lookup_one_len(name, parent, len);
1324+
child = ovl_lookup_upper(ofs, name, parent, len);
13251325
if (!IS_ERR(child) && !child->d_inode)
13261326
child = ovl_create_real(ofs, parent->d_inode, child,
13271327
OVL_CATTR(mode));

fs/overlayfs/util.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -838,7 +838,7 @@ static void ovl_cleanup_index(struct dentry *dentry)
838838
}
839839

840840
inode_lock_nested(dir, I_MUTEX_PARENT);
841-
index = lookup_one_len(name.name, indexdir, name.len);
841+
index = ovl_lookup_upper(ofs, name.name, indexdir, name.len);
842842
err = PTR_ERR(index);
843843
if (IS_ERR(index)) {
844844
index = NULL;

0 commit comments

Comments
 (0)