diff options
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/base/devtmpfs.c | 39 |
1 files changed, 16 insertions, 23 deletions
diff --git a/drivers/base/devtmpfs.c b/drivers/base/devtmpfs.c index 880a203b6688..c7f5c08f8790 100644 --- a/drivers/base/devtmpfs.c +++ b/drivers/base/devtmpfs.c | |||
@@ -76,37 +76,26 @@ static int dev_mkdir(const char *name, mode_t mode) | |||
76 | dentry = lookup_create(&nd, 1); | 76 | dentry = lookup_create(&nd, 1); |
77 | if (!IS_ERR(dentry)) { | 77 | if (!IS_ERR(dentry)) { |
78 | err = vfs_mkdir(nd.path.dentry->d_inode, dentry, mode); | 78 | err = vfs_mkdir(nd.path.dentry->d_inode, dentry, mode); |
79 | if (!err) | ||
80 | /* mark as kernel-created inode */ | ||
81 | dentry->d_inode->i_private = &dev_mnt; | ||
79 | dput(dentry); | 82 | dput(dentry); |
80 | } else { | 83 | } else { |
81 | err = PTR_ERR(dentry); | 84 | err = PTR_ERR(dentry); |
82 | } | 85 | } |
83 | mutex_unlock(&nd.path.dentry->d_inode->i_mutex); | ||
84 | 86 | ||
87 | mutex_unlock(&nd.path.dentry->d_inode->i_mutex); | ||
85 | path_put(&nd.path); | 88 | path_put(&nd.path); |
86 | return err; | 89 | return err; |
87 | } | 90 | } |
88 | 91 | ||
89 | static int create_path(const char *nodepath) | 92 | static int create_path(const char *nodepath) |
90 | { | 93 | { |
91 | struct nameidata nd; | 94 | int err; |
92 | int err = 0; | ||
93 | 95 | ||
94 | read_lock(&dirlock); | 96 | read_lock(&dirlock); |
95 | err = vfs_path_lookup(dev_mnt->mnt_root, dev_mnt, | 97 | err = dev_mkdir(nodepath, 0755); |
96 | nodepath, LOOKUP_PARENT, &nd); | 98 | if (err == -ENOENT) { |
97 | if (err == 0) { | ||
98 | struct dentry *dentry; | ||
99 | |||
100 | /* create directory right away */ | ||
101 | dentry = lookup_create(&nd, 1); | ||
102 | if (!IS_ERR(dentry)) { | ||
103 | err = vfs_mkdir(nd.path.dentry->d_inode, | ||
104 | dentry, 0755); | ||
105 | dput(dentry); | ||
106 | } | ||
107 | mutex_unlock(&nd.path.dentry->d_inode->i_mutex); | ||
108 | path_put(&nd.path); | ||
109 | } else if (err == -ENOENT) { | ||
110 | char *path; | 99 | char *path; |
111 | char *s; | 100 | char *s; |
112 | 101 | ||
@@ -129,7 +118,6 @@ static int create_path(const char *nodepath) | |||
129 | kfree(path); | 118 | kfree(path); |
130 | } | 119 | } |
131 | read_unlock(&dirlock); | 120 | read_unlock(&dirlock); |
132 | |||
133 | return err; | 121 | return err; |
134 | } | 122 | } |
135 | 123 | ||
@@ -213,16 +201,21 @@ static int dev_rmdir(const char *name) | |||
213 | mutex_lock_nested(&nd.path.dentry->d_inode->i_mutex, I_MUTEX_PARENT); | 201 | mutex_lock_nested(&nd.path.dentry->d_inode->i_mutex, I_MUTEX_PARENT); |
214 | dentry = lookup_one_len(nd.last.name, nd.path.dentry, nd.last.len); | 202 | dentry = lookup_one_len(nd.last.name, nd.path.dentry, nd.last.len); |
215 | if (!IS_ERR(dentry)) { | 203 | if (!IS_ERR(dentry)) { |
216 | if (dentry->d_inode) | 204 | if (dentry->d_inode) { |
217 | err = vfs_rmdir(nd.path.dentry->d_inode, dentry); | 205 | if (dentry->d_inode->i_private == &dev_mnt) |
218 | else | 206 | err = vfs_rmdir(nd.path.dentry->d_inode, |
207 | dentry); | ||
208 | else | ||
209 | err = -EPERM; | ||
210 | } else { | ||
219 | err = -ENOENT; | 211 | err = -ENOENT; |
212 | } | ||
220 | dput(dentry); | 213 | dput(dentry); |
221 | } else { | 214 | } else { |
222 | err = PTR_ERR(dentry); | 215 | err = PTR_ERR(dentry); |
223 | } | 216 | } |
224 | mutex_unlock(&nd.path.dentry->d_inode->i_mutex); | ||
225 | 217 | ||
218 | mutex_unlock(&nd.path.dentry->d_inode->i_mutex); | ||
226 | path_put(&nd.path); | 219 | path_put(&nd.path); |
227 | return err; | 220 | return err; |
228 | } | 221 | } |