From mboxrd@z Thu Jan 1 00:00:00 1970 From: Steven Whitehouse Date: Tue, 21 Sep 2010 16:36:19 +0100 Subject: [Cluster-devel] [PATCH] GFS2: reserve more blocks for transactions In-Reply-To: <20100921145852.GA7185@ether.msp.redhat.com> References: <20100921145852.GA7185@ether.msp.redhat.com> Message-ID: <1285083379.2445.27.camel@dolmen> List-Id: To: cluster-devel.redhat.com MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Hi, On Tue, 2010-09-21 at 09:58 -0500, Benjamin Marzinski wrote: > Some of the functions in GFS2 were not reserving space in the transaction for > the resource group header and the resource groups bitblocks that get added > when you do allocation. GFS2 now makes sure to reserve space for the > resource group header and either all the bitblocks in the resource group, or > one for each block that it may allocate, whichever is smaller. > > Signed-off-by: Benjamin Marzinski > --- > fs/gfs2/aops.c | 3 +++ > fs/gfs2/bmap.c | 2 +- > fs/gfs2/file.c | 5 ++++- > fs/gfs2/quota.c | 2 ++ > 4 files changed, 10 insertions(+), 2 deletions(-) > > Index: gfs2-2.6-nmw/fs/gfs2/aops.c > =================================================================== > --- gfs2-2.6-nmw.orig/fs/gfs2/aops.c > +++ gfs2-2.6-nmw/fs/gfs2/aops.c > @@ -663,6 +663,9 @@ static int gfs2_write_begin(struct file > rblocks += RES_STATFS + RES_QUOTA; > if (&ip->i_inode == sdp->sd_rindex) > rblocks += 2 * RES_STATFS; > + if (alloc_required) > + rblocks += (al->al_requested < al->al_rgd->rd_length)? > + al->al_requested + 1 : al->al_rgd->rd_length; Since this bit seems to occur multiple times, perhaps you could turn it into an inline function with a suitably explanatory name? That should make it a bit easier to understand what it is doing, Steve. > > error = gfs2_trans_begin(sdp, rblocks, > PAGE_CACHE_SIZE/sdp->sd_sb.sb_bsize); > Index: gfs2-2.6-nmw/fs/gfs2/bmap.c > =================================================================== > --- gfs2-2.6-nmw.orig/fs/gfs2/bmap.c > +++ gfs2-2.6-nmw/fs/gfs2/bmap.c > @@ -1151,7 +1151,7 @@ static int do_grow(struct inode *inode, > goto do_grow_qunlock; > } > > - error = gfs2_trans_begin(sdp, RES_DINODE + 1, 0); > + error = gfs2_trans_begin(sdp, RES_DINODE + RES_STATFS + RES_RG_BIT, 0); > if (error) > goto do_grow_release; > > Index: gfs2-2.6-nmw/fs/gfs2/file.c > =================================================================== > --- gfs2-2.6-nmw.orig/fs/gfs2/file.c > +++ gfs2-2.6-nmw/fs/gfs2/file.c > @@ -382,8 +382,11 @@ static int gfs2_page_mkwrite(struct vm_a > rblocks = RES_DINODE + ind_blocks; > if (gfs2_is_jdata(ip)) > rblocks += data_blocks ? data_blocks : 1; > - if (ind_blocks || data_blocks) > + if (ind_blocks || data_blocks) { > rblocks += RES_STATFS + RES_QUOTA; > + rblocks += (al->al_requested < al->al_rgd->rd_length)? > + al->al_requested + 1 : al->al_rgd->rd_length; > + } > ret = gfs2_trans_begin(sdp, rblocks, 0); > if (ret) > goto out_trans_fail; > Index: gfs2-2.6-nmw/fs/gfs2/quota.c > =================================================================== > --- gfs2-2.6-nmw.orig/fs/gfs2/quota.c > +++ gfs2-2.6-nmw/fs/gfs2/quota.c > @@ -1586,6 +1586,8 @@ static int gfs2_set_dqblk(struct super_b > error = gfs2_inplace_reserve(ip); > if (error) > goto out_alloc; > + blocks += (al->al_requested < al->al_rgd->rd_length)? > + al->al_requested + 1 : al->al_rgd->rd_length; > } > > error = gfs2_trans_begin(sdp, blocks + RES_DINODE + 1, 0); >