Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 46e3a232 authored by Al Viro's avatar Al Viro Committed by Amit Pundir
Browse files

UPSTREAM: debugfs: split end_creating() into success and failure cases



... and don't bother with dput(dentry) in the former and with
dget(dentry) preceding all its calls.

Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>

Bug: 31856701
Change-Id: I4f4aa36421f5b8beed9ed3a20c9c8ba1c511e98a
(cherry picked from commit 5233e31191af661389a4f5b060873bfcb155c828)
Signed-off-by: default avatarPaul Lawrence <paullawrence@google.com>
parent 8268b25c
Loading
Loading
Loading
Loading
+13 −14
Original line number Diff line number Diff line
@@ -265,15 +265,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);

	if (error) {
		dentry = NULL;
	simple_release_fs(&debugfs_mount, &debugfs_mount_count);
	return NULL;
}

static struct dentry *end_creating(struct dentry *dentry)
{
	mutex_unlock(&dentry->d_parent->d_inode->i_mutex);
	return dentry;
}

@@ -320,15 +322,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);

@@ -360,7 +361,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;
@@ -369,10 +370,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);

@@ -417,14 +417,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);