[Bug 210535] [xfstests generic/466] XFS: Assertion failed: next_agino == irec->ir_startino + XFS_INODES_PER_CHUNK, file: fs/xfs/xfs_iwalk.c, line: 366

bugzilla-daemon
2020-12-08T17:14:23Z

--- Comment #5 from Zorro Lang (zlang@redhat.com) ---
(In reply to darrick.wong from comment #3)
> On Mon, Dec 07, 2020 at 05:14:26PM +0000,
> bugzilla-daemon@bugzilla.kernel.org wrote:
> > https://bugzilla.kernel.org/show_bug.cgi?id=210535
> >
> > Bug ID: 210535
> > Summary: [xfstests generic/466] XFS: Assertion failed:
> > next_agino == irec->ir_startino +
> > XFS_INODES_PER_CHUNK, file: fs/xfs/xfs_iwalk.c, line:
> > 366
> > Product: File System
> > Version: 2.5
> > Kernel Version: xfs-linux xfs-5.10-fixes-7
> > Hardware: All
> > OS: Linux
> > Tree: Mainline
> > Status: NEW
> > Severity: normal
> > Priority: P1
> > Component: XFS
> > Assignee: filesystem_xfs@kernel-bugs.kernel.org
> > Reporter: zlang@redhat.com
> > Regression: No
> >
> > Created attachment 294021 [details]
> > --> https://bugzilla.kernel.org/attachment.cgi?id=294021&action=edit
> > generic-466.full
> >
> > xfstests generic/466 hit below assertion failure on power9 ppc64le:
> >
> > [16404.196161] XFS: Assertion failed: next_agino == irec->ir_startino +
> > XFS_INODES_PER_CHUNK, file: fs/xfs/xfs_iwalk.c, line: 366
>
> Does this patch fix it?
>
> --D
>
> From: Darrick J. Wong <darrick.wong@oracle.com>
> Subject: [PATCH] xfs: fix the forward progress assertion in
> xfs_iwalk_run_callbacks
>
> In commit 27c14b5daa82 we started tracking the last inode seen during an
> inode walk to avoid infinite loops if a corrupt inobt record happens to
> have a lower ir_startino than the record preceeding it. Unfortunately,
> the assertion trips over the case where there are completely empty inobt
> records (which can happen quite easily on 64k page filesystems) because
> we advance the tracking cursor without actually putting the empty record
> into the processing buffer. Fix the assert to allow for this case.
>
> Reported-by: zlang@redhat.com
> Fixes: 27c14b5daa82 ("xfs: ensure inobt record walks always make forward
> progress")
> Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
> ---
> fs/xfs/xfs_iwalk.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/fs/xfs/xfs_iwalk.c b/fs/xfs/xfs_iwalk.c
> index 2a45138831e3..eae3aff9bc97 100644
> --- a/fs/xfs/xfs_iwalk.c
> +++ b/fs/xfs/xfs_iwalk.c
> @@ -363,7 +363,7 @@ xfs_iwalk_run_callbacks(
> /* Delete cursor but remember the last record we cached... */
> xfs_iwalk_del_inobt(tp, curpp, agi_bpp, 0);
> irec = &iwag->recs[iwag->nr_recs - 1];
> - ASSERT(next_agino == irec->ir_startino + XFS_INODES_PER_CHUNK);
> + ASSERT(next_agino >= irec->ir_startino + XFS_INODES_PER_CHUNK);
>
> error = xfs_iwalk_ag_recs(iwag);
> if (error)

I just tested on the same P9 machine which reproduced this bug, generic/466
test passed with this patch