xfs: simplify xfs_rtallocate_extent
We can deduce the allocation type from the bno argument, and do the return without prod much simpler internally. Signed-off-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com> [darrick: fix the macro for the non-rt build] Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
This commit is contained in:
parent
410d17f67e
commit
089ec2f875
3 changed files with 13 additions and 27 deletions
|
@ -88,7 +88,6 @@ int
|
||||||
xfs_bmap_rtalloc(
|
xfs_bmap_rtalloc(
|
||||||
struct xfs_bmalloca *ap) /* bmap alloc argument struct */
|
struct xfs_bmalloca *ap) /* bmap alloc argument struct */
|
||||||
{
|
{
|
||||||
xfs_alloctype_t atype = 0; /* type for allocation routines */
|
|
||||||
int error; /* error return value */
|
int error; /* error return value */
|
||||||
xfs_mount_t *mp; /* mount point structure */
|
xfs_mount_t *mp; /* mount point structure */
|
||||||
xfs_extlen_t prod = 0; /* product factor for allocators */
|
xfs_extlen_t prod = 0; /* product factor for allocators */
|
||||||
|
@ -155,18 +154,14 @@ xfs_bmap_rtalloc(
|
||||||
/*
|
/*
|
||||||
* Realtime allocation, done through xfs_rtallocate_extent.
|
* Realtime allocation, done through xfs_rtallocate_extent.
|
||||||
*/
|
*/
|
||||||
atype = ap->blkno == 0 ? XFS_ALLOCTYPE_ANY_AG : XFS_ALLOCTYPE_NEAR_BNO;
|
|
||||||
do_div(ap->blkno, mp->m_sb.sb_rextsize);
|
do_div(ap->blkno, mp->m_sb.sb_rextsize);
|
||||||
rtb = ap->blkno;
|
rtb = ap->blkno;
|
||||||
ap->length = ralen;
|
ap->length = ralen;
|
||||||
if ((error = xfs_rtallocate_extent(ap->tp, ap->blkno, 1, ap->length,
|
error = xfs_rtallocate_extent(ap->tp, ap->blkno, 1, ap->length,
|
||||||
&ralen, atype, ap->wasdel, prod, &rtb)))
|
&ralen, ap->wasdel, prod, &rtb);
|
||||||
return error;
|
if (error)
|
||||||
if (rtb == NULLFSBLOCK && prod > 1 &&
|
|
||||||
(error = xfs_rtallocate_extent(ap->tp, ap->blkno, 1,
|
|
||||||
ap->length, &ralen, atype,
|
|
||||||
ap->wasdel, 1, &rtb)))
|
|
||||||
return error;
|
return error;
|
||||||
|
|
||||||
ap->blkno = rtb;
|
ap->blkno = rtb;
|
||||||
if (ap->blkno != NULLFSBLOCK) {
|
if (ap->blkno != NULLFSBLOCK) {
|
||||||
ap->blkno *= mp->m_sb.sb_rextsize;
|
ap->blkno *= mp->m_sb.sb_rextsize;
|
||||||
|
|
|
@ -1093,7 +1093,6 @@ xfs_rtallocate_extent(
|
||||||
xfs_extlen_t minlen, /* minimum length to allocate */
|
xfs_extlen_t minlen, /* minimum length to allocate */
|
||||||
xfs_extlen_t maxlen, /* maximum length to allocate */
|
xfs_extlen_t maxlen, /* maximum length to allocate */
|
||||||
xfs_extlen_t *len, /* out: actual length allocated */
|
xfs_extlen_t *len, /* out: actual length allocated */
|
||||||
xfs_alloctype_t type, /* allocation type XFS_ALLOCTYPE... */
|
|
||||||
int wasdel, /* was a delayed allocation extent */
|
int wasdel, /* was a delayed allocation extent */
|
||||||
xfs_extlen_t prod, /* extent product factor */
|
xfs_extlen_t prod, /* extent product factor */
|
||||||
xfs_rtblock_t *rtblock) /* out: start block allocated */
|
xfs_rtblock_t *rtblock) /* out: start block allocated */
|
||||||
|
@ -1123,27 +1122,16 @@ xfs_rtallocate_extent(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
retry:
|
||||||
sumbp = NULL;
|
sumbp = NULL;
|
||||||
/*
|
if (bno == 0) {
|
||||||
* Allocate by size, or near another block, or exactly at some block.
|
|
||||||
*/
|
|
||||||
switch (type) {
|
|
||||||
case XFS_ALLOCTYPE_ANY_AG:
|
|
||||||
error = xfs_rtallocate_extent_size(mp, tp, minlen, maxlen, len,
|
error = xfs_rtallocate_extent_size(mp, tp, minlen, maxlen, len,
|
||||||
&sumbp, &sb, prod, &r);
|
&sumbp, &sb, prod, &r);
|
||||||
break;
|
} else {
|
||||||
case XFS_ALLOCTYPE_NEAR_BNO:
|
|
||||||
error = xfs_rtallocate_extent_near(mp, tp, bno, minlen, maxlen,
|
error = xfs_rtallocate_extent_near(mp, tp, bno, minlen, maxlen,
|
||||||
len, &sumbp, &sb, prod, &r);
|
len, &sumbp, &sb, prod, &r);
|
||||||
break;
|
|
||||||
case XFS_ALLOCTYPE_THIS_BNO:
|
|
||||||
error = xfs_rtallocate_extent_exact(mp, tp, bno, minlen, maxlen,
|
|
||||||
len, &sumbp, &sb, prod, &r);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
error = -EIO;
|
|
||||||
ASSERT(0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (error)
|
if (error)
|
||||||
return error;
|
return error;
|
||||||
|
|
||||||
|
@ -1158,7 +1146,11 @@ xfs_rtallocate_extent(
|
||||||
xfs_trans_mod_sb(tp, XFS_TRANS_SB_RES_FREXTENTS, -slen);
|
xfs_trans_mod_sb(tp, XFS_TRANS_SB_RES_FREXTENTS, -slen);
|
||||||
else
|
else
|
||||||
xfs_trans_mod_sb(tp, XFS_TRANS_SB_FREXTENTS, -slen);
|
xfs_trans_mod_sb(tp, XFS_TRANS_SB_FREXTENTS, -slen);
|
||||||
|
} else if (prod > 1) {
|
||||||
|
prod = 1;
|
||||||
|
goto retry;
|
||||||
}
|
}
|
||||||
|
|
||||||
*rtblock = r;
|
*rtblock = r;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -40,7 +40,6 @@ xfs_rtallocate_extent(
|
||||||
xfs_extlen_t minlen, /* minimum length to allocate */
|
xfs_extlen_t minlen, /* minimum length to allocate */
|
||||||
xfs_extlen_t maxlen, /* maximum length to allocate */
|
xfs_extlen_t maxlen, /* maximum length to allocate */
|
||||||
xfs_extlen_t *len, /* out: actual length allocated */
|
xfs_extlen_t *len, /* out: actual length allocated */
|
||||||
xfs_alloctype_t type, /* allocation type XFS_ALLOCTYPE... */
|
|
||||||
int wasdel, /* was a delayed allocation extent */
|
int wasdel, /* was a delayed allocation extent */
|
||||||
xfs_extlen_t prod, /* extent product factor */
|
xfs_extlen_t prod, /* extent product factor */
|
||||||
xfs_rtblock_t *rtblock); /* out: start block allocated */
|
xfs_rtblock_t *rtblock); /* out: start block allocated */
|
||||||
|
@ -122,7 +121,7 @@ int xfs_rtfree_range(struct xfs_mount *mp, struct xfs_trans *tp,
|
||||||
|
|
||||||
|
|
||||||
#else
|
#else
|
||||||
# define xfs_rtallocate_extent(t,b,min,max,l,a,f,p,rb) (ENOSYS)
|
# define xfs_rtallocate_extent(t,b,min,max,l,f,p,rb) (ENOSYS)
|
||||||
# define xfs_rtfree_extent(t,b,l) (ENOSYS)
|
# define xfs_rtfree_extent(t,b,l) (ENOSYS)
|
||||||
# define xfs_rtpick_extent(m,t,l,rb) (ENOSYS)
|
# define xfs_rtpick_extent(m,t,l,rb) (ENOSYS)
|
||||||
# define xfs_growfs_rt(mp,in) (ENOSYS)
|
# define xfs_growfs_rt(mp,in) (ENOSYS)
|
||||||
|
|
Loading…
Reference in a new issue