diff options
author | Steven Whitehouse <swhiteho@redhat.com> | 2007-09-03 06:01:33 -0400 |
---|---|---|
committer | Steven Whitehouse <swhiteho@redhat.com> | 2007-10-10 03:56:12 -0400 |
commit | 1ad38c437fa33f85ba4b6a85ea8c5478ee72d5bd (patch) | |
tree | 11a5fc7993ba9ae343fc72f03f9a11f312fd6128 /fs/gfs2/glops.c | |
parent | 0820ab517e1b100ee3f9584ec27f93309689ebe7 (diff) |
[GFS2] Clean up gfs2_trans_add_revoke()
The following alters gfs2_trans_add_revoke() to take a struct
gfs2_bufdata as an argument. This eliminates the memory allocation which
was previously required by making use of the already existing struct
gfs2_bufdata. It makes some sanity checks to ensure that the
gfs2_bufdata has been removed from all the lists before its recycled as
a revoke structure. This saves one memory allocation and one free per
revoke structure.
Also as a result, and to simplify the locking, since there is no longer
any blocking code in gfs2_trans_add_revoke() we must hold the log lock
whenever this function is called. This reduces the amount of times we
take and unlock the log lock.
Signed-off-by: Steven Whitehouse <swhiteho@redhat.com>
Diffstat (limited to 'fs/gfs2/glops.c')
-rw-r--r-- | fs/gfs2/glops.c | 14 |
1 files changed, 5 insertions, 9 deletions
diff --git a/fs/gfs2/glops.c b/fs/gfs2/glops.c index b17346a355bf..4670dcb2a877 100644 --- a/fs/gfs2/glops.c +++ b/fs/gfs2/glops.c | |||
@@ -41,7 +41,6 @@ static void gfs2_ail_empty_gl(struct gfs2_glock *gl) | |||
41 | struct list_head *head = &gl->gl_ail_list; | 41 | struct list_head *head = &gl->gl_ail_list; |
42 | struct gfs2_bufdata *bd; | 42 | struct gfs2_bufdata *bd; |
43 | struct buffer_head *bh; | 43 | struct buffer_head *bh; |
44 | u64 blkno; | ||
45 | int error; | 44 | int error; |
46 | 45 | ||
47 | blocks = atomic_read(&gl->gl_ail_count); | 46 | blocks = atomic_read(&gl->gl_ail_count); |
@@ -57,15 +56,12 @@ static void gfs2_ail_empty_gl(struct gfs2_glock *gl) | |||
57 | bd = list_entry(head->next, struct gfs2_bufdata, | 56 | bd = list_entry(head->next, struct gfs2_bufdata, |
58 | bd_ail_gl_list); | 57 | bd_ail_gl_list); |
59 | bh = bd->bd_bh; | 58 | bh = bd->bd_bh; |
60 | blkno = bh->b_blocknr; | ||
61 | gfs2_assert_withdraw(sdp, !buffer_busy(bh)); | ||
62 | |||
63 | gfs2_remove_from_ail(NULL, bd); | 59 | gfs2_remove_from_ail(NULL, bd); |
64 | gfs2_log_unlock(sdp); | 60 | bd->bd_bh = NULL; |
65 | 61 | bh->b_private = NULL; | |
66 | gfs2_trans_add_revoke(sdp, blkno); | 62 | bd->bd_blkno = bh->b_blocknr; |
67 | 63 | gfs2_assert_withdraw(sdp, !buffer_busy(bh)); | |
68 | gfs2_log_lock(sdp); | 64 | gfs2_trans_add_revoke(sdp, bd); |
69 | } | 65 | } |
70 | gfs2_assert_withdraw(sdp, !atomic_read(&gl->gl_ail_count)); | 66 | gfs2_assert_withdraw(sdp, !atomic_read(&gl->gl_ail_count)); |
71 | gfs2_log_unlock(sdp); | 67 | gfs2_log_unlock(sdp); |