aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSteven Whitehouse <swhiteho@redhat.com>2007-09-02 10:39:43 -0400
committerSteven Whitehouse <swhiteho@redhat.com>2007-10-10 03:56:07 -0400
commit82e86087bb774cd54d47db4a7c771b5b29bea9ed (patch)
treec067773861203becfa6c8cf9e4ee449787cf65f6
parent8475487befb29eeb038fef374a7433d276336a25 (diff)
[GFS2] Replace revoke structure with bufdata structure
Both the revoke structure and the bufdata structure are quite similar. They are basically small tags which are put on lists. In addition to which the revoke structure is always allocated when there is a bufdata structure which is (or can be) freed. As such it should be possible to reduce the number of frees and allocations by using the same structure for both purposes. This patch is the first step along that path. It replaces existing uses of the revoke structure with the bufdata structure. Signed-off-by: Steven Whitehouse <swhiteho@redhat.com>
-rw-r--r--fs/gfs2/incore.h13
-rw-r--r--fs/gfs2/lops.c10
-rw-r--r--fs/gfs2/trans.c20
3 files changed, 22 insertions, 21 deletions
diff --git a/fs/gfs2/incore.h b/fs/gfs2/incore.h
index 388dc1bd736f..8aa5780862be 100644
--- a/fs/gfs2/incore.h
+++ b/fs/gfs2/incore.h
@@ -114,7 +114,13 @@ struct gfs2_bufdata {
114 struct buffer_head *bd_bh; 114 struct buffer_head *bd_bh;
115 struct gfs2_glock *bd_gl; 115 struct gfs2_glock *bd_gl;
116 116
117 struct list_head bd_list_tr; 117 union {
118 struct list_head list_tr;
119 u64 blkno;
120 } u;
121#define bd_list_tr u.list_tr
122#define bd_blkno u.blkno
123
118 struct gfs2_log_element bd_le; 124 struct gfs2_log_element bd_le;
119 125
120 struct gfs2_ail *bd_ail; 126 struct gfs2_ail *bd_ail;
@@ -298,11 +304,6 @@ struct gfs2_file {
298 struct gfs2_holder f_fl_gh; 304 struct gfs2_holder f_fl_gh;
299}; 305};
300 306
301struct gfs2_revoke {
302 struct gfs2_log_element rv_le;
303 u64 rv_blkno;
304};
305
306struct gfs2_revoke_replay { 307struct gfs2_revoke_replay {
307 struct list_head rr_list; 308 struct list_head rr_list;
308 u64 rr_blkno; 309 u64 rr_blkno;
diff --git a/fs/gfs2/lops.c b/fs/gfs2/lops.c
index 7e2d4e692b50..cf6fe3631554 100644
--- a/fs/gfs2/lops.c
+++ b/fs/gfs2/lops.c
@@ -357,7 +357,7 @@ static void revoke_lo_before_commit(struct gfs2_sbd *sdp)
357 struct buffer_head *bh; 357 struct buffer_head *bh;
358 unsigned int offset; 358 unsigned int offset;
359 struct list_head *head = &sdp->sd_log_le_revoke; 359 struct list_head *head = &sdp->sd_log_le_revoke;
360 struct gfs2_revoke *rv; 360 struct gfs2_bufdata *bd;
361 361
362 if (!sdp->sd_log_num_revoke) 362 if (!sdp->sd_log_num_revoke)
363 return; 363 return;
@@ -376,8 +376,8 @@ static void revoke_lo_before_commit(struct gfs2_sbd *sdp)
376 offset = sizeof(struct gfs2_log_descriptor); 376 offset = sizeof(struct gfs2_log_descriptor);
377 377
378 while (!list_empty(head)) { 378 while (!list_empty(head)) {
379 rv = list_entry(head->next, struct gfs2_revoke, rv_le.le_list); 379 bd = list_entry(head->next, struct gfs2_bufdata, bd_le.le_list);
380 list_del_init(&rv->rv_le.le_list); 380 list_del_init(&bd->bd_le.le_list);
381 sdp->sd_log_num_revoke--; 381 sdp->sd_log_num_revoke--;
382 382
383 if (offset + sizeof(u64) > sdp->sd_sb.sb_bsize) { 383 if (offset + sizeof(u64) > sdp->sd_sb.sb_bsize) {
@@ -392,8 +392,8 @@ static void revoke_lo_before_commit(struct gfs2_sbd *sdp)
392 offset = sizeof(struct gfs2_meta_header); 392 offset = sizeof(struct gfs2_meta_header);
393 } 393 }
394 394
395 *(__be64 *)(bh->b_data + offset) = cpu_to_be64(rv->rv_blkno); 395 *(__be64 *)(bh->b_data + offset) = cpu_to_be64(bd->bd_blkno);
396 kfree(rv); 396 kfree(bd);
397 397
398 offset += sizeof(u64); 398 offset += sizeof(u64);
399 } 399 }
diff --git a/fs/gfs2/trans.c b/fs/gfs2/trans.c
index f8dabf8446bb..eadf96e00510 100644
--- a/fs/gfs2/trans.c
+++ b/fs/gfs2/trans.c
@@ -144,23 +144,23 @@ void gfs2_trans_add_bh(struct gfs2_glock *gl, struct buffer_head *bh, int meta)
144 144
145void gfs2_trans_add_revoke(struct gfs2_sbd *sdp, u64 blkno) 145void gfs2_trans_add_revoke(struct gfs2_sbd *sdp, u64 blkno)
146{ 146{
147 struct gfs2_revoke *rv = kmalloc(sizeof(struct gfs2_revoke), 147 struct gfs2_bufdata *bd = kmalloc(sizeof(struct gfs2_bufdata),
148 GFP_NOFS | __GFP_NOFAIL); 148 GFP_NOFS | __GFP_NOFAIL);
149 lops_init_le(&rv->rv_le, &gfs2_revoke_lops); 149 lops_init_le(&bd->bd_le, &gfs2_revoke_lops);
150 rv->rv_blkno = blkno; 150 bd->bd_blkno = blkno;
151 lops_add(sdp, &rv->rv_le); 151 lops_add(sdp, &bd->bd_le);
152} 152}
153 153
154void gfs2_trans_add_unrevoke(struct gfs2_sbd *sdp, u64 blkno) 154void gfs2_trans_add_unrevoke(struct gfs2_sbd *sdp, u64 blkno)
155{ 155{
156 struct gfs2_revoke *rv; 156 struct gfs2_bufdata *bd;
157 int found = 0; 157 int found = 0;
158 158
159 gfs2_log_lock(sdp); 159 gfs2_log_lock(sdp);
160 160
161 list_for_each_entry(rv, &sdp->sd_log_le_revoke, rv_le.le_list) { 161 list_for_each_entry(bd, &sdp->sd_log_le_revoke, bd_le.le_list) {
162 if (rv->rv_blkno == blkno) { 162 if (bd->bd_blkno == blkno) {
163 list_del(&rv->rv_le.le_list); 163 list_del(&bd->bd_le.le_list);
164 gfs2_assert_withdraw(sdp, sdp->sd_log_num_revoke); 164 gfs2_assert_withdraw(sdp, sdp->sd_log_num_revoke);
165 sdp->sd_log_num_revoke--; 165 sdp->sd_log_num_revoke--;
166 found = 1; 166 found = 1;
@@ -172,7 +172,7 @@ void gfs2_trans_add_unrevoke(struct gfs2_sbd *sdp, u64 blkno)
172 172
173 if (found) { 173 if (found) {
174 struct gfs2_trans *tr = current->journal_info; 174 struct gfs2_trans *tr = current->journal_info;
175 kfree(rv); 175 kfree(bd);
176 tr->tr_num_revoke_rm++; 176 tr->tr_num_revoke_rm++;
177 } 177 }
178} 178}