From: Miklos Szeredi <mszeredi@redhat.com>
To: linux-fsdevel@vger.kernel.org
Cc: Al Viro <viro@ZenIV.linux.org.uk>,
Christian Brauner <brauner@kernel.org>,
Amir Goldstein <amir73il@gmail.com>,
David Howells <dhowells@redhat.com>,
Yu-li Lin <yulilin@google.com>,
Chirantan Ekbote <chirantan@chromium.org>
Subject: [PATCH v4 01/10] vfs: add vfs_tmpfile_open() helper
Date: Thu, 22 Sep 2022 10:44:33 +0200 [thread overview]
Message-ID: <20220922084442.2401223-2-mszeredi@redhat.com> (raw)
In-Reply-To: <20220922084442.2401223-1-mszeredi@redhat.com>
This helper unifies tmpfile creation with opening.
Existing vfs_tmpfile() callers outside of fs/namei.c will be converted to
using this helper. There are two such callers: cachefile and overlayfs.
The cachefiles code currently uses the open_with_fake_path() helper to open
the tmpfile, presumably to disable accounting of the open file. Overlayfs
uses tmpfile for copy_up, which means these struct file instances will be
short lived, hence it doesn't really matter if they are accounted or not.
Disable accounting in this helper too, which should be okay for both
callers.
Add MAY_OPEN permission checking for consistency. Like for create(2)
read/write permissions are not checked.
Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
---
fs/namei.c | 41 +++++++++++++++++++++++++++++++++++++++++
include/linux/fs.h | 4 ++++
2 files changed, 45 insertions(+)
diff --git a/fs/namei.c b/fs/namei.c
index 53b4bc094db2..81c388a813d3 100644
--- a/fs/namei.c
+++ b/fs/namei.c
@@ -3624,6 +3624,47 @@ struct dentry *vfs_tmpfile(struct user_namespace *mnt_userns,
}
EXPORT_SYMBOL(vfs_tmpfile);
+/**
+ * vfs_tmpfile_open - open a tmpfile for kernel internal use
+ * @mnt_userns: user namespace of the mount the inode was found from
+ * @parentpath: path of the base directory
+ * @mode: mode of the new tmpfile
+ * @open_flag: flags
+ * @cred: credentials for open
+ *
+ * Create and open a temporary file. The file is not accounted in nr_files,
+ * hence this is only for kernel internal use, and must not be installed into
+ * file tables or such.
+ */
+struct file *vfs_tmpfile_open(struct user_namespace *mnt_userns,
+ const struct path *parentpath,
+ umode_t mode, int open_flag, const struct cred *cred)
+{
+ struct file *file;
+ int error;
+ struct path path = { .mnt = parentpath->mnt };
+
+ path.dentry = vfs_tmpfile(mnt_userns, parentpath->dentry, mode, open_flag);
+ if (IS_ERR(path.dentry))
+ return ERR_CAST(path.dentry);
+
+ error = may_open(mnt_userns, &path, 0, open_flag);
+ file = ERR_PTR(error);
+ if (error)
+ goto out_dput;
+
+ /*
+ * This relies on the "noaccount" property of fake open, otherwise
+ * equivalent to dentry_open().
+ */
+ file = open_with_fake_path(&path, open_flag, d_inode(path.dentry), cred);
+out_dput:
+ dput(path.dentry);
+
+ return file;
+}
+EXPORT_SYMBOL(vfs_tmpfile_open);
+
static int do_tmpfile(struct nameidata *nd, unsigned flags,
const struct open_flags *op,
struct file *file)
diff --git a/include/linux/fs.h b/include/linux/fs.h
index 9eced4cc286e..15fafda95dd3 100644
--- a/include/linux/fs.h
+++ b/include/linux/fs.h
@@ -2007,6 +2007,10 @@ static inline int vfs_whiteout(struct user_namespace *mnt_userns,
struct dentry *vfs_tmpfile(struct user_namespace *mnt_userns,
struct dentry *dentry, umode_t mode, int open_flag);
+struct file *vfs_tmpfile_open(struct user_namespace *mnt_userns,
+ const struct path *parentpath,
+ umode_t mode, int open_flag, const struct cred *cred);
+
int vfs_mkobj(struct dentry *, umode_t,
int (*f)(struct dentry *, umode_t, void *),
void *);
--
2.37.3
next prev parent reply other threads:[~2022-09-22 8:45 UTC|newest]
Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-09-22 8:44 [PATCH v4 00/10] fuse tmpfile Miklos Szeredi
2022-09-22 8:44 ` Miklos Szeredi [this message]
2022-09-22 15:23 ` [PATCH v4 01/10] vfs: add vfs_tmpfile_open() helper Christian Brauner
2022-09-22 8:44 ` [PATCH v4 02/10] hugetlbfs: cleanup mknod and tmpfile Miklos Szeredi
2022-09-22 8:44 ` [PATCH v4 03/10] cachefiles: tmpfile error handling cleanup Miklos Szeredi
2022-09-22 8:44 ` [PATCH v4 04/10] cachefiles: only pass inode to *mark_inode_inuse() helpers Miklos Szeredi
2022-09-22 15:24 ` Christian Brauner
2022-09-22 16:22 ` Al Viro
2022-09-23 15:42 ` Miklos Szeredi
2022-09-24 4:56 ` Al Viro
2022-09-24 5:02 ` Miklos Szeredi
2022-09-24 14:37 ` Al Viro
2022-09-22 8:44 ` [PATCH v4 05/10] cachefiles: use vfs_tmpfile_open() helper Miklos Szeredi
2022-09-22 15:26 ` Christian Brauner
2022-09-22 8:44 ` [PATCH v4 06/10] ovl: " Miklos Szeredi
2022-09-22 8:44 ` [PATCH v4 07/10] vfs: make vfs_tmpfile() static Miklos Szeredi
2022-09-22 8:44 ` [PATCH v4 08/10] vfs: move open right after ->tmpfile() Miklos Szeredi
2022-09-22 8:44 ` [PATCH v4 09/10] vfs: open inside ->tmpfile() Miklos Szeredi
2022-09-22 15:27 ` Christian Brauner
2022-09-22 8:44 ` [PATCH v4 10/10] fuse: implement ->tmpfile() Miklos Szeredi
2022-09-22 15:29 ` Christian Brauner
2022-09-29 8:37 ` [PATCH v4 00/10] fuse tmpfile David Howells
2022-09-29 8:44 ` [PATCH v4 05/10] cachefiles: use vfs_tmpfile_open() helper David Howells
2022-09-30 13:53 ` Miklos Szeredi
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=20220922084442.2401223-2-mszeredi@redhat.com \
--to=mszeredi@redhat.com \
--cc=amir73il@gmail.com \
--cc=brauner@kernel.org \
--cc=chirantan@chromium.org \
--cc=dhowells@redhat.com \
--cc=linux-fsdevel@vger.kernel.org \
--cc=viro@ZenIV.linux.org.uk \
--cc=yulilin@google.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).