]> Pileus Git - ~andy/linux/commitdiff
[GFS2] Fix leak of gfs2_bufdata
authorSteven Whitehouse <swhiteho@redhat.com>
Fri, 18 Aug 2006 19:51:09 +0000 (15:51 -0400)
committerSteven Whitehouse <swhiteho@redhat.com>
Fri, 18 Aug 2006 19:51:09 +0000 (15:51 -0400)
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>
fs/gfs2/lops.c
fs/gfs2/meta_io.c
fs/gfs2/ops_address.c
fs/gfs2/ops_super.c

index af03bf380f46330c2c6ad691b7dfe6ed210ed712..04bceb75ff23bf9a010939458ac000452e2802ac 100644 (file)
@@ -464,7 +464,7 @@ static void databuf_lo_add(struct gfs2_sbd *sdp, struct gfs2_log_element *le)
        struct gfs2_inode *ip = GFS2_I(mapping->host);
 
        tr->tr_touched = 1;
-       if (!list_empty(&bd->bd_list_tr) &&
+       if (list_empty(&bd->bd_list_tr) &&
            (ip->i_di.di_flags & GFS2_DIF_JDATA)) {
                tr->tr_num_buf++;
                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)
        }
        gfs2_trans_add_gl(bd->bd_gl);
        gfs2_log_lock(sdp);
-       if (!list_empty(&le->le_list)) {
+       if (list_empty(&le->le_list)) {
                if (ip->i_di.di_flags & GFS2_DIF_JDATA)
                        sdp->sd_log_num_jdata++;
                sdp->sd_log_num_databuf++;
@@ -640,10 +640,10 @@ static void databuf_lo_before_commit(struct gfs2_sbd *sdp)
                                 bd_le.le_list);
                list_del(&bd1->bd_le.le_list);
                sdp->sd_log_num_databuf--;
-
                bh = bd1->bd_bh;
                if (bh) {
                        bh->b_private = NULL;
+                       get_bh(bh);
                        gfs2_log_unlock(sdp);
                        wait_on_buffer(bh);
                        brelse(bh);
index 42dfd32059bcf69c3384d7de21a5e370dc00a9ea..502864b241963eab02724a67ff11ea8d7d5f88bd 100644 (file)
@@ -464,7 +464,6 @@ void gfs2_attach_bufdata(struct gfs2_glock *gl, struct buffer_head *bh,
                lops_init_le(&bd->bd_le, &gfs2_buf_lops);
        } else {
                lops_init_le(&bd->bd_le, &gfs2_databuf_lops);
-               get_bh(bh);
        }
        bh->b_private = bd;
 
index 45afd0508689a4ef39174fae366f9db2b621db74..4c59cb1109953113c94dff32e4aa45b11e0d6bf6 100644 (file)
@@ -581,10 +581,8 @@ static void discard_buffer(struct gfs2_sbd *sdp, struct buffer_head *bh)
        if (bd) {
                bd->bd_bh = NULL;
                bh->b_private = NULL;
-               gfs2_log_unlock(sdp);
-               brelse(bh);
-       } else
-               gfs2_log_unlock(sdp);
+       }
+       gfs2_log_unlock(sdp);
 
        lock_buffer(bh);
        clear_buffer_dirty(bh);
@@ -598,7 +596,7 @@ static void discard_buffer(struct gfs2_sbd *sdp, struct buffer_head *bh)
 
 static void gfs2_invalidatepage(struct page *page, unsigned long offset)
 {
-       struct gfs2_sbd *sdp = page->mapping->host->i_sb->s_fs_info;
+       struct gfs2_sbd *sdp = GFS2_SB(page->mapping->host);
        struct buffer_head *head, *bh, *next;
        unsigned int curr_off = 0;
 
index 730c7228f6ad5134c4632ffb12e32fcccbd33858..2e392c994ab1110f69655f324f1012a14592f4fa 100644 (file)
@@ -216,8 +216,6 @@ static int gfs2_statfs(struct dentry *dentry, struct kstatfs *buf)
        if (error)
                return error;
 
-       memset(buf, 0, sizeof(struct kstatfs));
-
        buf->f_type = GFS2_MAGIC;
        buf->f_bsize = sdp->sd_sb.sb_bsize;
        buf->f_blocks = sc.sc_total;