Commit 255c5162 authored by Christoph Hellwig's avatar Christoph Hellwig Committed by Darrick J. Wong

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: default avatarChristoph Hellwig <hch@lst.de>
Reviewed-by: default avatarBrian Foster <bfoster@redhat.com>
Signed-off-by: default avatarDarrick J. Wong <darrick.wong@oracle.com>
parent 5149fd32
...@@ -2635,12 +2635,10 @@ xfs_alloc_vextent( ...@@ -2635,12 +2635,10 @@ xfs_alloc_vextent(
xfs_agblock_t agsize; /* allocation group size */ xfs_agblock_t agsize; /* allocation group size */
int error; int error;
int flags; /* XFS_ALLOC_FLAG_... locking flags */ int flags; /* XFS_ALLOC_FLAG_... locking flags */
xfs_extlen_t minleft;/* minimum left value, temp copy */
xfs_mount_t *mp; /* mount structure pointer */ xfs_mount_t *mp; /* mount structure pointer */
xfs_agnumber_t sagno; /* starting allocation group number */ xfs_agnumber_t sagno; /* starting allocation group number */
xfs_alloctype_t type; /* input allocation type */ xfs_alloctype_t type; /* input allocation type */
int bump_rotor = 0; int bump_rotor = 0;
int no_min = 0;
xfs_agnumber_t rotorstep = xfs_rotorstep; /* inode32 agf stepper */ xfs_agnumber_t rotorstep = xfs_rotorstep; /* inode32 agf stepper */
mp = args->mp; mp = args->mp;
...@@ -2669,7 +2667,6 @@ xfs_alloc_vextent( ...@@ -2669,7 +2667,6 @@ xfs_alloc_vextent(
trace_xfs_alloc_vextent_badargs(args); trace_xfs_alloc_vextent_badargs(args);
return 0; return 0;
} }
minleft = args->minleft;
switch (type) { switch (type) {
case XFS_ALLOCTYPE_THIS_AG: case XFS_ALLOCTYPE_THIS_AG:
...@@ -2680,9 +2677,7 @@ xfs_alloc_vextent( ...@@ -2680,9 +2677,7 @@ xfs_alloc_vextent(
*/ */
args->agno = XFS_FSB_TO_AGNO(mp, args->fsbno); args->agno = XFS_FSB_TO_AGNO(mp, args->fsbno);
args->pag = xfs_perag_get(mp, args->agno); args->pag = xfs_perag_get(mp, args->agno);
args->minleft = 0;
error = xfs_alloc_fix_freelist(args, 0); error = xfs_alloc_fix_freelist(args, 0);
args->minleft = minleft;
if (error) { if (error) {
trace_xfs_alloc_vextent_nofix(args); trace_xfs_alloc_vextent_nofix(args);
goto error0; goto error0;
...@@ -2747,9 +2742,7 @@ xfs_alloc_vextent( ...@@ -2747,9 +2742,7 @@ xfs_alloc_vextent(
*/ */
for (;;) { for (;;) {
args->pag = xfs_perag_get(mp, args->agno); args->pag = xfs_perag_get(mp, args->agno);
if (no_min) args->minleft = 0;
error = xfs_alloc_fix_freelist(args, flags); error = xfs_alloc_fix_freelist(args, flags);
args->minleft = minleft;
if (error) { if (error) {
trace_xfs_alloc_vextent_nofix(args); trace_xfs_alloc_vextent_nofix(args);
goto error0; goto error0;
...@@ -2789,20 +2782,17 @@ xfs_alloc_vextent( ...@@ -2789,20 +2782,17 @@ xfs_alloc_vextent(
* or switch to non-trylock mode. * or switch to non-trylock mode.
*/ */
if (args->agno == sagno) { if (args->agno == sagno) {
if (no_min == 1) { if (flags == 0) {
args->agbno = NULLAGBLOCK; args->agbno = NULLAGBLOCK;
trace_xfs_alloc_vextent_allfailed(args); trace_xfs_alloc_vextent_allfailed(args);
break; break;
} }
if (flags == 0) {
no_min = 1; flags = 0;
} else { if (type == XFS_ALLOCTYPE_START_BNO) {
flags = 0; args->agbno = XFS_FSB_TO_AGBNO(mp,
if (type == XFS_ALLOCTYPE_START_BNO) { args->fsbno);
args->agbno = XFS_FSB_TO_AGBNO(mp, args->type = XFS_ALLOCTYPE_NEAR_BNO;
args->fsbno);
args->type = XFS_ALLOCTYPE_NEAR_BNO;
}
} }
} }
xfs_perag_put(args->pag); xfs_perag_put(args->pag);
......
...@@ -3812,7 +3812,6 @@ xfs_bmap_btalloc( ...@@ -3812,7 +3812,6 @@ xfs_bmap_btalloc(
args.fsbno = 0; args.fsbno = 0;
args.type = XFS_ALLOCTYPE_FIRST_AG; args.type = XFS_ALLOCTYPE_FIRST_AG;
args.total = ap->minlen; args.total = ap->minlen;
args.minleft = 0;
if ((error = xfs_alloc_vextent(&args))) if ((error = xfs_alloc_vextent(&args)))
return error; return error;
ap->dfops->dop_low = true; ap->dfops->dop_low = true;
...@@ -4344,8 +4343,6 @@ xfs_bmapi_allocate( ...@@ -4344,8 +4343,6 @@ xfs_bmapi_allocate(
if (error) if (error)
return error; return error;
if (bma->dfops->dop_low)
bma->minleft = 0;
if (bma->cur) if (bma->cur)
bma->cur->bc_private.b.firstblock = *bma->firstblock; bma->cur->bc_private.b.firstblock = *bma->firstblock;
if (bma->blkno == NULLFSBLOCK) if (bma->blkno == NULLFSBLOCK)
......
...@@ -502,12 +502,11 @@ xfs_bmbt_alloc_block( ...@@ -502,12 +502,11 @@ xfs_bmbt_alloc_block(
if (args.fsbno == NULLFSBLOCK && args.minleft) { if (args.fsbno == NULLFSBLOCK && args.minleft) {
/* /*
* Could not find an AG with enough free space to satisfy * 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. * successful activate the lowspace algorithm.
*/ */
args.fsbno = 0; args.fsbno = 0;
args.type = XFS_ALLOCTYPE_FIRST_AG; args.type = XFS_ALLOCTYPE_FIRST_AG;
args.minleft = 0;
error = xfs_alloc_vextent(&args); error = xfs_alloc_vextent(&args);
if (error) if (error)
goto error0; goto error0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment