Re: xfs: Assertion failed in xfs_ag_resv_init()

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Tue, Apr 30, 10:40, Darrick J. Wong wrote
> > With CONFIG_XFS_DEBUG=n the mount succeeded, and xfs_info says
> > 
> > 	meta-data=/dev/mapper/zeal-tst   isize=512    agcount=101, agsize=268435392 blks
> > 		 =                       sectsz=4096  attr=2, projid32bit=1
> > 		 =                       crc=1        finobt=1 spinodes=0 rmapbt=0
> > 		 =                       reflink=0
> > 	data     =                       bsize=4096   blocks=26843545600, imaxpct=1
> 
> Oh, wait, you have a 100T filesystem with a runt AG at the end due to
> the raid striping...
> 
> 26843545600 % 268435392 == 6400 blocks (in AG 100)
> 
> And that's why there's 6,392 free blocks in an AG and an attempted
> reservation of 267,367 blocks.

Jup, that nails it.

> In that case, the patch you want is c08768977b9 ("xfs: finobt AG
> reserves don't consider last AG can be a runt") which has not been
> backported to 4.9.  That patch relies on a function introduced in
> 21ec54168b36 ("xfs: create block pointer check functions") and moved to
> a different file in 86210fbebae6e ("xfs: move various type verifiers to
> common file").
> 
> The c087 patch which will generate appropriately sized reservations for
> the last AG if it is significantly smaller than the the other and should
> fix the assertion failure.

Great. Thanks a lot for digging out these commits.

Would you be willing to support backporting this commit to
4.9.x? IOW, something like the below (against 4.9.171) which puts
xfs_inobt_max_size() into libxfs/xfs_ialloc_btree.c. Seems to work
fine.

Best
Andre
---
commit f847bda4d612744ff1812788417bd8df41a806d3
Author: Dave Chinner <dchinner@xxxxxxxxxx>
Date:   Mon Nov 19 13:31:08 2018 -0800

    xfs: finobt AG reserves don't consider last AG can be a runt
    
    This is a backport of upstream commit c08768977b9 and the part of
    21ec54168b36 which is needed by c08768977b9.
    
    Suggested-by: Darrick J. Wong <darrick.wong@xxxxxxxxxx>
    Tested-by: Andre Noll <maan@xxxxxxxxxxxxxxxx>

diff --git a/fs/xfs/libxfs/xfs_ialloc_btree.c b/fs/xfs/libxfs/xfs_ialloc_btree.c
index b9c351ff0422..33905989929e 100644
--- a/fs/xfs/libxfs/xfs_ialloc_btree.c
+++ b/fs/xfs/libxfs/xfs_ialloc_btree.c
@@ -502,17 +502,33 @@ xfs_inobt_rec_check_count(
 }
 #endif	/* DEBUG */
 
+/* Find the size of the AG, in blocks. */
+static xfs_agblock_t
+xfs_ag_block_count(
+	struct xfs_mount	*mp,
+	xfs_agnumber_t		agno)
+{
+	ASSERT(agno < mp->m_sb.sb_agcount);
+
+	if (agno < mp->m_sb.sb_agcount - 1)
+		return mp->m_sb.sb_agblocks;
+	return mp->m_sb.sb_dblocks - (agno * mp->m_sb.sb_agblocks);
+}
+
 static xfs_extlen_t
 xfs_inobt_max_size(
-	struct xfs_mount	*mp)
+	struct xfs_mount	*mp,
+	xfs_agnumber_t		agno)
 {
+	xfs_agblock_t		agblocks = xfs_ag_block_count(mp, agno);
+
 	/* Bail out if we're uninitialized, which can happen in mkfs. */
 	if (mp->m_inobt_mxr[0] == 0)
 		return 0;
 
 	return xfs_btree_calc_size(mp, mp->m_inobt_mnr,
-		(uint64_t)mp->m_sb.sb_agblocks * mp->m_sb.sb_inopblock /
-				XFS_INODES_PER_CHUNK);
+				(uint64_t)agblocks * mp->m_sb.sb_inopblock /
+					XFS_INODES_PER_CHUNK);
 }
 
 static int
@@ -558,7 +574,7 @@ xfs_finobt_calc_reserves(
 	if (error)
 		return error;
 
-	*ask += xfs_inobt_max_size(mp);
+	*ask += xfs_inobt_max_size(mp, agno);
 	*used += tree_len;
 	return 0;
 }
-- 
Max Planck Institute for Developmental Biology
Max-Planck-Ring 5, 72076 Tübingen, Germany. Phone: (+49) 7071 601 829
http://people.tuebingen.mpg.de/maan/

Attachment: signature.asc
Description: PGP signature


[Index of Archives]     [XFS Filesystem Development (older mail)]     [Linux Filesystem Development]     [Linux Audio Users]     [Yosemite Trails]     [Linux Kernel]     [Linux RAID]     [Linux SCSI]


  Powered by Linux