From mboxrd@z Thu Jan 1 00:00:00 1970 From: Steven Whitehouse Date: Fri, 08 Jun 2012 12:17:57 +0100 Subject: [Cluster-devel] [GFS2 Patch] GFS2: Combine functions get_local_rgrp and gfs2_inplace_reserve In-Reply-To: <70bf3f65-0131-4506-90ba-cfcdfe5e6631@zmail12.collab.prod.int.phx2.redhat.com> References: <70bf3f65-0131-4506-90ba-cfcdfe5e6631@zmail12.collab.prod.int.phx2.redhat.com> Message-ID: <1339154277.2752.11.camel@menhir> List-Id: To: cluster-devel.redhat.com MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Hi, Can you send me an updated version of this as it will not apply after I've applied Ben's lvb patch, Steve. On Thu, 2012-05-31 at 15:13 -0400, Bob Peterson wrote: > Hi, > > This patch combines rgrp functions get_local_rgrp and > gfs2_inplace_reserve so that the double retry loop is gone. > > Regards, > > Bob Peterson > Red Hat File Systems > > Signed-off-by: Bob Peterson > --- > diff --git a/fs/gfs2/rgrp.c b/fs/gfs2/rgrp.c > index 9eca6a9..206b0d2 100644 > --- a/fs/gfs2/rgrp.c > +++ b/fs/gfs2/rgrp.c > @@ -1099,23 +1099,29 @@ static void try_rgrp_unlink(struct gfs2_rgrpd *rgd, u64 *last_unlinked, u64 skip > } > > /** > - * get_local_rgrp - Choose and lock a rgrp for allocation > + * gfs2_inplace_reserve - Reserve space in the filesystem > * @ip: the inode to reserve space for > - * @last_unlinked: the last unlinked block > - * > - * Try to acquire rgrp in way which avoids contending with others. > + * @requested: the number of blocks to be reserved > * > * Returns: errno > */ > > -static int get_local_rgrp(struct gfs2_inode *ip, u64 *last_unlinked) > +int gfs2_inplace_reserve(struct gfs2_inode *ip, u32 requested) > { > struct gfs2_sbd *sdp = GFS2_SB(&ip->i_inode); > struct gfs2_rgrpd *rgd, *begin = NULL; > struct gfs2_blkreserv *rs = ip->i_res; > - int error, rg_locked, flags = LM_FLAG_TRY; > + int error = 0, rg_locked, flags = LM_FLAG_TRY; > + u64 last_unlinked = NO_BLOCK; > int loops = 0; > > + rs = ip->i_res; > + rs->rs_requested = requested; > + if (gfs2_assert_warn(sdp, requested)) { > + error = -EINVAL; > + goto out; > + } > + > if (ip->i_rgd && rgrp_contains_block(ip->i_rgd, ip->i_goal)) > rgd = begin = ip->i_rgd; > else > @@ -1141,62 +1147,32 @@ static int get_local_rgrp(struct gfs2_inode *ip, u64 *last_unlinked) > return 0; > } > if (rgd->rd_flags & GFS2_RDF_CHECK) > - try_rgrp_unlink(rgd, last_unlinked, ip->i_no_addr); > + try_rgrp_unlink(rgd, &last_unlinked, ip->i_no_addr); > if (!rg_locked) > gfs2_glock_dq_uninit(&rs->rs_rgd_gh); > /* fall through */ > case GLR_TRYFAILED: > rgd = gfs2_rgrpd_get_next(rgd); > - if (rgd == begin) { > - flags = 0; > - loops++; > - } > + if (rgd != begin) /* If we didn't wrap */ > + break; > + > + flags = 0; > + loops++; > + /* Check that fs hasn't grown if writing to rindex */ > + if (ip == GFS2_I(sdp->sd_rindex) && > + !sdp->sd_rindex_uptodate) { > + error = gfs2_ri_update(ip); > + if (error) > + goto out; > + } else if (loops == 2) > + /* Flushing the log may release space */ > + gfs2_log_flush(sdp, NULL); > break; > default: > - return error; > + goto out; > } > } > - > - return -ENOSPC; > -} > - > -/** > - * gfs2_inplace_reserve - Reserve space in the filesystem > - * @ip: the inode to reserve space for > - * @requested: the number of blocks to be reserved > - * > - * Returns: errno > - */ > - > -int gfs2_inplace_reserve(struct gfs2_inode *ip, u32 requested) > -{ > - struct gfs2_sbd *sdp = GFS2_SB(&ip->i_inode); > - struct gfs2_blkreserv *rs; > - int error = 0; > - u64 last_unlinked = NO_BLOCK; > - int tries = 0; > - > - rs = ip->i_res; > - rs->rs_requested = requested; > - if (gfs2_assert_warn(sdp, requested)) { > - error = -EINVAL; > - goto out; > - } > - > - do { > - error = get_local_rgrp(ip, &last_unlinked); > - if (error != -ENOSPC) > - break; > - /* Check that fs hasn't grown if writing to rindex */ > - if (ip == GFS2_I(sdp->sd_rindex) && !sdp->sd_rindex_uptodate) { > - error = gfs2_ri_update(ip); > - if (error) > - break; > - continue; > - } > - /* Flushing the log may release space */ > - gfs2_log_flush(sdp, NULL); > - } while (tries++ < 3); > + error = -ENOSPC; > > out: > if (error) >