[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>
diff --git a/fs/gfs2/inode.c b/fs/gfs2/inode.c
index 5522fa7..5bc9542 100644
--- a/fs/gfs2/inode.c
+++ b/fs/gfs2/inode.c
@@ -297,19 +297,13 @@
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 @@
&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;
}