xfs: fix finobt btree block recovery ordering
authorDave Chinner <dchinner@redhat.com>
Wed, 30 Sep 2020 14:28:52 +0000 (07:28 -0700)
committerDarrick J. Wong <darrick.wong@oracle.com>
Wed, 30 Sep 2020 14:28:52 +0000 (07:28 -0700)
commit671459676ab0e1d371c8d6b184ad1faa05b6941e
tree06c0ec6cb8fbfd2ce967d2e905e00ec25a2ff8a3
parent3442de9cc322500b56a5918139bffcdd62063cc9
xfs: fix finobt btree block recovery ordering

Nathan popped up on #xfs and pointed out that we fail to handle
finobt btree blocks in xlog_recover_get_buf_lsn(). This means they
always fall through the entire magic number matching code to "recover
immediately". Whilst most of the time this is the correct behaviour,
occasionally it will be incorrect and could potentially overwrite
more recent metadata because we don't check the LSN in the on disk
metadata at all.

This bug has been present since the finobt was first introduced, and
is a potential cause of the occasional xfs_iget_check_free_state()
failures we see that indicate that the inode btree state does not
match the on disk inode state.

Fixes: aafc3c246529 ("xfs: support the XFS_BTNUM_FINOBT free inode btree type")
Reported-by: Nathan Scott <nathans@redhat.com>
Signed-off-by: Dave Chinner <dchinner@redhat.com>
Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com>
Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Brian Foster <bfoster@redhat.com>
fs/xfs/xfs_buf_item_recover.c