debugfs: split end_creating() into success and failure cases
authorAl Viro <viro@zeniv.linux.org.uk>
Sun, 25 Jan 2015 19:39:49 +0000 (14:39 -0500)
committerAl Viro <viro@zeniv.linux.org.uk>
Sun, 25 Jan 2015 21:52:53 +0000 (16:52 -0500)
... and don't bother with dput(dentry) in the former and with
dget(dentry) preceding all its calls.

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
fs/debugfs/inode.c

index 61e9a68..1219dff 100644 (file)
@@ -256,15 +256,17 @@ static struct dentry *start_creating(const char *name, struct dentry *parent)
        return dentry;
 }
 
-static struct dentry *end_creating(struct dentry *dentry, int error)
+static struct dentry *failed_creating(struct dentry *dentry)
 {
        mutex_unlock(&dentry->d_parent->d_inode->i_mutex);
        dput(dentry);
+       simple_release_fs(&debugfs_mount, &debugfs_mount_count);
+       return NULL;
+}
 
-       if (error) {
-               dentry = NULL;
-               simple_release_fs(&debugfs_mount, &debugfs_mount_count);
-       }
+static struct dentry *end_creating(struct dentry *dentry)
+{
+       mutex_unlock(&dentry->d_parent->d_inode->i_mutex);
        return dentry;
 }
 
@@ -311,15 +313,14 @@ struct dentry *debugfs_create_file(const char *name, umode_t mode,
 
        inode = debugfs_get_inode(dentry->d_sb);
        if (unlikely(!inode))
-               return end_creating(dentry, -ENOMEM);
+               return failed_creating(dentry);
 
        inode->i_mode = mode;
        inode->i_fop = fops ? fops : &debugfs_file_operations;
        inode->i_private = data;
        d_instantiate(dentry, inode);
-       dget(dentry);
        fsnotify_create(dentry->d_parent->d_inode, dentry);
-       return end_creating(dentry, 0);
+       return end_creating(dentry);
 }
 EXPORT_SYMBOL_GPL(debugfs_create_file);
 
@@ -351,7 +352,7 @@ struct dentry *debugfs_create_dir(const char *name, struct dentry *parent)
 
        inode = debugfs_get_inode(dentry->d_sb);
        if (unlikely(!inode))
-               return end_creating(dentry, -ENOMEM);
+               return failed_creating(dentry);
 
        inode->i_mode = S_IFDIR | S_IRWXU | S_IRUGO | S_IXUGO;
        inode->i_op = &simple_dir_inode_operations;
@@ -360,10 +361,9 @@ struct dentry *debugfs_create_dir(const char *name, struct dentry *parent)
        /* directory inodes start off with i_nlink == 2 (for "." entry) */
        inc_nlink(inode);
        d_instantiate(dentry, inode);
-       dget(dentry);
        inc_nlink(dentry->d_parent->d_inode);
        fsnotify_mkdir(dentry->d_parent->d_inode, dentry);
-       return end_creating(dentry, 0);
+       return end_creating(dentry);
 }
 EXPORT_SYMBOL_GPL(debugfs_create_dir);
 
@@ -408,14 +408,13 @@ struct dentry *debugfs_create_symlink(const char *name, struct dentry *parent,
        inode = debugfs_get_inode(dentry->d_sb);
        if (unlikely(!inode)) {
                kfree(link);
-               return end_creating(dentry, -ENOMEM);
+               return failed_creating(dentry);
        }
        inode->i_mode = S_IFLNK | S_IRWXUGO;
        inode->i_op = &debugfs_link_operations;
        inode->i_private = link;
        d_instantiate(dentry, inode);
-       dget(dentry);
-       return end_creating(dentry, 0);
+       return end_creating(dentry);
 }
 EXPORT_SYMBOL_GPL(debugfs_create_symlink);