diff -aurpN -X /home/fletch/.diff.exclude 654-sysfs_backing_store4/fs/sysfs/symlink.c 655-sysfs_backing_store5/fs/sysfs/symlink.c --- 654-sysfs_backing_store4/fs/sysfs/symlink.c Mon Nov 17 18:28:19 2003 +++ 655-sysfs_backing_store5/fs/sysfs/symlink.c Wed Feb 11 10:16:53 2004 @@ -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; @@ -63,6 +63,27 @@ static void fill_object_path(struct kobj } } +static int sysfs_add_link(struct sysfs_dirent * parent_sd, char * name, char * target) +{ + struct sysfs_dirent * sd; + char ** link_names; + + link_names = kmalloc(sizeof(char *) * 2, GFP_KERNEL); + if (!link_names) + return -ENOMEM; + + link_names[0] = name; + link_names[1] = target; + + sd = sysfs_new_dirent(parent_sd, link_names, SYSFS_KOBJ_LINK); + if (!sd) { + kfree(link_names); + return -ENOMEM; + } + + return 0; +} + /** * sysfs_create_link - create symlink between two objects. * @kobj: object whose directory we're creating the link in. @@ -72,7 +93,6 @@ 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; @@ -97,14 +117,10 @@ int sysfs_create_link(struct kobject * k 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); + error = sysfs_add_link(dentry->d_fsdata, name, path); up(&dentry->d_inode->i_sem); - kfree(path); + if (error) + kfree(path); return error; }