From: Christian Brauner <brauner@kernel.org>
To: Amir Goldstein <amir73il@gmail.com>,
Miklos Szeredi <mszeredi@redhat.com>
Cc: "Christian Brauner" <brauner@kernel.org>,
"Christoph Hellwig" <hch@lst.de>,
linux-unionfs@vger.kernel.org, "Aleksa Sarai" <cyphar@cyphar.com>,
"Giuseppe Scrivano" <gscrivan@redhat.com>,
"Rodrigo Campos Catelin" <rodrigo@sdfg.com.ar>,
"Seth Forshee" <sforshee@digitalocean.com>,
"Luca Bocassi" <luca.boccassi@microsoft.com>,
"Lennart Poettering" <mzxreary@0pointer.de>,
"Stéphane Graber" <stgraber@ubuntu.com>
Subject: [PATCH v3 13/19] ovl: handle idmappings for layer lookup
Date: Thu, 31 Mar 2022 13:23:11 +0200 [thread overview]
Message-ID: <20220331112318.1377494-14-brauner@kernel.org> (raw)
In-Reply-To: <20220331112318.1377494-1-brauner@kernel.org>
Make the two places where lookup helpers can be called either on lower
or upper layers take the mount's idmapping into account. To this end we
pass down the mount in struct ovl_lookup_data. It can later also be used
to construct struct path for various other helpers. This is needed to
support idmapped base layers with overlay.
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>
---
/* v2 */
unchanged
/* v3 */
unchanged
---
fs/overlayfs/export.c | 3 ++-
fs/overlayfs/namei.c | 14 ++++++++------
fs/overlayfs/readdir.c | 10 +++++-----
3 files changed, 15 insertions(+), 12 deletions(-)
diff --git a/fs/overlayfs/export.c b/fs/overlayfs/export.c
index ebde05c9cf62..5acf353d160b 100644
--- a/fs/overlayfs/export.c
+++ b/fs/overlayfs/export.c
@@ -391,7 +391,8 @@ static struct dentry *ovl_lookup_real_one(struct dentry *connected,
* pointer because we hold no lock on the real dentry.
*/
take_dentry_name_snapshot(&name, real);
- this = lookup_one_len(name.name.name, connected, name.name.len);
+ this = lookup_one(mnt_user_ns(layer->mnt), name.name.name,
+ connected, name.name.len);
release_dentry_name_snapshot(&name);
err = PTR_ERR(this);
if (IS_ERR(this)) {
diff --git a/fs/overlayfs/namei.c b/fs/overlayfs/namei.c
index 32f9d9089059..f7b550eafc1b 100644
--- a/fs/overlayfs/namei.c
+++ b/fs/overlayfs/namei.c
@@ -199,11 +199,12 @@ static bool ovl_is_opaquedir(struct ovl_fs *ofs, struct path *path)
return ovl_path_check_dir_xattr(ofs, path, OVL_XATTR_OPAQUE);
}
-static struct dentry *ovl_lookup_positive_unlocked(const char *name,
+static struct dentry *ovl_lookup_positive_unlocked(struct ovl_lookup_data *d,
+ const char *name,
struct dentry *base, int len,
bool drop_negative)
{
- struct dentry *ret = lookup_one_len_unlocked(name, base, len);
+ struct dentry *ret = lookup_one_unlocked(mnt_user_ns(d->mnt), name, base, len);
if (!IS_ERR(ret) && d_flags_negative(smp_load_acquire(&ret->d_flags))) {
if (drop_negative && ret->d_lockref.count == 1) {
@@ -229,7 +230,7 @@ static int ovl_lookup_single(struct dentry *base, struct ovl_lookup_data *d,
int err;
bool last_element = !post[0];
- this = ovl_lookup_positive_unlocked(name, base, namelen, drop_negative);
+ this = ovl_lookup_positive_unlocked(d, name, base, namelen, drop_negative);
if (IS_ERR(this)) {
err = PTR_ERR(this);
this = NULL;
@@ -709,7 +710,8 @@ struct dentry *ovl_lookup_index(struct ovl_fs *ofs, struct dentry *upper,
if (err)
return ERR_PTR(err);
- index = lookup_positive_unlocked(name.name, ofs->indexdir, name.len);
+ index = lookup_one_positive_unlocked(ovl_upper_idmap(ofs), name.name,
+ ofs->indexdir, name.len);
if (IS_ERR(index)) {
err = PTR_ERR(index);
if (err == -ENOENT) {
@@ -1174,8 +1176,8 @@ bool ovl_lower_positive(struct dentry *dentry)
struct dentry *this;
struct dentry *lowerdir = poe->lowerstack[i].dentry;
- this = lookup_positive_unlocked(name->name, lowerdir,
- name->len);
+ this = lookup_one_positive_unlocked(mnt_user_ns(poe->lowerstack[i].layer->mnt),
+ name->name, lowerdir, name->len);
if (IS_ERR(this)) {
switch (PTR_ERR(this)) {
case -ENOENT:
diff --git a/fs/overlayfs/readdir.c b/fs/overlayfs/readdir.c
index 1d06222a496c..78f62cc1797b 100644
--- a/fs/overlayfs/readdir.c
+++ b/fs/overlayfs/readdir.c
@@ -264,11 +264,11 @@ static int ovl_fill_merge(struct dir_context *ctx, const char *name,
return ovl_fill_lowest(rdd, name, namelen, offset, ino, d_type);
}
-static int ovl_check_whiteouts(struct dentry *dir, struct ovl_readdir_data *rdd)
+static int ovl_check_whiteouts(struct path *path, struct ovl_readdir_data *rdd)
{
int err;
struct ovl_cache_entry *p;
- struct dentry *dentry;
+ struct dentry *dentry, *dir = path->dentry;
const struct cred *old_cred;
old_cred = ovl_override_creds(rdd->dentry->d_sb);
@@ -278,7 +278,7 @@ static int ovl_check_whiteouts(struct dentry *dir, struct ovl_readdir_data *rdd)
while (rdd->first_maybe_whiteout) {
p = rdd->first_maybe_whiteout;
rdd->first_maybe_whiteout = p->next_maybe_whiteout;
- dentry = lookup_one_len(p->name, dir, p->len);
+ dentry = lookup_one(mnt_user_ns(path->mnt), p->name, dir, p->len);
if (!IS_ERR(dentry)) {
p->is_whiteout = ovl_is_whiteout(dentry);
dput(dentry);
@@ -312,7 +312,7 @@ static inline int ovl_dir_read(struct path *realpath,
} while (!err && rdd->count);
if (!err && rdd->first_maybe_whiteout && rdd->dentry)
- err = ovl_check_whiteouts(realpath->dentry, rdd);
+ err = ovl_check_whiteouts(realpath, rdd);
fput(realfile);
@@ -479,7 +479,7 @@ static int ovl_cache_update_ino(struct path *path, struct ovl_cache_entry *p)
goto get;
}
}
- this = lookup_one_len(p->name, dir, p->len);
+ this = lookup_one(mnt_user_ns(path->mnt), p->name, dir, p->len);
if (IS_ERR_OR_NULL(this) || !this->d_inode) {
/* Mark a stale entry */
p->is_whiteout = true;
--
2.32.0
next prev parent reply other threads:[~2022-03-31 11:24 UTC|newest]
Thread overview: 33+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-03-31 11:22 [PATCH v3 00/19] overlay: support idmapped layers Christian Brauner
2022-03-31 11:22 ` [PATCH v3 01/19] fs: add two trivial lookup helpers Christian Brauner
2022-03-31 11:23 ` [PATCH v3 02/19] exportfs: support idmapped mounts Christian Brauner
2022-03-31 11:23 ` [PATCH v3 03/19] ovl: use wrappers to all vfs_*xattr() calls Christian Brauner
2022-03-31 11:23 ` [PATCH v3 04/19] ovl: pass ofs to creation operations Christian Brauner
2022-03-31 11:23 ` [PATCH v3 05/19] ovl: add ovl_upper_idmap() wrapper Christian Brauner
2022-03-31 11:23 ` [PATCH v3 06/19] ovl: handle idmappings in creation operations Christian Brauner
2022-03-31 11:23 ` [PATCH v3 07/19] ovl: pass ofs to setattr operations Christian Brauner
2022-03-31 11:23 ` [PATCH v3 08/19] ovl: pass layer mnt to ovl_open_realfile() Christian Brauner
2022-03-31 11:23 ` [PATCH v3 09/19] ovl: use ovl_do_notify_change() wrapper Christian Brauner
2022-04-01 18:49 ` Vivek Goyal
2022-04-02 12:03 ` Christian Brauner
2022-04-06 16:47 ` Vivek Goyal
2022-04-07 9:29 ` Christian Brauner
2022-03-31 11:23 ` [PATCH v3 10/19] ovl: use ovl_lookup_upper() wrapper Christian Brauner
2022-03-31 11:23 ` [PATCH v3 11/19] ovl: use ovl_path_getxattr() wrapper Christian Brauner
2022-03-31 11:23 ` [PATCH v3 12/19] ovl: handle idmappings for layer fileattrs Christian Brauner
2022-03-31 11:23 ` Christian Brauner [this message]
2022-03-31 11:23 ` [PATCH v3 14/19] ovl: store lower path in ovl_inode Christian Brauner
2022-03-31 11:23 ` [PATCH v3 15/19] ovl: use ovl_copy_{real,upper}attr() wrappers Christian Brauner
2022-03-31 11:23 ` [PATCH v3 16/19] ovl: handle idmappings in ovl_permission() Christian Brauner
2022-03-31 11:23 ` [PATCH v3 17/19] ovl: handle idmappings in layer open helpers Christian Brauner
2022-04-01 20:11 ` Vivek Goyal
2022-03-31 11:23 ` [PATCH v3 18/19] ovl: handle idmappings in ovl_xattr_{g,s}et() Christian Brauner
2022-03-31 11:23 ` [PATCH v3 19/19] ovl: support idmapped layers Christian Brauner
2022-04-01 20:17 ` Vivek Goyal
2022-04-02 6:19 ` Christian Brauner
2022-03-31 11:23 ` [PATCH v3] common: allow to run all tests on idmapped mounts Christian Brauner
2022-03-31 11:35 ` Amir Goldstein
2022-03-31 11:41 ` Christian Brauner
2022-04-01 7:16 ` Amir Goldstein
2022-03-31 19:05 ` [PATCH v3 00/19] overlay: support idmapped layers Vivek Goyal
2022-04-01 6:54 ` Christian Brauner
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20220331112318.1377494-14-brauner@kernel.org \
--to=brauner@kernel.org \
--cc=amir73il@gmail.com \
--cc=cyphar@cyphar.com \
--cc=gscrivan@redhat.com \
--cc=hch@lst.de \
--cc=linux-unionfs@vger.kernel.org \
--cc=luca.boccassi@microsoft.com \
--cc=mszeredi@redhat.com \
--cc=mzxreary@0pointer.de \
--cc=rodrigo@sdfg.com.ar \
--cc=sforshee@digitalocean.com \
--cc=stgraber@ubuntu.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.