]> err.no Git - linux-2.6/blobdiff - fs/gfs2/lops.c
[GFS2] Fix to list_del in lops.c
[linux-2.6] / fs / gfs2 / lops.c
index a76f1a778920089d831eefebe3655a86b7d2a408..82dfc96c4f599b992fda6e2796921fb6d0d47c48 100644 (file)
@@ -464,16 +464,16 @@ 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++;
-               gfs2_trans_add_gl(bd->bd_gl);
                list_add(&bd->bd_list_tr, &tr->tr_list_buf);
                gfs2_pin(sdp, bd->bd_bh);
                tr->tr_num_buf_new++;
        }
+       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++;
@@ -638,19 +638,19 @@ static void databuf_lo_before_commit(struct gfs2_sbd *sdp)
                gfs2_log_lock(sdp);
                bd1 = list_entry(started.next, struct gfs2_bufdata,
                                 bd_le.le_list);
-               list_del(&bd1->bd_le.le_list);
+               list_del_init(&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);
                } else
                        gfs2_log_unlock(sdp);
 
-               kfree(bd1);
+               kmem_cache_free(gfs2_bufdata_cachep, bd1);
        }
 
        /* We've removed all the ordered write bufs here, so only jdata left */