diff options
author | Steven Whitehouse <swhiteho@redhat.com> | 2006-04-11 14:49:06 -0400 |
---|---|---|
committer | Steven Whitehouse <swhiteho@redhat.com> | 2006-04-11 14:49:06 -0400 |
commit | f4154ea039bbf45c52840b30c68143a2dc28d4b4 (patch) | |
tree | fa00645dd60a9140e885be96a4aa9797cf4cfeac /fs/gfs2/trans.c | |
parent | ed3865079b573ef55dc13ab0bfb242ed5ebab4c1 (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.c | 13 |
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 | ||
84 | void gfs2_trans_end(struct gfs2_sbd *sdp) | 84 | void 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) |