[Cluster-devel] [PATCH] GFS2: fix jdata issues
Steven Whitehouse
swhiteho at redhat.com
Mon Jun 4 08:49:32 UTC 2007
Hi,
Now applied to the -nmw git tree. Thanks,
Steve.
On Fri, 2007-06-01 at 14:21 -0500, Benjamin Marzinski wrote:
> 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 <bmarzins at redhat.com>
>
> plain text document attachment (238162_mostly_fixed.patch)
> diff -urpN --exclude='cscope.*' --exclude-from=gfs2-2.6-nmw-070530-clean/Documentation/dontdiff gfs2-2.6-nmw-070530-clean/fs/gfs2/log.c gfs2-2.6-nmw-070530/fs/gfs2/log.c
> --- gfs2-2.6-nmw-070530-clean/fs/gfs2/log.c 2007-06-01 08:33:35.000000000 -0500
> +++ gfs2-2.6-nmw-070530/fs/gfs2/log.c 2007-06-01 10:17:00.000000000 -0500
> @@ -565,7 +565,7 @@ void gfs2_log_flush(struct gfs2_sbd *sdp
> 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 -urpN --exclude='cscope.*' --exclude-from=gfs2-2.6-nmw-070530-clean/Documentation/dontdiff gfs2-2.6-nmw-070530-clean/fs/gfs2/lops.c gfs2-2.6-nmw-070530/fs/gfs2/lops.c
> --- gfs2-2.6-nmw-070530-clean/fs/gfs2/lops.c 2007-06-01 08:33:35.000000000 -0500
> +++ gfs2-2.6-nmw-070530/fs/gfs2/lops.c 2007-06-01 10:17:00.000000000 -0500
> @@ -475,6 +475,8 @@ static void databuf_lo_add(struct gfs2_s
> 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 -urpN --exclude='cscope.*' --exclude-from=gfs2-2.6-nmw-070530-clean/Documentation/dontdiff gfs2-2.6-nmw-070530-clean/fs/gfs2/ops_address.c gfs2-2.6-nmw-070530/fs/gfs2/ops_address.c
> --- gfs2-2.6-nmw-070530-clean/fs/gfs2/ops_address.c 2007-06-01 08:33:35.000000000 -0500
> +++ gfs2-2.6-nmw-070530/fs/gfs2/ops_address.c 2007-06-01 10:17:00.000000000 -0500
> @@ -50,6 +50,8 @@ static void gfs2_page_add_databufs(struc
> 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);
> }
> }
More information about the Cluster-devel
mailing list