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

Commit 64c14ea7 authored by Steven Whitehouse's avatar Steven Whitehouse
Browse files

[GFS2] Fix ref count bug that used to bite us on umount



The ref count of certain glock's got elevated too far during unlink
which caused umount to fail. This fixes it.

Signed-off-by: default avatarSteven Whitehouse <swhiteho@redhat.com>
parent b9cb9813
Loading
Loading
Loading
Loading
+6 −16
Original line number Diff line number Diff line
@@ -297,19 +297,13 @@ static int inode_create(struct gfs2_glock *i_gl, const struct gfs2_inum *inum,
	if (!ip)
		return -ENOMEM;
	memset(ip, 0, sizeof(struct gfs2_inode));

	ip->i_num = *inum;

	atomic_set(&ip->i_count, 1);

	ip->i_vn = i_gl->gl_vn - 1;

	ip->i_gl = i_gl;
	ip->i_sbd = sdp;

	spin_lock_init(&ip->i_spin);
	init_rwsem(&ip->i_rw_mutex);

	ip->i_greedy = gfs2_tune_get(sdp, gt_greedy_default);

	if (need_lock) {
@@ -318,27 +312,23 @@ static int inode_create(struct gfs2_glock *i_gl, const struct gfs2_inum *inum,
					   &ip->i_iopen_gh);
		if (error)
			goto fail;
	}

		spin_lock(&io_gl->gl_spin);
		gfs2_glock_hold(i_gl);
		io_gl->gl_object = i_gl;
		spin_unlock(&io_gl->gl_spin);
	}

	gfs2_glock_hold(i_gl);
	i_gl->gl_object = ip;

	atomic_inc(&sdp->sd_inode_count);

	*ipp = ip;

	return 0;

fail:
	gfs2_meta_cache_flush(ip);
	kmem_cache_free(gfs2_inode_cachep, ip);
	*ipp = NULL;

	return error;
}