Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=ddf4b426aababdae4cb96326d7aeb9d119f42c50
Commit:     ddf4b426aababdae4cb96326d7aeb9d119f42c50
Parent:     afb853fb4eec380b492a3c369f837359359c28e8
Author:     Benjamin Marzinski <[EMAIL PROTECTED]>
AuthorDate: Fri Jun 1 14:21:38 2007 -0500
Committer:  Steven Whitehouse <[EMAIL PROTECTED]>
CommitDate: Mon Jul 9 08:23:08 2007 +0100

    [GFS2] fix jdata issues
    
    This is a patch for the first three issues of RHBZ #238162
    
    The first issue is that when you allocate a new page for a file, it will not
    start off uptodate. This makes sense, since you haven't written anything to 
that
    part of the file yet.  Unfortunately, gfs2_pin() checks to make sure that 
the
    buffers are uptodate.  The solution to this is to mark the buffers uptodate 
in
    gfs2_commit_write(), after they have been zeroed out and have the data 
written
    into them.  I'm pretty confident with this fix, although it's not completely
    obvious that there is no problem with marking the buffers uptodate here.
    
    The second issue is simply that you can try to pin a data buffer that is 
already
    on the incore log, and thus, already pinned. This patch checks to see if 
this
    buffer is already on the log, and exits databuf_lo_add() if it is, just like
    buf_lo_add() does.
    
    The third issue is that gfs2_log_flush() doesn't do it's block accounting
    correctly.  Both metadata and journaled data are logged, but 
gfs2_log_flush()
    only compares the number of metadata blocks with the number of blocks to 
commit
    to the ondisk journal.  This patch also counts the journaled data blocks.
    
    Signed-off-by: Benjamin Marzinski <[EMAIL PROTECTED]>
    Signed-off-by: Steven Whitehouse <[EMAIL PROTECTED]>
---
 fs/gfs2/log.c         |    2 +-
 fs/gfs2/lops.c        |    2 ++
 fs/gfs2/ops_address.c |    2 ++
 3 files changed, 5 insertions(+), 1 deletions(-)

diff --git a/fs/gfs2/log.c b/fs/gfs2/log.c
index 586923d..1fb846f 100644
--- a/fs/gfs2/log.c
+++ b/fs/gfs2/log.c
@@ -566,7 +566,7 @@ void gfs2_log_flush(struct gfs2_sbd *sdp, struct gfs2_glock 
*gl)
        INIT_LIST_HEAD(&ai->ai_ail1_list);
        INIT_LIST_HEAD(&ai->ai_ail2_list);
 
-       gfs2_assert_withdraw(sdp, sdp->sd_log_num_buf == 
sdp->sd_log_commited_buf);
+       gfs2_assert_withdraw(sdp, sdp->sd_log_num_buf + sdp->sd_log_num_jdata 
== sdp->sd_log_commited_buf);
        gfs2_assert_withdraw(sdp,
                        sdp->sd_log_num_revoke == sdp->sd_log_commited_revoke);
 
diff --git a/fs/gfs2/lops.c b/fs/gfs2/lops.c
index f82d84d..3e971f2 100644
--- a/fs/gfs2/lops.c
+++ b/fs/gfs2/lops.c
@@ -475,6 +475,8 @@ static void databuf_lo_add(struct gfs2_sbd *sdp, struct 
gfs2_log_element *le)
                tr->tr_num_buf++;
                list_add(&bd->bd_list_tr, &tr->tr_list_buf);
                gfs2_log_unlock(sdp);
+               if (!list_empty(&le->le_list))
+                       return;
                gfs2_pin(sdp, bd->bd_bh);
                tr->tr_num_buf_new++;
        } else {
diff --git a/fs/gfs2/ops_address.c b/fs/gfs2/ops_address.c
index fb84478..ac56595 100644
--- a/fs/gfs2/ops_address.c
+++ b/fs/gfs2/ops_address.c
@@ -50,6 +50,8 @@ static void gfs2_page_add_databufs(struct gfs2_inode *ip, 
struct page *page,
                end = start + bsize;
                if (end <= from || start >= to)
                        continue;
+               if (gfs2_is_jdata(ip))
+                       set_buffer_uptodate(bh);
                gfs2_trans_add_bh(ip->i_gl, bh, 0);
        }
 }
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to