>From efc837e7d13dd81ea7f9b75919c00e0f98b6ddba Mon Sep 17 00:00:00 2001
From: Steven Whitehouse <[EMAIL PROTECTED]>
Date: Fri, 30 Nov 2007 14:14:51 +0000
Subject: [PATCH] [GFS2] Add bh_to_bufdata() function

This adds an inline function through which all accesses of
bh->b_private go for journaled data and metadata buffers.
A future patch will update this function so that its more
than just a dereference.

Signed-off-by: Steven Whitehouse <[EMAIL PROTECTED]>

diff --git a/fs/gfs2/incore.h b/fs/gfs2/incore.h
index 743ebba..4030e30 100644
--- a/fs/gfs2/incore.h
+++ b/fs/gfs2/incore.h
@@ -128,6 +128,11 @@ struct gfs2_bufdata {
        struct list_head bd_ail_gl_list;
 };
 
+static inline struct gfs2_bufdata *bh_to_bufdata(const struct buffer_head *bh)
+{
+       return bh->b_private;
+}
+
 struct gfs2_glock_operations {
        void (*go_xmote_th) (struct gfs2_glock *gl);
        void (*go_xmote_bh) (struct gfs2_glock *gl);
diff --git a/fs/gfs2/log.c b/fs/gfs2/log.c
index 9bece94..7fea147 100644
--- a/fs/gfs2/log.c
+++ b/fs/gfs2/log.c
@@ -504,7 +504,7 @@ struct buffer_head *gfs2_log_get_buf(struct gfs2_sbd *sdp)
 static void gfs2_fake_write_endio(struct buffer_head *bh, int uptodate)
 {
        struct buffer_head *real_bh = bh->b_private;
-       struct gfs2_bufdata *bd = real_bh->b_private;
+       struct gfs2_bufdata *bd = bh_to_bufdata(real_bh);
        struct gfs2_sbd *sdp = bd->bd_gl->gl_sbd;
 
        end_buffer_write_sync(bh, uptodate);
diff --git a/fs/gfs2/lops.c b/fs/gfs2/lops.c
index 6b6ae8a..ceae8cf 100644
--- a/fs/gfs2/lops.c
+++ b/fs/gfs2/lops.c
@@ -45,7 +45,7 @@ static void gfs2_pin(struct gfs2_sbd *sdp, struct buffer_head 
*bh)
                gfs2_assert_withdraw(sdp, 0);
        if (!buffer_uptodate(bh))
                gfs2_io_error_bh(sdp, bh);
-       bd = bh->b_private;
+       bd = bh_to_bufdata(bh);
        /* If this buffer is in the AIL and it has already been written
         * to in-place disk block, remove it from the AIL.
         */
@@ -66,7 +66,7 @@ static void gfs2_pin(struct gfs2_sbd *sdp, struct buffer_head 
*bh)
 static void gfs2_unpin(struct gfs2_sbd *sdp, struct buffer_head *bh,
                       struct gfs2_ail *ai)
 {
-       struct gfs2_bufdata *bd = bh->b_private;
+       struct gfs2_bufdata *bd = bh_to_bufdata(bh);
        struct gfs2_glock *gl = bd->bd_gl;
 
        gfs2_assert_withdraw(sdp, buffer_uptodate(bh));
diff --git a/fs/gfs2/meta_io.c b/fs/gfs2/meta_io.c
index 9688785..7410514 100644
--- a/fs/gfs2/meta_io.c
+++ b/fs/gfs2/meta_io.c
@@ -277,7 +277,7 @@ void gfs2_attach_bufdata(struct gfs2_glock *gl, struct 
buffer_head *bh,
        if (meta)
                lock_page(bh->b_page);
 
-       if (bh->b_private) {
+       if (bh_to_bufdata(bh)) {
                if (meta)
                        unlock_page(bh->b_page);
                return;
@@ -301,7 +301,7 @@ void gfs2_attach_bufdata(struct gfs2_glock *gl, struct 
buffer_head *bh,
 void gfs2_remove_from_journal(struct buffer_head *bh, struct gfs2_trans *tr, 
int meta)
 {
        struct gfs2_sbd *sdp = GFS2_SB(bh->b_page->mapping->host);
-       struct gfs2_bufdata *bd = bh->b_private;
+       struct gfs2_bufdata *bd = bh_to_bufdata(bh);
        if (test_clear_buffer_pinned(bh)) {
                atomic_dec(&sdp->sd_log_pinned);
                list_del_init(&bd->bd_le.le_list);
diff --git a/fs/gfs2/ops_address.c b/fs/gfs2/ops_address.c
index 8f94e30..cf8ef9e 100644
--- a/fs/gfs2/ops_address.c
+++ b/fs/gfs2/ops_address.c
@@ -921,7 +921,7 @@ static void gfs2_discard(struct gfs2_sbd *sdp, struct 
buffer_head *bh)
        lock_buffer(bh);
        gfs2_log_lock(sdp);
        clear_buffer_dirty(bh);
-       bd = bh->b_private;
+       bd = bh_to_bufdata(bh);
        if (bd) {
                if (!list_empty(&bd->bd_le.le_list) && !buffer_pinned(bh))
                        list_del_init(&bd->bd_le.le_list);
@@ -1047,7 +1047,7 @@ int gfs2_releasepage(struct page *page, gfp_t gfp_mask)
        do {
                if (atomic_read(&bh->b_count))
                        goto cannot_release;
-               bd = bh->b_private;
+               bd = bh_to_bufdata(bh);
                if (bd && bd->bd_ail)
                        goto cannot_release;
                gfs2_assert_warn(sdp, !buffer_pinned(bh));
@@ -1059,7 +1059,7 @@ int gfs2_releasepage(struct page *page, gfp_t gfp_mask)
        head = bh = page_buffers(page);
        do {
                gfs2_log_lock(sdp);
-               bd = bh->b_private;
+               bd = bh_to_bufdata(bh);
                if (bd) {
                        gfs2_assert_warn(sdp, bd->bd_bh == bh);
                        gfs2_assert_warn(sdp, list_empty(&bd->bd_list_tr));
diff --git a/fs/gfs2/trans.c b/fs/gfs2/trans.c
index cebca7b..c1fdc1d 100644
--- a/fs/gfs2/trans.c
+++ b/fs/gfs2/trans.c
@@ -143,12 +143,12 @@ void gfs2_trans_add_bh(struct gfs2_glock *gl, struct 
buffer_head *bh, int meta)
        struct gfs2_sbd *sdp = gl->gl_sbd;
        struct gfs2_bufdata *bd;
 
-       bd = bh->b_private;
+       bd = bh_to_bufdata(bh);
        if (bd)
                gfs2_assert(sdp, bd->bd_gl == gl);
        else {
                gfs2_attach_bufdata(gl, bh, meta);
-               bd = bh->b_private;
+               bd = bh_to_bufdata(bh);
        }
        lops_add(sdp, &bd->bd_le);
 }
-- 
1.5.1.2



Reply via email to