提交 666d1d8a 编写于 作者: B Bob Peterson 提交者: Steven Whitehouse

GFS2: Combine functions get_local_rgrp and gfs2_inplace_reserve

This function combines rgrp functions get_local_rgrp and
gfs2_inplace_reserve so that the double retry loop is gone.
Signed-off-by: NBob Peterson <rpeterso@redhat.com>
Signed-off-by: NSteven Whitehouse <swhiteho@redhat.com>
上级 0d515210
...@@ -1207,25 +1207,30 @@ static void try_rgrp_unlink(struct gfs2_rgrpd *rgd, u64 *last_unlinked, u64 skip ...@@ -1207,25 +1207,30 @@ 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 * @ip: the inode to reserve space for
* @last_unlinked: the last unlinked block * @requested: the number of blocks to be reserved
*
* Try to acquire rgrp in way which avoids contending with others.
* *
* Returns: errno * 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_sbd *sdp = GFS2_SB(&ip->i_inode);
struct gfs2_rgrpd *rgd, *begin = NULL; struct gfs2_rgrpd *rgd, *begin = NULL;
struct gfs2_blkreserv *rs = ip->i_res; 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; int loops = 0;
if (sdp->sd_args.ar_rgrplvb) if (sdp->sd_args.ar_rgrplvb)
flags |= GL_SKIP; flags |= GL_SKIP;
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)) if (ip->i_rgd && rgrp_contains_block(ip->i_rgd, ip->i_goal))
rgd = begin = ip->i_rgd; rgd = begin = ip->i_rgd;
...@@ -1263,63 +1268,34 @@ static int get_local_rgrp(struct gfs2_inode *ip, u64 *last_unlinked) ...@@ -1263,63 +1268,34 @@ static int get_local_rgrp(struct gfs2_inode *ip, u64 *last_unlinked)
if (rgd->rd_flags & GFS2_RDF_CHECK) { if (rgd->rd_flags & GFS2_RDF_CHECK) {
if (sdp->sd_args.ar_rgrplvb) if (sdp->sd_args.ar_rgrplvb)
gfs2_rgrp_bh_get(rgd); gfs2_rgrp_bh_get(rgd);
try_rgrp_unlink(rgd, last_unlinked, ip->i_no_addr); try_rgrp_unlink(rgd, &last_unlinked,
ip->i_no_addr);
} }
if (!rg_locked) if (!rg_locked)
gfs2_glock_dq_uninit(&rs->rs_rgd_gh); gfs2_glock_dq_uninit(&rs->rs_rgd_gh);
/* fall through */ /* fall through */
case GLR_TRYFAILED: case GLR_TRYFAILED:
rgd = gfs2_rgrpd_get_next(rgd); rgd = gfs2_rgrpd_get_next(rgd);
if (rgd == begin) { if (rgd != begin) /* If we didn't wrap */
flags &= ~LM_FLAG_TRY; break;
loops++;
} flags &= ~LM_FLAG_TRY;
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; break;
default: default:
return error; goto out;
} }
} }
error = -ENOSPC;
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);
out: out:
if (error) if (error)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册