lkml.org 
[lkml]   [2011]   [Dec]   [2]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 1/3] DEBUGFS: Automatically create parents for debugfs files
    Date
    From: Andi Kleen <ak@linux.intel.com>

    Allow passing path names to debugfs_create* and automatically create
    the parents. This makes it much simpler for the caller to create hierarchies.

    The way the reference counts are handled is admittedly a bit ugly.

    There is no way to clean them up currently other than to delete the tree,
    but that doesn't seem like a big problem for debugfs to leave
    behind a few empty directories.

    Signed-off-by: Andi Kleen <ak@linux.intel.com>
    ---
    fs/debugfs/inode.c | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++
    1 files changed, 51 insertions(+), 0 deletions(-)

    diff --git a/fs/debugfs/inode.c b/fs/debugfs/inode.c
    index f3a257d..7ea9a6c 100644
    --- a/fs/debugfs/inode.c
    +++ b/fs/debugfs/inode.c
    @@ -146,6 +146,52 @@ static struct file_system_type debug_fs_type = {
    .kill_sb = kill_litter_super,
    };

    +/*
    + * Created parents stay around later. Sorry, but it shouldn't be a big issue.
    + */
    +static const char *create_parents(const char *name, struct dentry *parent,
    + struct dentry **pp, int *ref)
    +{
    + char fn[strlen(name) + 1];
    + char *tail;
    + char *s, *p;
    + struct dentry *new_parent, *dentry, *old_parent = NULL;
    +
    + strcpy(fn, name);
    + tail = strrchr(fn, '/');
    + if (!tail)
    + return name;
    + tail++;
    +
    + s = fn;
    + while ((p = strsep(&s, "/")) != NULL && p != tail) {
    + /* ignore error here */
    + dentry = debugfs_create_dir(p, parent);
    +
    + /* Is it there now? */
    + mutex_lock(&parent->d_inode->i_mutex);
    + new_parent = lookup_one_len(p, parent, strlen(p));
    + mutex_unlock(&parent->d_inode->i_mutex);
    +
    + if (!PTR_ERR(dentry))
    + dput(dentry);
    + if (IS_ERR(new_parent))
    + return NULL;
    + if (old_parent)
    + dput(old_parent);
    + if (parent != *pp)
    + old_parent = parent;
    + parent = new_parent;
    + }
    + if (parent) {
    + *ref = 1;
    + *pp = parent;
    + }
    + if (old_parent)
    + dput(old_parent);
    + return strrchr(name, '/') + 1;
    +}
    +
    static int debugfs_create_by_name(const char *name, mode_t mode,
    struct dentry *parent,
    struct dentry **dentry,
    @@ -153,6 +199,7 @@ static int debugfs_create_by_name(const char *name, mode_t mode,
    const struct file_operations *fops)
    {
    int error = 0;
    + int ref = 0;

    /* If the parent is not specified, we create it in the root.
    * We need the root dentry to do this, which is in the super
    @@ -161,6 +208,7 @@ static int debugfs_create_by_name(const char *name, mode_t mode,
    */
    if (!parent)
    parent = debugfs_mount->mnt_sb->s_root;
    + name = create_parents(name, parent, &parent, &ref);

    *dentry = NULL;
    mutex_lock(&parent->d_inode->i_mutex);
    @@ -185,6 +233,9 @@ static int debugfs_create_by_name(const char *name, mode_t mode,
    error = PTR_ERR(*dentry);
    mutex_unlock(&parent->d_inode->i_mutex);

    + if (ref)
    + dput(parent);
    +
    return error;
    }

    --
    1.7.4.4


    \
     
     \ /
      Last update: 2011-12-02 19:51    [W:0.024 / U:31.648 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site