From: Christian Brauner <brauner@kernel.org>
To: Amir Goldstein <amir73il@gmail.com>,
Christoph Hellwig <hch@lst.de>,
Miklos Szeredi <mszeredi@redhat.com>,
Al Viro <viro@zeniv.linux.org.uk>
Cc: "Christian Brauner" <brauner@kernel.org>,
linux-fsdevel@vger.kernel.org, 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 v4 01/19] fs: add two trivial lookup helpers
Date: Mon, 4 Apr 2022 12:51:40 +0200 [thread overview]
Message-ID: <20220404105159.1567595-2-brauner@kernel.org> (raw)
In-Reply-To: <20220404105159.1567595-1-brauner@kernel.org>
Similar to the addition of lookup_one() add a version of
lookup_one_unlocked() and lookup_one_positive_unlocked() that take
idmapped mounts into account. This is required to port overlay to
support idmapped base layers.
Cc: <linux-fsdevel@vger.kernel.org>
Tested-by: Giuseppe Scrivano <gscrivan@redhat.com>
Reviewed-by: Amir Goldstein <amir73il@gmail.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Christian Brauner (Microsoft) <brauner@kernel.org>
---
/* v2 */
unchanged
/* v3 */
- Christoph Hellwig <hch@lst.de>:
- Wrap overly long lines.
- Add kerneldoc for lookup_one_positive_unlocked().
/* v4 */
unchanged
---
fs/namei.c | 69 ++++++++++++++++++++++++++++++++++++-------
include/linux/namei.h | 6 ++++
2 files changed, 65 insertions(+), 10 deletions(-)
diff --git a/fs/namei.c b/fs/namei.c
index 3f1829b3ab5b..d76f4dde6179 100644
--- a/fs/namei.c
+++ b/fs/namei.c
@@ -2768,7 +2768,8 @@ struct dentry *lookup_one(struct user_namespace *mnt_userns, const char *name,
EXPORT_SYMBOL(lookup_one);
/**
- * lookup_one_len_unlocked - filesystem helper to lookup single pathname component
+ * lookup_one_unlocked - filesystem helper to lookup single pathname component
+ * @mnt_userns: idmapping of the mount the lookup is performed from
* @name: pathname component to lookup
* @base: base directory to lookup from
* @len: maximum length @len should be interpreted to
@@ -2779,14 +2780,15 @@ EXPORT_SYMBOL(lookup_one);
* Unlike lookup_one_len, it should be called without the parent
* i_mutex held, and will take the i_mutex itself if necessary.
*/
-struct dentry *lookup_one_len_unlocked(const char *name,
- struct dentry *base, int len)
+struct dentry *lookup_one_unlocked(struct user_namespace *mnt_userns,
+ const char *name, struct dentry *base,
+ int len)
{
struct qstr this;
int err;
struct dentry *ret;
- err = lookup_one_common(&init_user_ns, name, base, len, &this);
+ err = lookup_one_common(mnt_userns, name, base, len, &this);
if (err)
return ERR_PTR(err);
@@ -2795,6 +2797,58 @@ struct dentry *lookup_one_len_unlocked(const char *name,
ret = lookup_slow(&this, base, 0);
return ret;
}
+EXPORT_SYMBOL(lookup_one_unlocked);
+
+/**
+ * lookup_one_positive_unlocked - filesystem helper to lookup single
+ * pathname component
+ * @mnt_userns: idmapping of the mount the lookup is performed from
+ * @name: pathname component to lookup
+ * @base: base directory to lookup from
+ * @len: maximum length @len should be interpreted to
+ *
+ * This helper will yield ERR_PTR(-ENOENT) on negatives. The helper returns
+ * known positive or ERR_PTR(). This is what most of the users want.
+ *
+ * Note that pinned negative with unlocked parent _can_ become positive at any
+ * time, so callers of lookup_one_unlocked() need to be very careful; pinned
+ * positives have >d_inode stable, so this one avoids such problems.
+ *
+ * Note that this routine is purely a helper for filesystem usage and should
+ * not be called by generic code.
+ *
+ * The helper should be called without i_mutex held.
+ */
+struct dentry *lookup_one_positive_unlocked(struct user_namespace *mnt_userns,
+ const char *name,
+ struct dentry *base, int len)
+{
+ struct dentry *ret = lookup_one_unlocked(mnt_userns, name, base, len);
+ if (!IS_ERR(ret) && d_flags_negative(smp_load_acquire(&ret->d_flags))) {
+ dput(ret);
+ ret = ERR_PTR(-ENOENT);
+ }
+ return ret;
+}
+EXPORT_SYMBOL(lookup_one_positive_unlocked);
+
+/**
+ * lookup_one_len_unlocked - filesystem helper to lookup single pathname component
+ * @name: pathname component to lookup
+ * @base: base directory to lookup from
+ * @len: maximum length @len should be interpreted to
+ *
+ * Note that this routine is purely a helper for filesystem usage and should
+ * not be called by generic code.
+ *
+ * Unlike lookup_one_len, it should be called without the parent
+ * i_mutex held, and will take the i_mutex itself if necessary.
+ */
+struct dentry *lookup_one_len_unlocked(const char *name,
+ struct dentry *base, int len)
+{
+ return lookup_one_unlocked(&init_user_ns, name, base, len);
+}
EXPORT_SYMBOL(lookup_one_len_unlocked);
/*
@@ -2808,12 +2862,7 @@ EXPORT_SYMBOL(lookup_one_len_unlocked);
struct dentry *lookup_positive_unlocked(const char *name,
struct dentry *base, int len)
{
- struct dentry *ret = lookup_one_len_unlocked(name, base, len);
- if (!IS_ERR(ret) && d_flags_negative(smp_load_acquire(&ret->d_flags))) {
- dput(ret);
- ret = ERR_PTR(-ENOENT);
- }
- return ret;
+ return lookup_one_positive_unlocked(&init_user_ns, name, base, len);
}
EXPORT_SYMBOL(lookup_positive_unlocked);
diff --git a/include/linux/namei.h b/include/linux/namei.h
index e89329bb3134..caeb08a98536 100644
--- a/include/linux/namei.h
+++ b/include/linux/namei.h
@@ -69,6 +69,12 @@ extern struct dentry *lookup_one_len(const char *, struct dentry *, int);
extern struct dentry *lookup_one_len_unlocked(const char *, struct dentry *, int);
extern struct dentry *lookup_positive_unlocked(const char *, struct dentry *, int);
struct dentry *lookup_one(struct user_namespace *, const char *, struct dentry *, int);
+struct dentry *lookup_one_unlocked(struct user_namespace *mnt_userns,
+ const char *name, struct dentry *base,
+ int len);
+struct dentry *lookup_one_positive_unlocked(struct user_namespace *mnt_userns,
+ const char *name,
+ struct dentry *base, int len);
extern int follow_down_one(struct path *);
extern int follow_down(struct path *);
--
2.32.0
next prev parent reply other threads:[~2022-04-04 10:52 UTC|newest]
Thread overview: 23+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-04-04 10:51 [PATCH v4 00/19] overlay: support idmapped layers Christian Brauner
2022-04-04 10:51 ` Christian Brauner [this message]
2022-04-04 10:51 ` [PATCH v4 02/19] exportfs: support idmapped mounts Christian Brauner
2022-04-04 10:51 ` [PATCH v4 03/19] ovl: use wrappers to all vfs_*xattr() calls Christian Brauner
2022-04-04 10:51 ` [PATCH v4 04/19] ovl: pass ofs to creation operations Christian Brauner
2022-04-04 10:51 ` [PATCH v4 05/19] ovl: add ovl_upper_mnt_userns() wrapper Christian Brauner
2022-04-04 10:51 ` [PATCH v4 06/19] ovl: handle idmappings in creation operations Christian Brauner
2022-04-04 10:51 ` [PATCH v4 07/19] ovl: pass ofs to setattr operations Christian Brauner
2022-04-04 10:51 ` [PATCH v4 08/19] ovl: pass layer mnt to ovl_open_realfile() Christian Brauner
2022-04-04 10:51 ` [PATCH v4 09/19] ovl: use ovl_do_notify_change() wrapper Christian Brauner
2022-04-04 10:51 ` [PATCH v4 10/19] ovl: use ovl_lookup_upper() wrapper Christian Brauner
2022-04-04 10:51 ` [PATCH v4 11/19] ovl: use ovl_path_getxattr() wrapper Christian Brauner
2022-04-04 10:51 ` [PATCH v4 12/19] ovl: handle idmappings for layer fileattrs Christian Brauner
2022-04-04 10:51 ` [PATCH v4 13/19] ovl: handle idmappings for layer lookup Christian Brauner
2022-04-04 10:51 ` [PATCH v4 14/19] ovl: store lower path in ovl_inode Christian Brauner
2022-04-04 10:51 ` [PATCH v4 15/19] ovl: use ovl_copy_{real,upper}attr() wrappers Christian Brauner
2022-04-04 10:51 ` [PATCH v4 16/19] ovl: handle idmappings in ovl_permission() Christian Brauner
2022-04-04 10:51 ` [PATCH v4 17/19] ovl: handle idmappings in layer open helpers Christian Brauner
2022-04-04 10:51 ` [PATCH v4 18/19] ovl: handle idmappings in ovl_xattr_{g,s}et() Christian Brauner
2022-04-04 10:51 ` [PATCH v4 19/19] ovl: support idmapped layers Christian Brauner
2022-04-04 10:51 ` [PATCH v4] common: allow to run all tests on idmapped mounts Christian Brauner
2022-04-04 12:41 ` Amir Goldstein
2022-04-04 12:51 ` 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=20220404105159.1567595-2-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-fsdevel@vger.kernel.org \
--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 \
--cc=viro@zeniv.linux.org.uk \
/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.