diff options
author | Steven Whitehouse <swhiteho@redhat.com> | 2006-08-18 15:51:09 -0400 |
---|---|---|
committer | Steven Whitehouse <swhiteho@redhat.com> | 2006-08-18 15:51:09 -0400 |
commit | 15d00c0b91ca776b51b5ab04f79ab35b06670d30 (patch) | |
tree | a970b4f59086ecbf7d20ec9b2201cf26b8446019 /fs/gfs2/ops_address.c | |
parent | fcc8abc8d4fcdbddc383091449f3696b411aa8fb (diff) |
[GFS2] Fix leak of gfs2_bufdata
This fixes a memory leak of struct gfs2_bufdata and also some
problems in the ordered write handling code. It needs a bit
more testing, but I believe that the reference counting of
ordered write buffers should now be correct.
This is aimed at fixing Red Hat bugzilla: #201028 and #201082
Signed-off-by: Steven Whitehouse <swhiteho@redhat.com>
Diffstat (limited to 'fs/gfs2/ops_address.c')
-rw-r--r-- | fs/gfs2/ops_address.c | 8 |
1 files changed, 3 insertions, 5 deletions
diff --git a/fs/gfs2/ops_address.c b/fs/gfs2/ops_address.c index 45afd0508689..4c59cb110995 100644 --- a/fs/gfs2/ops_address.c +++ b/fs/gfs2/ops_address.c | |||
@@ -581,10 +581,8 @@ static void discard_buffer(struct gfs2_sbd *sdp, struct buffer_head *bh) | |||
581 | if (bd) { | 581 | if (bd) { |
582 | bd->bd_bh = NULL; | 582 | bd->bd_bh = NULL; |
583 | bh->b_private = NULL; | 583 | bh->b_private = NULL; |
584 | gfs2_log_unlock(sdp); | 584 | } |
585 | brelse(bh); | 585 | gfs2_log_unlock(sdp); |
586 | } else | ||
587 | gfs2_log_unlock(sdp); | ||
588 | 586 | ||
589 | lock_buffer(bh); | 587 | lock_buffer(bh); |
590 | clear_buffer_dirty(bh); | 588 | clear_buffer_dirty(bh); |
@@ -598,7 +596,7 @@ static void discard_buffer(struct gfs2_sbd *sdp, struct buffer_head *bh) | |||
598 | 596 | ||
599 | static void gfs2_invalidatepage(struct page *page, unsigned long offset) | 597 | static void gfs2_invalidatepage(struct page *page, unsigned long offset) |
600 | { | 598 | { |
601 | struct gfs2_sbd *sdp = page->mapping->host->i_sb->s_fs_info; | 599 | struct gfs2_sbd *sdp = GFS2_SB(page->mapping->host); |
602 | struct buffer_head *head, *bh, *next; | 600 | struct buffer_head *head, *bh, *next; |
603 | unsigned int curr_off = 0; | 601 | unsigned int curr_off = 0; |
604 | 602 | ||