* [Cluster-devel] [GFS2 Patch] GFS2: Combine functions get_local_rgrp and gfs2_inplace_reserve [not found] <0f3f3633-893a-44c6-8a69-18482a0e71b3@zmail12.collab.prod.int.phx2.redhat.com> @ 2012-05-31 19:13 ` Bob Peterson 2012-06-08 11:17 ` Steven Whitehouse 0 siblings, 1 reply; 2+ messages in thread From: Bob Peterson @ 2012-05-31 19:13 UTC (permalink / raw) To: cluster-devel.redhat.com 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 <rpeterso@redhat.com> --- 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) ^ permalink raw reply related [flat|nested] 2+ messages in thread
* [Cluster-devel] [GFS2 Patch] GFS2: Combine functions get_local_rgrp and gfs2_inplace_reserve 2012-05-31 19:13 ` [Cluster-devel] [GFS2 Patch] GFS2: Combine functions get_local_rgrp and gfs2_inplace_reserve Bob Peterson @ 2012-06-08 11:17 ` Steven Whitehouse 0 siblings, 0 replies; 2+ messages in thread From: Steven Whitehouse @ 2012-06-08 11:17 UTC (permalink / raw) To: cluster-devel.redhat.com 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 <rpeterso@redhat.com> > --- > 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) > ^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2012-06-08 11:17 UTC | newest] Thread overview: 2+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- [not found] <0f3f3633-893a-44c6-8a69-18482a0e71b3@zmail12.collab.prod.int.phx2.redhat.com> 2012-05-31 19:13 ` [Cluster-devel] [GFS2 Patch] GFS2: Combine functions get_local_rgrp and gfs2_inplace_reserve Bob Peterson 2012-06-08 11:17 ` Steven Whitehouse
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).