xfs: fix bogus minleft manipulations
We can't just set minleft to 0 when we're low on space - that's exactly what we need minleft for: to protect space in the AG for btree block allocations when we are low on free space. Signed-off-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Brian Foster <bfoster@redhat.com> Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
This commit is contained in:
parent
5149fd327f
commit
255c516278
|
@ -2635,12 +2635,10 @@ xfs_alloc_vextent(
|
|||
xfs_agblock_t agsize; /* allocation group size */
|
||||
int error;
|
||||
int flags; /* XFS_ALLOC_FLAG_... locking flags */
|
||||
xfs_extlen_t minleft;/* minimum left value, temp copy */
|
||||
xfs_mount_t *mp; /* mount structure pointer */
|
||||
xfs_agnumber_t sagno; /* starting allocation group number */
|
||||
xfs_alloctype_t type; /* input allocation type */
|
||||
int bump_rotor = 0;
|
||||
int no_min = 0;
|
||||
xfs_agnumber_t rotorstep = xfs_rotorstep; /* inode32 agf stepper */
|
||||
|
||||
mp = args->mp;
|
||||
|
@ -2669,7 +2667,6 @@ xfs_alloc_vextent(
|
|||
trace_xfs_alloc_vextent_badargs(args);
|
||||
return 0;
|
||||
}
|
||||
minleft = args->minleft;
|
||||
|
||||
switch (type) {
|
||||
case XFS_ALLOCTYPE_THIS_AG:
|
||||
|
@ -2680,9 +2677,7 @@ xfs_alloc_vextent(
|
|||
*/
|
||||
args->agno = XFS_FSB_TO_AGNO(mp, args->fsbno);
|
||||
args->pag = xfs_perag_get(mp, args->agno);
|
||||
args->minleft = 0;
|
||||
error = xfs_alloc_fix_freelist(args, 0);
|
||||
args->minleft = minleft;
|
||||
if (error) {
|
||||
trace_xfs_alloc_vextent_nofix(args);
|
||||
goto error0;
|
||||
|
@ -2747,9 +2742,7 @@ xfs_alloc_vextent(
|
|||
*/
|
||||
for (;;) {
|
||||
args->pag = xfs_perag_get(mp, args->agno);
|
||||
if (no_min) args->minleft = 0;
|
||||
error = xfs_alloc_fix_freelist(args, flags);
|
||||
args->minleft = minleft;
|
||||
if (error) {
|
||||
trace_xfs_alloc_vextent_nofix(args);
|
||||
goto error0;
|
||||
|
@ -2789,20 +2782,17 @@ xfs_alloc_vextent(
|
|||
* or switch to non-trylock mode.
|
||||
*/
|
||||
if (args->agno == sagno) {
|
||||
if (no_min == 1) {
|
||||
if (flags == 0) {
|
||||
args->agbno = NULLAGBLOCK;
|
||||
trace_xfs_alloc_vextent_allfailed(args);
|
||||
break;
|
||||
}
|
||||
if (flags == 0) {
|
||||
no_min = 1;
|
||||
} else {
|
||||
flags = 0;
|
||||
if (type == XFS_ALLOCTYPE_START_BNO) {
|
||||
args->agbno = XFS_FSB_TO_AGBNO(mp,
|
||||
args->fsbno);
|
||||
args->type = XFS_ALLOCTYPE_NEAR_BNO;
|
||||
}
|
||||
|
||||
flags = 0;
|
||||
if (type == XFS_ALLOCTYPE_START_BNO) {
|
||||
args->agbno = XFS_FSB_TO_AGBNO(mp,
|
||||
args->fsbno);
|
||||
args->type = XFS_ALLOCTYPE_NEAR_BNO;
|
||||
}
|
||||
}
|
||||
xfs_perag_put(args->pag);
|
||||
|
|
|
@ -3812,7 +3812,6 @@ xfs_bmap_btalloc(
|
|||
args.fsbno = 0;
|
||||
args.type = XFS_ALLOCTYPE_FIRST_AG;
|
||||
args.total = ap->minlen;
|
||||
args.minleft = 0;
|
||||
if ((error = xfs_alloc_vextent(&args)))
|
||||
return error;
|
||||
ap->dfops->dop_low = true;
|
||||
|
@ -4344,8 +4343,6 @@ xfs_bmapi_allocate(
|
|||
if (error)
|
||||
return error;
|
||||
|
||||
if (bma->dfops->dop_low)
|
||||
bma->minleft = 0;
|
||||
if (bma->cur)
|
||||
bma->cur->bc_private.b.firstblock = *bma->firstblock;
|
||||
if (bma->blkno == NULLFSBLOCK)
|
||||
|
|
|
@ -502,12 +502,11 @@ try_another_ag:
|
|||
if (args.fsbno == NULLFSBLOCK && args.minleft) {
|
||||
/*
|
||||
* Could not find an AG with enough free space to satisfy
|
||||
* a full btree split. Try again without minleft and if
|
||||
* a full btree split. Try again and if
|
||||
* successful activate the lowspace algorithm.
|
||||
*/
|
||||
args.fsbno = 0;
|
||||
args.type = XFS_ALLOCTYPE_FIRST_AG;
|
||||
args.minleft = 0;
|
||||
error = xfs_alloc_vextent(&args);
|
||||
if (error)
|
||||
goto error0;
|
||||
|
|
Loading…
Reference in New Issue