From mboxrd@z Thu Jan 1 00:00:00 1970 From: Steven Whitehouse Date: Mon, 04 Jun 2007 09:49:32 +0100 Subject: [Cluster-devel] [PATCH] GFS2: fix jdata issues In-Reply-To: <20070601192137.GA8814@ether.msp.redhat.com> References: <20070601192137.GA8814@ether.msp.redhat.com> Message-ID: <1180946972.25918.116.camel@quoit> List-Id: To: cluster-devel.redhat.com MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit 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 > > 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); > } > }