[PATCH 3/8] eventfs: adding eventfs file add functions
From: Ajay Kaher <hidden>
Date: 2023-01-22 17:07:49
Also in:
lkml
Subsystem:
filesystems (vfs and infrastructure), the rest, tracing · Maintainers:
Alexander Viro, Christian Brauner, Linus Torvalds, Steven Rostedt, Masami Hiramatsu
Adding following function to eventfs to add files: eventfs_add_top_file() will add the info of top file to eventfs and dynamically create these files as and when required. eventfs_add_file() will add the info of nested files to eventfs and dynamically create these dir as and when required. Signed-off-by: Ajay Kaher <redacted> Co-developed-by: Steven Rostedt (VMware) <rostedt@goodmis.org> Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org> Tested-by: Ching-lin Yu <redacted> --- fs/tracefs/event_inode.c | 108 +++++++++++++++++++++++++++++++++++++++++++++++ include/linux/tracefs.h | 8 ++++ 2 files changed, 116 insertions(+)
diff --git a/fs/tracefs/event_inode.c b/fs/tracefs/event_inode.c
index ef3b435..e479712 100644
--- a/fs/tracefs/event_inode.c
+++ b/fs/tracefs/event_inode.c@@ -171,3 +171,111 @@ struct eventfs_file *eventfs_add_dir(const char *name, struct eventfs_file *ef_p list_add_tail(&ef->list, &ef_parent->ei->e_top_files); return ef; } + +/** + * eventfs_add_top_file - add event top file to list to create later + * @name: a pointer to a string containing the name of the file to create. + * @mode: the permission that the file should have. + * @parent: a pointer to the parent dentry for this file. This should be a + * directory dentry if set. If this parameter is NULL, then the + * file will be created in the root of the tracefs filesystem. + * @data: a pointer to something that the caller will want to get to later + * on. The inode.i_private pointer will point to this value on + * the open() call. + * @fop: a pointer to a struct file_operations that should be used for + * this file. + * + * This function adds top files of event dir to list. + * And all these files are created on the fly when they are looked up, + * and the dentry and inodes will be removed when they are done. + */ +int eventfs_add_top_file(const char *name, umode_t mode, + struct dentry *parent, void *data, + const struct file_operations *fop) +{ + struct tracefs_inode *ti; + struct eventfs_inode *ei; + struct eventfs_file *ef; + + if (!parent) + return -EINVAL; + + if (!(mode & S_IFMT)) + mode |= S_IFREG; + + if (!parent->d_inode) + return -EINVAL; + + ti = get_tracefs(parent->d_inode); + if (!(ti->flags & TRACEFS_EVENT_INODE)) + return -EINVAL; + + ei = ti->private; + ef = kzalloc(sizeof(*ef), GFP_KERNEL); + if (!ef) + return -ENOMEM; + + ef->name = kstrdup(name, GFP_KERNEL); + if (!ef->name) { + kfree(ef); + return -ENOMEM; + } + + ef->mode = mode; + ef->data = data; + ef->fop = fop; + ef->dentry = NULL; + ef->ei = NULL; + ef->created = false; + ef->d_parent = parent; + list_add_tail(&ef->list, &ei->e_top_files); + return 0; +} + +/** + * eventfs_add_file - add eventfs file to list to create later + * @name: a pointer to a string containing the name of the file to create. + * @mode: the permission that the file should have. + * @ef_parent: a pointer to the parent eventfs_file for this file. + * @data: a pointer to something that the caller will want to get to later + * on. The inode.i_private pointer will point to this value on + * the open() call. + * @fop: a pointer to a struct file_operations that should be used for + * this file. + * + * This function adds top files of event dir to list. + * And all these files are created on the fly when they are looked up, + * and the dentry and inodes will be removed when they are done. + */ +int eventfs_add_file(const char *name, umode_t mode, + struct eventfs_file *ef_parent, + void *data, + const struct file_operations *fop) +{ + struct eventfs_file *ef; + + if (!ef_parent) + return -EINVAL; + + if (!(mode & S_IFMT)) + mode |= S_IFREG; + + ef = kzalloc(sizeof(*ef), GFP_KERNEL); + if (!ef) + return -ENOMEM; + + ef->name = kstrdup(name, GFP_KERNEL); + if (!ef->name) { + kfree(ef); + return -ENOMEM; + } + + ef->mode = mode; + ef->data = data; + ef->fop = fop; + ef->dentry = NULL; + ef->ei = NULL; + ef->created = false; + list_add_tail(&ef->list, &ef_parent->ei->e_top_files); + return 0; +}
diff --git a/include/linux/tracefs.h b/include/linux/tracefs.h
index 6983409..7d390d2 100644
--- a/include/linux/tracefs.h
+++ b/include/linux/tracefs.h@@ -47,6 +47,14 @@ struct eventfs_file *eventfs_add_subsystem_dir(const char *name, struct eventfs_file *eventfs_add_dir(const char *name, struct eventfs_file *ef_parent); +int eventfs_add_file(const char *name, umode_t mode, + struct eventfs_file *ef_parent, void *data, + const struct file_operations *fops); + +int eventfs_add_top_file(const char *name, umode_t mode, + struct dentry *parent, void *data, + const struct file_operations *fops); + struct dentry *tracefs_create_file(const char *name, umode_t mode, struct dentry *parent, void *data, const struct file_operations *fops);
--
2.7.4