فهرست منبع

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>
Christoph Hellwig 9 سال پیش
والد
کامیت
255c516278
3فایلهای تغییر یافته به همراه8 افزوده شده و 22 حذف شده
  1. 7 17
      fs/xfs/libxfs/xfs_alloc.c
  2. 0 3
      fs/xfs/libxfs/xfs_bmap.c
  3. 1 2
      fs/xfs/libxfs/xfs_bmap_btree.c

+ 7 - 17
fs/xfs/libxfs/xfs_alloc.c

@@ -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(
 		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(
 		 */
 		 */
 		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(
 		 */
 		 */
 		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(
 			 * 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;
-				} 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);
 			xfs_perag_put(args->pag);

+ 0 - 3
fs/xfs/libxfs/xfs_bmap.c

@@ -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(
 	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)

+ 1 - 2
fs/xfs/libxfs/xfs_bmap_btree.c

@@ -502,12 +502,11 @@ try_another_ag:
 	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;