Messages in this thread Patch in this message | | | Date | Wed, 12 Nov 2003 17:56:47 +0530 | From | Maneesh Soni <> | Subject | Re: [RFC 5/5] sysfs-symlink.patch |
| |
o This patch creates symlink kobject. We don't create the symlink in sysfs when sysfs_create_symlink() is called but just allocates one sysfs_dirent of type SYSFS_KOBJ_LINK. The s_element for symlinks is an array of two strings, one prepresenting the name of the link and another patch of the target of the link.
fs/sysfs/symlink.c | 36 ++++++++++++++++++++---------------- 1 files changed, 20 insertions(+), 16 deletions(-)
diff -puN fs/sysfs/symlink.c~sysfs-symlink fs/sysfs/symlink.c --- linux-2.6.0-test9/fs/sysfs/symlink.c~sysfs-symlink 2003-11-12 15:26:34.000000000 +0530 +++ linux-2.6.0-test9-maneesh/fs/sysfs/symlink.c 2003-11-12 15:26:53.000000000 +0530 @@ -15,7 +15,7 @@ static int init_symlink(struct inode * i return 0; } -static int sysfs_symlink(struct inode * dir, struct dentry *dentry, const char * symname) +int sysfs_symlink(struct inode * dir, struct dentry *dentry, const char * symname) { int error; @@ -71,13 +71,12 @@ static void fill_object_path(struct kobj */ int sysfs_create_link(struct kobject * kobj, struct kobject * target, char * name) { - struct dentry * dentry = kobj->dentry; - struct dentry * d; - int error = 0; int size; int depth; char * path; char * s; + char ** link_names; + struct sysfs_dirent * link; depth = object_depth(kobj); size = object_path_length(target) + depth * 3 - 1; @@ -96,18 +95,23 @@ int sysfs_create_link(struct kobject * k fill_object_path(target,path,size); pr_debug("%s: path = '%s'\n",__FUNCTION__,path); - down(&dentry->d_inode->i_sem); - d = sysfs_get_dentry(dentry,name); - if (!IS_ERR(d)) - error = sysfs_symlink(dentry->d_inode,d,path); - else - error = PTR_ERR(d); - dput(d); - up(&dentry->d_inode->i_sem); - kfree(path); - return error; -} + link_names = kmalloc(2 * (sizeof(char *)), GFP_KERNEL); + if (!link_names) { + kfree(path); + return -ENOMEM; + } + link_names[0] = name; + link_names[1] = path; + + link = sysfs_alloc_dirent(kobj->s_dirent, link_names, SYSFS_KOBJ_LINK); + if (IS_ERR(link)) { + kfree(path); + kfree(link_names); + return PTR_ERR(link); + } + return 0; +} /** * sysfs_remove_link - remove symlink in object's directory. @@ -117,7 +121,7 @@ int sysfs_create_link(struct kobject * k void sysfs_remove_link(struct kobject * kobj, char * name) { - sysfs_hash_and_remove(kobj->dentry,name); + sysfs_hash_and_remove(kobj->s_dirent, name); } _ -- 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/
| |