lkml.org 
[lkml]   [2023]   [Jun]   [1]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v3 05/10] eventfs: adding eventfs file, directory remove function
    Date
    Adding eventfs_remove(), this function will recursively remove
    dir or file info from eventfs.

    Signed-off-by: Ajay Kaher <akaher@vmware.com>
    Co-developed-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
    Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
    Tested-by: Ching-lin Yu <chinglinyu@google.com>
    Reported-by: kernel test robot <lkp@intel.com>
    Link: https://lore.kernel.org/oe-kbuild-all/202305030611.Kas747Ev-lkp@intel.com/
    ---
    fs/tracefs/event_inode.c | 78 ++++++++++++++++++++++++++++++++++++++++
    include/linux/tracefs.h | 4 +++
    2 files changed, 82 insertions(+)

    diff --git a/fs/tracefs/event_inode.c b/fs/tracefs/event_inode.c
    index 17afb7476..874ef88bd 100644
    --- a/fs/tracefs/event_inode.c
    +++ b/fs/tracefs/event_inode.c
    @@ -364,3 +364,81 @@ int eventfs_add_file(const char *name, umode_t mode,
    eventfs_up_write(eventfs_rwsem);
    return 0;
    }
    +
    +/**
    + * eventfs_remove_rec - remove eventfs dir or file from list
    + * @ef: a pointer to eventfs_file to be removed.
    + *
    + * This function recursively remove eventfs_file which
    + * contains info of file or dir.
    + */
    +static void eventfs_remove_rec(struct eventfs_file *ef)
    +{
    + struct eventfs_file *ef_child, *n;
    +
    + if (!ef)
    + return;
    +
    + if (ef->ei) {
    + /* search for nested folders or files */
    + list_for_each_entry_safe(ef_child, n, &ef->ei->e_top_files, list) {
    + eventfs_remove_rec(ef_child);
    + }
    + kfree(ef->ei);
    + }
    +
    + if (ef->created && ef->dentry) {
    + d_invalidate(ef->dentry);
    + dput(ef->dentry);
    + }
    + list_del(&ef->list);
    + kfree(ef->name);
    + kfree(ef);
    +}
    +
    +/**
    + * eventfs_remove - remove eventfs dir or file from list
    + * @ef: a pointer to eventfs_file to be removed.
    + *
    + * This function acquire the eventfs_rwsem lock and call eventfs_remove_rec()
    + */
    +void eventfs_remove(struct eventfs_file *ef)
    +{
    + struct rw_semaphore *eventfs_rwsem;
    +
    + if (!ef)
    + return;
    +
    + if (ef->ei)
    + eventfs_rwsem = (struct rw_semaphore *) ef->data;
    + else
    + eventfs_rwsem = (struct rw_semaphore *) ef->d_parent->d_inode->i_private;
    +
    + eventfs_down_write(eventfs_rwsem);
    + eventfs_remove_rec(ef);
    + eventfs_up_write(eventfs_rwsem);
    +}
    +
    +/**
    + * eventfs_remove_events_dir - remove eventfs dir or file from list
    + * @dentry: a pointer to events's dentry to be removed.
    + *
    + * This function remove events main directory
    + */
    +void eventfs_remove_events_dir(struct dentry *dentry)
    +{
    + struct tracefs_inode *ti;
    + struct eventfs_inode *ei;
    +
    + if (!dentry || !dentry->d_inode)
    + return;
    +
    + ti = get_tracefs(dentry->d_inode);
    + if (!ti || !(ti->flags & TRACEFS_EVENT_INODE))
    + return;
    +
    + ei = ti->private;
    + d_invalidate(dentry);
    + dput(dentry);
    + kfree(ei);
    +}
    diff --git a/include/linux/tracefs.h b/include/linux/tracefs.h
    index 1e1780a61..ea10ccc87 100644
    --- a/include/linux/tracefs.h
    +++ b/include/linux/tracefs.h
    @@ -58,6 +58,10 @@ int eventfs_add_top_file(const char *name, umode_t mode,
    struct dentry *parent, void *data,
    const struct file_operations *fops);

    +void eventfs_remove(struct eventfs_file *ef);
    +
    +void eventfs_remove_events_dir(struct dentry *dentry);
    +
    struct dentry *tracefs_create_file(const char *name, umode_t mode,
    struct dentry *parent, void *data,
    const struct file_operations *fops);
    --
    2.40.0
    \
     
     \ /
      Last update: 2023-06-01 11:02    [W:5.080 / U:0.120 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site