提交 64c14ea7 编写于 作者: S Steven Whitehouse

[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: NSteven Whitehouse <swhiteho@redhat.com>
上级 b9cb9813
......@@ -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);
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:
fail:
gfs2_meta_cache_flush(ip);
kmem_cache_free(gfs2_inode_cachep, ip);
*ipp = NULL;
return error;
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册