diff options
Diffstat (limited to 'fs/sysfs/symlink.c')
-rw-r--r-- | fs/sysfs/symlink.c | 14 |
1 files changed, 12 insertions, 2 deletions
diff --git a/fs/sysfs/symlink.c b/fs/sysfs/symlink.c index d2eac3ceed5f..f50e3cc2ded8 100644 --- a/fs/sysfs/symlink.c +++ b/fs/sysfs/symlink.c | |||
@@ -3,6 +3,7 @@ | |||
3 | */ | 3 | */ |
4 | 4 | ||
5 | #include <linux/fs.h> | 5 | #include <linux/fs.h> |
6 | #include <linux/mount.h> | ||
6 | #include <linux/module.h> | 7 | #include <linux/module.h> |
7 | #include <linux/kobject.h> | 8 | #include <linux/kobject.h> |
8 | #include <linux/namei.h> | 9 | #include <linux/namei.h> |
@@ -82,10 +83,19 @@ exit1: | |||
82 | */ | 83 | */ |
83 | int sysfs_create_link(struct kobject * kobj, struct kobject * target, const char * name) | 84 | int sysfs_create_link(struct kobject * kobj, struct kobject * target, const char * name) |
84 | { | 85 | { |
85 | struct dentry * dentry = kobj->dentry; | 86 | struct dentry *dentry = NULL; |
86 | int error = -EEXIST; | 87 | int error = -EEXIST; |
87 | 88 | ||
88 | BUG_ON(!kobj || !kobj->dentry || !name); | 89 | BUG_ON(!name); |
90 | |||
91 | if (!kobj) { | ||
92 | if (sysfs_mount && sysfs_mount->mnt_sb) | ||
93 | dentry = sysfs_mount->mnt_sb->s_root; | ||
94 | } else | ||
95 | dentry = kobj->dentry; | ||
96 | |||
97 | if (!dentry) | ||
98 | return -EFAULT; | ||
89 | 99 | ||
90 | mutex_lock(&dentry->d_inode->i_mutex); | 100 | mutex_lock(&dentry->d_inode->i_mutex); |
91 | if (!sysfs_dirent_exist(dentry->d_fsdata, name)) | 101 | if (!sysfs_dirent_exist(dentry->d_fsdata, name)) |