aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSteven Whitehouse <swhiteho@redhat.com>2006-05-16 13:37:11 -0400
committerSteven Whitehouse <swhiteho@redhat.com>2006-05-16 13:37:11 -0400
commit64c14ea73b58e2c3759682d67eeb00d088355f08 (patch)
tree69f6adfd67fd7d597f1c16d1dff8ad2b8e055df3
parentb9cb981310bc22f165726e99385c2d85196e2f41 (diff)
[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: Steven Whitehouse <swhiteho@redhat.com>
-rw-r--r--fs/gfs2/inode.c22
1 files changed, 6 insertions, 16 deletions
diff --git a/fs/gfs2/inode.c b/fs/gfs2/inode.c
index 5522fa74729..5bc9542c7fc 100644
--- a/fs/gfs2/inode.c
+++ b/fs/gfs2/inode.c
@@ -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;
}