Skip to content

Commit

Permalink
[GFS2] Replace revoke structure with bufdata structure
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Steven Whitehouse committed Oct 10, 2007
1 parent 8475487 commit 82e8608
Show file tree
Hide file tree
Showing 3 changed files with 22 additions and 21 deletions.
13 changes: 7 additions & 6 deletions fs/gfs2/incore.h
Original file line number Diff line number Diff line change
Expand Up @@ -114,7 +114,13 @@ struct gfs2_bufdata {
struct buffer_head *bd_bh;
struct gfs2_glock *bd_gl;

struct list_head bd_list_tr;
union {
struct list_head list_tr;
u64 blkno;
} u;
#define bd_list_tr u.list_tr
#define bd_blkno u.blkno

struct gfs2_log_element bd_le;

struct gfs2_ail *bd_ail;
Expand Down Expand Up @@ -298,11 +304,6 @@ struct gfs2_file {
struct gfs2_holder f_fl_gh;
};

struct gfs2_revoke {
struct gfs2_log_element rv_le;
u64 rv_blkno;
};

struct gfs2_revoke_replay {
struct list_head rr_list;
u64 rr_blkno;
Expand Down
10 changes: 5 additions & 5 deletions fs/gfs2/lops.c
Original file line number Diff line number Diff line change
Expand Up @@ -357,7 +357,7 @@ static void revoke_lo_before_commit(struct gfs2_sbd *sdp)
struct buffer_head *bh;
unsigned int offset;
struct list_head *head = &sdp->sd_log_le_revoke;
struct gfs2_revoke *rv;
struct gfs2_bufdata *bd;

if (!sdp->sd_log_num_revoke)
return;
Expand All @@ -376,8 +376,8 @@ static void revoke_lo_before_commit(struct gfs2_sbd *sdp)
offset = sizeof(struct gfs2_log_descriptor);

while (!list_empty(head)) {
rv = list_entry(head->next, struct gfs2_revoke, rv_le.le_list);
list_del_init(&rv->rv_le.le_list);
bd = list_entry(head->next, struct gfs2_bufdata, bd_le.le_list);
list_del_init(&bd->bd_le.le_list);
sdp->sd_log_num_revoke--;

if (offset + sizeof(u64) > sdp->sd_sb.sb_bsize) {
Expand All @@ -392,8 +392,8 @@ static void revoke_lo_before_commit(struct gfs2_sbd *sdp)
offset = sizeof(struct gfs2_meta_header);
}

*(__be64 *)(bh->b_data + offset) = cpu_to_be64(rv->rv_blkno);
kfree(rv);
*(__be64 *)(bh->b_data + offset) = cpu_to_be64(bd->bd_blkno);
kfree(bd);

offset += sizeof(u64);
}
Expand Down
20 changes: 10 additions & 10 deletions fs/gfs2/trans.c
Original file line number Diff line number Diff line change
Expand Up @@ -144,23 +144,23 @@ void gfs2_trans_add_bh(struct gfs2_glock *gl, struct buffer_head *bh, int meta)

void gfs2_trans_add_revoke(struct gfs2_sbd *sdp, u64 blkno)
{
struct gfs2_revoke *rv = kmalloc(sizeof(struct gfs2_revoke),
GFP_NOFS | __GFP_NOFAIL);
lops_init_le(&rv->rv_le, &gfs2_revoke_lops);
rv->rv_blkno = blkno;
lops_add(sdp, &rv->rv_le);
struct gfs2_bufdata *bd = kmalloc(sizeof(struct gfs2_bufdata),
GFP_NOFS | __GFP_NOFAIL);
lops_init_le(&bd->bd_le, &gfs2_revoke_lops);
bd->bd_blkno = blkno;
lops_add(sdp, &bd->bd_le);
}

void gfs2_trans_add_unrevoke(struct gfs2_sbd *sdp, u64 blkno)
{
struct gfs2_revoke *rv;
struct gfs2_bufdata *bd;
int found = 0;

gfs2_log_lock(sdp);

list_for_each_entry(rv, &sdp->sd_log_le_revoke, rv_le.le_list) {
if (rv->rv_blkno == blkno) {
list_del(&rv->rv_le.le_list);
list_for_each_entry(bd, &sdp->sd_log_le_revoke, bd_le.le_list) {
if (bd->bd_blkno == blkno) {
list_del(&bd->bd_le.le_list);
gfs2_assert_withdraw(sdp, sdp->sd_log_num_revoke);
sdp->sd_log_num_revoke--;
found = 1;
Expand All @@ -172,7 +172,7 @@ void gfs2_trans_add_unrevoke(struct gfs2_sbd *sdp, u64 blkno)

if (found) {
struct gfs2_trans *tr = current->journal_info;
kfree(rv);
kfree(bd);
tr->tr_num_revoke_rm++;
}
}
Expand Down

0 comments on commit 82e8608

Please sign in to comment.