aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/base/devtmpfs.c
diff options
context:
space:
mode:
authorAl Viro <viro@zeniv.linux.org.uk>2011-06-27 16:37:12 -0400
committerAl Viro <viro@zeniv.linux.org.uk>2011-07-20 01:44:11 -0400
commit5da4e689449ad99ab31cf2208d99eddfce0498ba (patch)
tree5cd8ccc145b8b29b3a63dd6252ee921d8e01379b /drivers/base/devtmpfs.c
parent69753a0f14d3cb2e8a70e559ef8d409e4deeac8a (diff)
devtmpfs: get rid of bogus mkdir in create_path()
We do _NOT_ want to mkdir the path itself - we are preparing to mknod it, after all. Normally it'll fail with -ENOENT and just do nothing, but if somebody has created the parent in the meanwhile, we'll get buggered... Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'drivers/base/devtmpfs.c')
-rw-r--r--drivers/base/devtmpfs.c42
1 files changed, 18 insertions, 24 deletions
diff --git a/drivers/base/devtmpfs.c b/drivers/base/devtmpfs.c
index a49897d05325..6d678c99512e 100644
--- a/drivers/base/devtmpfs.c
+++ b/drivers/base/devtmpfs.c
@@ -164,34 +164,28 @@ static int dev_mkdir(const char *name, mode_t mode)
164 164
165static int create_path(const char *nodepath) 165static int create_path(const char *nodepath)
166{ 166{
167 char *path;
168 char *s;
167 int err; 169 int err;
168 170
169 err = dev_mkdir(nodepath, 0755); 171 /* parent directories do not exist, create them */
170 if (err == -ENOENT) { 172 path = kstrdup(nodepath, GFP_KERNEL);
171 char *path; 173 if (!path)
172 char *s; 174 return -ENOMEM;
173 175
174 /* parent directories do not exist, create them */ 176 s = path;
175 path = kstrdup(nodepath, GFP_KERNEL); 177 for (;;) {
176 if (!path) { 178 s = strchr(s, '/');
177 err = -ENOMEM; 179 if (!s)
178 goto out; 180 break;
179 } 181 s[0] = '\0';
180 s = path; 182 err = dev_mkdir(path, 0755);
181 for (;;) { 183 if (err && err != -EEXIST)
182 s = strchr(s, '/'); 184 break;
183 if (!s) 185 s[0] = '/';
184 break; 186 s++;
185 s[0] = '\0';
186 err = dev_mkdir(path, 0755);
187 if (err && err != -EEXIST)
188 break;
189 s[0] = '/';
190 s++;
191 }
192 kfree(path);
193 } 187 }
194out: 188 kfree(path);
195 return err; 189 return err;
196} 190}
197 191