fs: use a helper for opening kernel internal files
authorAmir Goldstein <amir73il@gmail.com>
Thu, 15 Jun 2023 11:22:26 +0000 (14:22 +0300)
committerChristian Brauner <brauner@kernel.org>
Mon, 19 Jun 2023 16:11:58 +0000 (18:11 +0200)
cachefiles uses kernel_open_tmpfile() to open kernel internal tmpfile
without accounting for nr_files.

cachefiles uses open_with_fake_path() for the same reason without the
need for a fake path.

Fork open_with_fake_path() to kernel_file_open() which only does the
noaccount part and use it in cachefiles.

Signed-off-by: Amir Goldstein <amir73il@gmail.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Message-Id: <20230615112229.2143178-3-amir73il@gmail.com>
Signed-off-by: Christian Brauner <brauner@kernel.org>
fs/cachefiles/namei.c
fs/open.c
include/linux/fs.h

index 6c7d4e9..499cf73 100644 (file)
@@ -560,8 +560,8 @@ static bool cachefiles_open_file(struct cachefiles_object *object,
         */
        path.mnt = cache->mnt;
        path.dentry = dentry;
-       file = open_with_fake_path(&path, O_RDWR | O_LARGEFILE | O_DIRECT,
-                                  d_backing_inode(dentry), cache->cache_cred);
+       file = kernel_file_open(&path, O_RDWR | O_LARGEFILE | O_DIRECT,
+                               d_backing_inode(dentry), cache->cache_cred);
        if (IS_ERR(file)) {
                trace_cachefiles_vfs_error(object, d_backing_inode(dentry),
                                           PTR_ERR(file),
index 4478adc..322e017 100644 (file)
--- a/fs/open.c
+++ b/fs/open.c
@@ -1116,6 +1116,39 @@ struct file *dentry_create(const struct path *path, int flags, umode_t mode,
 }
 EXPORT_SYMBOL(dentry_create);
 
+/**
+ * kernel_file_open - open a file for kernel internal use
+ * @path:      path of the file to open
+ * @flags:     open flags
+ * @inode:     the inode
+ * @cred:      credentials for open
+ *
+ * Open a file for use by in-kernel consumers. The file is not accounted
+ * against nr_files and must not be installed into the file descriptor
+ * table.
+ *
+ * Return: Opened file on success, an error pointer on failure.
+ */
+struct file *kernel_file_open(const struct path *path, int flags,
+                               struct inode *inode, const struct cred *cred)
+{
+       struct file *f;
+       int error;
+
+       f = alloc_empty_file_noaccount(flags, cred);
+       if (IS_ERR(f))
+               return f;
+
+       f->f_path = *path;
+       error = do_dentry_open(f, inode, NULL);
+       if (error) {
+               fput(f);
+               f = ERR_PTR(error);
+       }
+       return f;
+}
+EXPORT_SYMBOL_GPL(kernel_file_open);
+
 struct file *open_with_fake_path(const struct path *path, int flags,
                                struct inode *inode, const struct cred *cred)
 {
index 62237be..1f8486e 100644 (file)
@@ -1676,6 +1676,8 @@ struct file *kernel_tmpfile_open(struct mnt_idmap *idmap,
                                 const struct path *parentpath,
                                 umode_t mode, int open_flag,
                                 const struct cred *cred);
+struct file *kernel_file_open(const struct path *path, int flags,
+                             struct inode *inode, const struct cred *cred);
 
 int vfs_mkobj(struct dentry *, umode_t,
                int (*f)(struct dentry *, umode_t, void *),