Skip to content

Commit

Permalink
[GFS2] Fix ref count bug that used to bite us on umount
Browse files Browse the repository at this point in the history
The ref count of certain glock's got elevated too far during unlink
which caused umount to fail. This fixes it.

Signed-off-by: Steven Whitehouse <swhiteho@redhat.com>
  • Loading branch information
Steven Whitehouse committed May 16, 2006
1 parent b9cb981 commit 64c14ea
Showing 1 changed file with 6 additions and 16 deletions.
22 changes: 6 additions & 16 deletions fs/gfs2/inode.c
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand All @@ -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;
}

Expand Down

0 comments on commit 64c14ea

Please sign in to comment.