diff -purN -X /home/mbligh/.diff.exclude 854-sysfs4/fs/sysfs/symlink.c 855-sysfs5/fs/sysfs/symlink.c --- 854-sysfs4/fs/sysfs/symlink.c 2003-10-01 11:47:05.000000000 -0700 +++ 855-sysfs5/fs/sysfs/symlink.c 2004-03-14 10:01:15.000000000 -0800 @@ -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,13 +93,15 @@ 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 * link_name, * path; char * s; + if (!name) + return -EINVAL; + depth = object_depth(kobj); size = object_path_length(target) + depth * 3 - 1; if (size > PATH_MAX) @@ -96,15 +119,20 @@ int sysfs_create_link(struct kobject * k fill_object_path(target,path,size); pr_debug("%s: path = '%s'\n",__FUNCTION__,path); + link_name = kmalloc(strlen(name) + 1, GFP_KERNEL); + if (!link_name) { + kfree(path); + return -ENOMEM; + } + strcpy(link_name, name); + 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, link_name, path); up(&dentry->d_inode->i_sem); - kfree(path); + if (error) { + kfree(path); + kfree(link_name); + } return error; }