[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