lkml.org 
[lkml]   [2003]   [Nov]   [12]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    SubjectRe: [RFC 4/5] sysfs-attr_group.patch



    o This patch creates attribute group for the given kobject. Again here we don;t
    create the sysfs directory but just allocated sysfs_dirent for the attribute
    group and links it to the kobject's hierarchy.


    fs/sysfs/group.c | 75 +++++++++++++++++++++++++++++++++----------------------
    1 files changed, 45 insertions(+), 30 deletions(-)

    diff -puN fs/sysfs/group.c~sysfs-attr_group fs/sysfs/group.c
    --- linux-2.6.0-test9/fs/sysfs/group.c~sysfs-attr_group 2003-11-12 16:30:55.000000000 +0530
    +++ linux-2.6.0-test9-maneesh/fs/sysfs/group.c 2003-11-12 16:30:55.000000000 +0530
    @@ -12,70 +12,85 @@
    #include <linux/module.h>
    #include <linux/dcache.h>
    #include <linux/err.h>
    +#include <linux/namei.h>
    #include "sysfs.h"


    -static void remove_files(struct dentry * dir,
    +static void remove_files(struct sysfs_dirent * sd,
    const struct attribute_group * grp)
    {
    struct attribute *const* attr;

    for (attr = grp->attrs; *attr; attr++)
    - sysfs_hash_and_remove(dir,(*attr)->name);
    + sysfs_hash_and_remove(sd, (*attr)->name);
    }

    -static int create_files(struct dentry * dir,
    +static int create_files(struct sysfs_dirent * parent_sd,
    const struct attribute_group * grp)
    {
    struct attribute *const* attr;
    int error = 0;

    for (attr = grp->attrs; *attr && !error; attr++) {
    - error = sysfs_add_file(dir,*attr);
    + error = sysfs_add_file(parent_sd, *attr);
    }
    if (error)
    - remove_files(dir,grp);
    + remove_files(parent_sd, grp);
    return error;
    }

    -
    int sysfs_create_group(struct kobject * kobj,
    const struct attribute_group * grp)
    {
    - struct dentry * dir;
    - int error;
    + struct sysfs_dirent * sd;
    + int error = 0;

    - if (grp->name) {
    - error = sysfs_create_subdir(kobj,grp->name,&dir);
    - if (error)
    - return error;
    - } else
    - dir = kobj->dentry;
    - dir = dget(dir);
    - if ((error = create_files(dir,grp))) {
    - if (grp->name)
    - sysfs_remove_subdir(dir);
    - dput(dir);
    + if (!kobj || !grp)
    + return -EINVAL;
    +
    + sd = sysfs_alloc_dirent(kobj->s_dirent, (void *) grp, SYSFS_KOBJ_ATTR_GROUP);
    + if (IS_ERR(sd))
    + return PTR_ERR(sd);
    +
    + if ((error = create_files(sd, grp))) {
    + sysfs_remove_group(kobj, grp);
    }
    +
    return error;
    }

    void sysfs_remove_group(struct kobject * kobj,
    const struct attribute_group * grp)
    {
    - struct dentry * dir;
    + struct sysfs_dirent * tmp_sd;
    + struct sysfs_dirent * grp_sd = NULL;
    + struct dentry * grp_dentry;

    - if (grp->name)
    - dir = sysfs_get_dentry(kobj->dentry,grp->name);
    - else
    - dir = kobj->dentry;
    -
    - remove_files(dir,grp);
    - dput(dir);
    - if (grp->name)
    - sysfs_remove_subdir(dir);
    -}
    + if (grp->name) {
    + down_read(&kobj->s_dirent->s_rwsem);
    + list_for_each_entry(tmp_sd, &kobj->s_dirent->s_children, s_sibling) {
    + if (!strcmp(grp->name, sysfs_get_name(tmp_sd))) {
    + grp_sd = tmp_sd;
    + break;
    + }
    + }
    + up_read(&kobj->s_dirent->s_rwsem);
    + } else
    + grp_sd = kobj->s_dirent;
    +
    + if (grp_sd->s_dentry) {
    + spin_lock(&dcache_lock);
    + grp_dentry = dget_locked(grp_sd->s_dentry);
    + spin_unlock(&dcache_lock);
    + remove_files(grp_sd, grp);
    + if (grp->name)
    + sysfs_remove_subdir(grp_dentry);
    + dput(grp_dentry);
    + } else
    + sysfs_free_children(grp_sd);

    + sysfs_free_dirent(kobj->s_dirent, grp->name);
    +}

    EXPORT_SYMBOL(sysfs_create_group);
    EXPORT_SYMBOL(sysfs_remove_group);
    _
    --
    Maneesh Soni
    Linux Technology Center,
    IBM Software Lab, Bangalore, India
    email: maneesh@in.ibm.com
    Phone: 91-80-5044999 Fax: 91-80-5268553
    T/L : 9243696
    -
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

    \
     
     \ /
      Last update: 2005-03-22 13:58    [W:0.026 / U:97.224 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site