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

Commit 5ca1db41 authored by Miklos Szeredi's avatar Miklos Szeredi Committed by Steven Whitehouse
Browse files

GFS2: fix dentry leaks



We need to dput() the result of d_splice_alias(), unless it is passed to
finish_no_open().

Edited by Steven Whitehouse in order to make it apply to the current
GFS2 git tree, and taking account of a prerequisite patch which hasn't
been applied.

Signed-off-by: default avatarMiklos Szeredi <mszeredi@suse.cz>
Signed-off-by: default avatarSteven Whitehouse <swhiteho@redhat.com>
Cc: stable@vger.kernel.org
parent 149ed7f5
Loading
Loading
Loading
Loading
+16 −10
Original line number Diff line number Diff line
@@ -585,13 +585,15 @@ static int gfs2_create_inode(struct inode *dir, struct dentry *dentry,
		d = d_splice_alias(inode, dentry);
		error = 0;
		if (file) {
			if (d == NULL)
				d = dentry;
			if (S_ISREG(inode->i_mode))
				error = finish_open(file, d, gfs2_open_common, opened);
			else
			if (S_ISREG(inode->i_mode)) {
				WARN_ON(d != NULL);
				error = finish_open(file, dentry, gfs2_open_common, opened);
			} else {
				error = finish_no_open(file, d);
			}
		} else {
			dput(d);
		}
		gfs2_glock_dq_uninit(ghs);
		return error;
	} else if (error != -ENOENT) {
@@ -777,8 +779,10 @@ static struct dentry *__gfs2_lookup(struct inode *dir, struct dentry *dentry,
		error = finish_open(file, dentry, gfs2_open_common, opened);

	gfs2_glock_dq_uninit(&gh);
	if (error)
	if (error) {
		dput(d);
		return ERR_PTR(error);
	}
	return d;
}

@@ -1159,14 +1163,16 @@ static int gfs2_atomic_open(struct inode *dir, struct dentry *dentry,
	d = __gfs2_lookup(dir, dentry, file, opened);
	if (IS_ERR(d))
		return PTR_ERR(d);
	if (d == NULL)
		d = dentry;
	if (d->d_inode) {
	if (d != NULL)
		dentry = d;
	if (dentry->d_inode) {
		if (!(*opened & FILE_OPENED))
			return finish_no_open(file, d);
			return finish_no_open(file, dentry);
		dput(d);
		return 0;
	}

	BUG_ON(d != NULL);
	if (!(flags & O_CREAT))
		return -ENOENT;