|
@@ -258,6 +258,7 @@ void gfs2_remove_from_journal(struct buffer_head *bh, struct gfs2_trans *tr, int
|
|
|
struct address_space *mapping = bh->b_page->mapping;
|
|
|
struct gfs2_sbd *sdp = gfs2_mapping2sbd(mapping);
|
|
|
struct gfs2_bufdata *bd = bh->b_private;
|
|
|
+ int was_pinned = 0;
|
|
|
|
|
|
if (test_clear_buffer_pinned(bh)) {
|
|
|
trace_gfs2_pin(bd, 0);
|
|
@@ -273,12 +274,16 @@ void gfs2_remove_from_journal(struct buffer_head *bh, struct gfs2_trans *tr, int
|
|
|
tr->tr_num_databuf_rm++;
|
|
|
}
|
|
|
tr->tr_touched = 1;
|
|
|
+ was_pinned = 1;
|
|
|
brelse(bh);
|
|
|
}
|
|
|
if (bd) {
|
|
|
spin_lock(&sdp->sd_ail_lock);
|
|
|
if (bd->bd_tr) {
|
|
|
gfs2_trans_add_revoke(sdp, bd);
|
|
|
+ } else if (was_pinned) {
|
|
|
+ bh->b_private = NULL;
|
|
|
+ kmem_cache_free(gfs2_bufdata_cachep, bd);
|
|
|
}
|
|
|
spin_unlock(&sdp->sd_ail_lock);
|
|
|
}
|