Commit 55394d29 authored by Dawid Osuchowski's avatar Dawid Osuchowski Committed by Christian Brauner

fs: Create anon_inode_getfile_fmode()

Creates an anon_inode_getfile_fmode() function that works similarly to
anon_inode_getfile() with the addition of being able to set the fmode
member.
Signed-off-by: default avatarDawid Osuchowski <linux@osuchow.ski>
Link: https://lore.kernel.org/r/20240426075854.4723-1-linux@osuchow.skiSigned-off-by: default avatarChristian Brauner <brauner@kernel.org>
parent 652efdec
...@@ -148,6 +148,38 @@ struct file *anon_inode_getfile(const char *name, ...@@ -148,6 +148,38 @@ struct file *anon_inode_getfile(const char *name,
} }
EXPORT_SYMBOL_GPL(anon_inode_getfile); EXPORT_SYMBOL_GPL(anon_inode_getfile);
/**
* anon_inode_getfile_fmode - creates a new file instance by hooking it up to an
* anonymous inode, and a dentry that describe the "class"
* of the file
*
* @name: [in] name of the "class" of the new file
* @fops: [in] file operations for the new file
* @priv: [in] private data for the new file (will be file's private_data)
* @flags: [in] flags
* @f_mode: [in] fmode
*
* Creates a new file by hooking it on a single inode. This is useful for files
* that do not need to have a full-fledged inode in order to operate correctly.
* All the files created with anon_inode_getfile() will share a single inode,
* hence saving memory and avoiding code duplication for the file/inode/dentry
* setup. Allows setting the fmode. Returns the newly created file* or an error
* pointer.
*/
struct file *anon_inode_getfile_fmode(const char *name,
const struct file_operations *fops,
void *priv, int flags, fmode_t f_mode)
{
struct file *file;
file = __anon_inode_getfile(name, fops, priv, flags, NULL, false);
if (!IS_ERR(file))
file->f_mode |= f_mode;
return file;
}
EXPORT_SYMBOL_GPL(anon_inode_getfile_fmode);
/** /**
* anon_inode_create_getfile - Like anon_inode_getfile(), but creates a new * anon_inode_create_getfile - Like anon_inode_getfile(), but creates a new
* !S_PRIVATE anon inode rather than reuse the * !S_PRIVATE anon inode rather than reuse the
...@@ -271,6 +303,7 @@ int anon_inode_create_getfd(const char *name, const struct file_operations *fops ...@@ -271,6 +303,7 @@ int anon_inode_create_getfd(const char *name, const struct file_operations *fops
return __anon_inode_getfd(name, fops, priv, flags, context_inode, true); return __anon_inode_getfd(name, fops, priv, flags, context_inode, true);
} }
static int __init anon_inode_init(void) static int __init anon_inode_init(void)
{ {
anon_inode_mnt = kern_mount(&anon_inode_fs_type); anon_inode_mnt = kern_mount(&anon_inode_fs_type);
......
...@@ -9,12 +9,17 @@ ...@@ -9,12 +9,17 @@
#ifndef _LINUX_ANON_INODES_H #ifndef _LINUX_ANON_INODES_H
#define _LINUX_ANON_INODES_H #define _LINUX_ANON_INODES_H
#include <linux/types.h>
struct file_operations; struct file_operations;
struct inode; struct inode;
struct file *anon_inode_getfile(const char *name, struct file *anon_inode_getfile(const char *name,
const struct file_operations *fops, const struct file_operations *fops,
void *priv, int flags); void *priv, int flags);
struct file *anon_inode_getfile_fmode(const char *name,
const struct file_operations *fops,
void *priv, int flags, fmode_t f_mode);
struct file *anon_inode_create_getfile(const char *name, struct file *anon_inode_create_getfile(const char *name,
const struct file_operations *fops, const struct file_operations *fops,
void *priv, int flags, void *priv, int flags,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment