aboutsummaryrefslogtreecommitdiffstats
path: root/fs/gfs2/lops.c
diff options
context:
space:
mode:
authorSteven Whitehouse <swhiteho@redhat.com>2006-08-18 15:51:09 -0400
committerSteven Whitehouse <swhiteho@redhat.com>2006-08-18 15:51:09 -0400
commit15d00c0b91ca776b51b5ab04f79ab35b06670d30 (patch)
treea970b4f59086ecbf7d20ec9b2201cf26b8446019 /fs/gfs2/lops.c
parentfcc8abc8d4fcdbddc383091449f3696b411aa8fb (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/lops.c')
-rw-r--r--fs/gfs2/lops.c6
1 files changed, 3 insertions, 3 deletions
diff --git a/fs/gfs2/lops.c b/fs/gfs2/lops.c
index af03bf380f46..04bceb75ff23 100644
--- a/fs/gfs2/lops.c
+++ b/fs/gfs2/lops.c
@@ -464,7 +464,7 @@ static void databuf_lo_add(struct gfs2_sbd *sdp, struct gfs2_log_element *le)
464 struct gfs2_inode *ip = GFS2_I(mapping->host); 464 struct gfs2_inode *ip = GFS2_I(mapping->host);
465 465
466 tr->tr_touched = 1; 466 tr->tr_touched = 1;
467 if (!list_empty(&bd->bd_list_tr) && 467 if (list_empty(&bd->bd_list_tr) &&
468 (ip->i_di.di_flags & GFS2_DIF_JDATA)) { 468 (ip->i_di.di_flags & GFS2_DIF_JDATA)) {
469 tr->tr_num_buf++; 469 tr->tr_num_buf++;
470 list_add(&bd->bd_list_tr, &tr->tr_list_buf); 470 list_add(&bd->bd_list_tr, &tr->tr_list_buf);
@@ -473,7 +473,7 @@ static void databuf_lo_add(struct gfs2_sbd *sdp, struct gfs2_log_element *le)
473 } 473 }
474 gfs2_trans_add_gl(bd->bd_gl); 474 gfs2_trans_add_gl(bd->bd_gl);
475 gfs2_log_lock(sdp); 475 gfs2_log_lock(sdp);
476 if (!list_empty(&le->le_list)) { 476 if (list_empty(&le->le_list)) {
477 if (ip->i_di.di_flags & GFS2_DIF_JDATA) 477 if (ip->i_di.di_flags & GFS2_DIF_JDATA)
478 sdp->sd_log_num_jdata++; 478 sdp->sd_log_num_jdata++;
479 sdp->sd_log_num_databuf++; 479 sdp->sd_log_num_databuf++;
@@ -640,10 +640,10 @@ static void databuf_lo_before_commit(struct gfs2_sbd *sdp)
640 bd_le.le_list); 640 bd_le.le_list);
641 list_del(&bd1->bd_le.le_list); 641 list_del(&bd1->bd_le.le_list);
642 sdp->sd_log_num_databuf--; 642 sdp->sd_log_num_databuf--;
643
644 bh = bd1->bd_bh; 643 bh = bd1->bd_bh;
645 if (bh) { 644 if (bh) {
646 bh->b_private = NULL; 645 bh->b_private = NULL;
646 get_bh(bh);
647 gfs2_log_unlock(sdp); 647 gfs2_log_unlock(sdp);
648 wait_on_buffer(bh); 648 wait_on_buffer(bh);
649 brelse(bh); 649 brelse(bh);