소스 검색

[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>
Steven Whitehouse 19 년 전
부모
커밋
64c14ea73b
1개의 변경된 파일6개의 추가작업 그리고 16개의 파일을 삭제
  1. 6 16
      fs/gfs2/inode.c

+ 6 - 16
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;
 }