aboutsummaryrefslogtreecommitdiffstats
path: root/fs/gfs2/trans.c
diff options
context:
space:
mode:
authorSteven Whitehouse <swhiteho@redhat.com>2006-04-11 14:49:06 -0400
committerSteven Whitehouse <swhiteho@redhat.com>2006-04-11 14:49:06 -0400
commitf4154ea039bbf45c52840b30c68143a2dc28d4b4 (patch)
treefa00645dd60a9140e885be96a4aa9797cf4cfeac /fs/gfs2/trans.c
parented3865079b573ef55dc13ab0bfb242ed5ebab4c1 (diff)
[GFS2] Update journal accounting code.
A small update to the journaling code to change the way that the "extra" blocks are accounted for in the journal. These are used at a rate of one per 503 metadata blocks or one per 251 journaled data blocks (or just one if the total number of journaled blocks in the transaction is smaller). Since we are using them at two different rates the old method of accounting for them no longer works and we count them up as required. Since the "per transaction" accounting can't handle this (there is no fixed number of header blocks per transaction) we have to account for it in the general journal code. We now require that each transaction reserves more blocks than it actually needs to take account of the possible extra blocks. Also a final fix to dir.c to ensure that all ref counts are handled correctly. Signed-off-by: Steven Whitehouse <swhiteho@redhat.com>
Diffstat (limited to 'fs/gfs2/trans.c')
-rw-r--r--fs/gfs2/trans.c13
1 files changed, 3 insertions, 10 deletions
diff --git a/fs/gfs2/trans.c b/fs/gfs2/trans.c
index 061f4a9a1db4..6b02d8c38f0f 100644
--- a/fs/gfs2/trans.c
+++ b/fs/gfs2/trans.c
@@ -44,7 +44,7 @@ int gfs2_trans_begin(struct gfs2_sbd *sdp, unsigned int blocks,
44 tr->tr_revokes = revokes; 44 tr->tr_revokes = revokes;
45 tr->tr_reserved = 1; 45 tr->tr_reserved = 1;
46 if (blocks) 46 if (blocks)
47 tr->tr_reserved += 1 + blocks; 47 tr->tr_reserved += 6 + blocks;
48 if (revokes) 48 if (revokes)
49 tr->tr_reserved += gfs2_struct2blk(sdp, revokes, 49 tr->tr_reserved += gfs2_struct2blk(sdp, revokes,
50 sizeof(uint64_t)); 50 sizeof(uint64_t));
@@ -83,20 +83,15 @@ fail_holder_uninit:
83 83
84void gfs2_trans_end(struct gfs2_sbd *sdp) 84void gfs2_trans_end(struct gfs2_sbd *sdp)
85{ 85{
86 struct gfs2_trans *tr; 86 struct gfs2_trans *tr = current->journal_info;
87 87
88 tr = current->journal_info; 88 BUG_ON(!tr);
89 current->journal_info = NULL; 89 current->journal_info = NULL;
90 90
91 if (gfs2_assert_warn(sdp, tr))
92 return;
93
94 if (!tr->tr_touched) { 91 if (!tr->tr_touched) {
95 gfs2_log_release(sdp, tr->tr_reserved); 92 gfs2_log_release(sdp, tr->tr_reserved);
96
97 gfs2_glock_dq(&tr->tr_t_gh); 93 gfs2_glock_dq(&tr->tr_t_gh);
98 gfs2_holder_uninit(&tr->tr_t_gh); 94 gfs2_holder_uninit(&tr->tr_t_gh);
99
100 kfree(tr); 95 kfree(tr);
101 return; 96 return;
102 } 97 }
@@ -113,10 +108,8 @@ void gfs2_trans_end(struct gfs2_sbd *sdp)
113 } 108 }
114 109
115 gfs2_log_commit(sdp, tr); 110 gfs2_log_commit(sdp, tr);
116
117 gfs2_glock_dq(&tr->tr_t_gh); 111 gfs2_glock_dq(&tr->tr_t_gh);
118 gfs2_holder_uninit(&tr->tr_t_gh); 112 gfs2_holder_uninit(&tr->tr_t_gh);
119
120 kfree(tr); 113 kfree(tr);
121 114
122 if (sdp->sd_vfs->s_flags & MS_SYNCHRONOUS) 115 if (sdp->sd_vfs->s_flags & MS_SYNCHRONOUS)