configfs: sanitize configfs_create()
authorAl Viro <viro@zeniv.linux.org.uk>
Sat, 17 Mar 2012 20:41:55 +0000 (16:41 -0400)
committerAl Viro <viro@zeniv.linux.org.uk>
Wed, 21 Mar 2012 01:29:47 +0000 (21:29 -0400)
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
fs/configfs/inode.c

index 8cf21ef..0074362 100644 (file)
@@ -187,36 +187,35 @@ static void configfs_set_inode_lock_class(struct configfs_dirent *sd,
 int configfs_create(struct dentry * dentry, umode_t mode, int (*init)(struct inode *))
 {
        int error = 0;
-       struct inode * inode = NULL;
-       if (dentry) {
-               if (!dentry->d_inode) {
-                       struct configfs_dirent *sd = dentry->d_fsdata;
-                       if ((inode = configfs_new_inode(mode, sd, dentry->d_sb))) {
-                               if (dentry->d_parent && dentry->d_parent->d_inode) {
-                                       struct inode *p_inode = dentry->d_parent->d_inode;
-                                       p_inode->i_mtime = p_inode->i_ctime = CURRENT_TIME;
-                               }
-                               configfs_set_inode_lock_class(sd, inode);
-                               goto Proceed;
-                       }
-                       else
-                               error = -ENOMEM;
-               } else
-                       error = -EEXIST;
-       } else
-               error = -ENOENT;
-       goto Done;
+       struct inode *inode = NULL;
+       struct configfs_dirent *sd;
+       struct inode *p_inode;
+
+       if (!dentry)
+               return -ENOENT;
+
+       if (dentry->d_inode)
+               return -EEXIST;
 
- Proceed:
-       if (init)
+       sd = dentry->d_fsdata;
+       inode = configfs_new_inode(mode, sd, dentry->d_sb);
+       if (!inode)
+               return -ENOMEM;
+
+       p_inode = dentry->d_parent->d_inode;
+       p_inode->i_mtime = p_inode->i_ctime = CURRENT_TIME;
+       configfs_set_inode_lock_class(sd, inode);
+
+       if (init) {
                error = init(inode);
-       if (!error) {
-               d_instantiate(dentry, inode);
-               if (S_ISDIR(mode) || S_ISLNK(mode))
-                       dget(dentry);  /* pin link and directory dentries in core */
-       } else
-               iput(inode);
- Done:
+               if (error) {
+                       iput(inode);
+                       return error;
+               }
+       }
+       d_instantiate(dentry, inode);
+       if (S_ISDIR(mode) || S_ISLNK(mode))
+               dget(dentry);  /* pin link and directory dentries in core */
        return error;
 }