linux_dsm_epyc7002/fs/xfs
Dave Chinner 566055d33a xfs: log recovery lsn ordering needs uuid check
After a fair number of xfstests runs, xfs/182 started to fail
regularly with a corrupted directory - a directory read verifier was
failing after recovery because it found a block with a XARM magic
number (remote attribute block) rather than a directory data block.

The first time I saw this repeated failure I did /something/ and the
problem went away, so I was never able to find the underlying
problem. Test xfs/182 failed again today, and I found the root
cause before I did /something else/ that made it go away.

Tracing indicated that the block in question was being correctly
logged, the log was being flushed by sync, but the buffer was not
being written back before the shutdown occurred. Tracing also
indicated that log recovery was also reading the block, but then
never writing it before log recovery invalidated the cache,
indicating that it was not modified by log recovery.

More detailed analysis of the corpse indicated that the filesystem
had a uuid of "a4131074-1872-4cac-9323-2229adbcb886" but the XARM
block had a uuid of "8f32f043-c3c9-e7f8-f947-4e7f989c05d3", which
indicated it was a block from an older filesystem. The reason that
log recovery didn't replay it was that the LSN in the XARM block was
larger than the LSN of the transaction being replayed, and so the
block was not overwritten by log recovery.

Hence, log recovery cant blindly trust the magic number and LSN in
the block - it must verify that it belongs to the filesystem being
recovered before using the LSN. i.e. if the UUIDs don't match, we
need to unconditionally recovery the change held in the log.

This patch was first tested on a block device that was repeatedly
causing xfs/182 to fail with the same failure on the same block with
the same directory read corruption signature (i.e. XARM block). It
did not fail, and hasn't failed since.

Signed-off-by: Dave Chinner <dchinner@redhat.com>
Reviewed-by: Ben Myers <bpm@sgi.com>
Signed-off-by: Ben Myers <bpm@sgi.com>
2013-09-24 12:35:57 -05:00
..
Kconfig xfs: introduce CONFIG_XFS_WARN 2013-05-07 18:45:36 -05:00
kmem.c xfs: factor all the kmalloc-or-vmalloc fallback allocations 2013-09-10 13:57:03 -05:00
kmem.h xfs: factor all the kmalloc-or-vmalloc fallback allocations 2013-09-10 13:57:03 -05:00
Makefile xfs: Add xfs_log_rlimit.c 2013-08-12 17:49:38 -05:00
mrlock.h xfs: introduce CONFIG_XFS_WARN 2013-05-07 18:45:36 -05:00
time.h xfs: remove subdirectories 2011-08-12 16:21:35 -05:00
uuid.c xfs: remove subdirectories 2011-08-12 16:21:35 -05:00
uuid.h xfs: add CRC infrastructure 2012-11-19 20:11:24 -06:00
xfs_acl.c xfs: factor all the kmalloc-or-vmalloc fallback allocations 2013-09-10 13:57:03 -05:00
xfs_acl.h xfs: increase number of ACL entries for V5 superblocks 2013-06-06 10:52:15 -05:00
xfs_ag.h xfs: make struct xfs_perag kernel only 2013-08-12 17:44:36 -05:00
xfs_alloc_btree.c xfs: introduce CONFIG_XFS_WARN 2013-05-07 18:45:36 -05:00
xfs_alloc_btree.h xfs: add support for large btree blocks 2013-04-21 14:53:46 -05:00
xfs_alloc.c xfs: kill __KERNEL__ check for debug code in allocation code 2013-08-12 16:57:51 -05:00
xfs_alloc.h xfs: convert buffer verifiers to an ops structure. 2012-11-15 21:35:12 -06:00
xfs_aops.c truncate: drop 'oldsize' truncate_pagecache() parameter 2013-09-12 15:38:02 -07:00
xfs_aops.h direct-io: Implement generic deferred AIO completions 2013-09-04 09:23:46 -04:00
xfs_attr_inactive.c xfs: refactor xfs_trans_reserve() interface 2013-08-12 17:47:34 -05:00
xfs_attr_leaf.c Fix wrong flag ASSERT in xfs_attr_shortform_getvalue 2013-08-30 15:20:50 -05:00
xfs_attr_leaf.h xfs: sync minor header differences needed by userspace. 2013-08-12 16:35:41 -05:00
xfs_attr_list.c xfs: split out attribute listing code into separate file 2013-08-12 16:41:29 -05:00
xfs_attr_remote.c xfs: fix issues that cause userspace warnings 2013-08-12 16:52:54 -05:00
xfs_attr_remote.h xfs: rework remote attr CRCs 2013-05-30 17:26:31 -05:00
xfs_attr_sf.h xfs: convert attr to use unsigned names 2010-01-20 10:47:48 +11:00
xfs_attr.c xfs: avoid double-free in xfs_attr_node_addname 2013-08-13 15:48:01 -05:00
xfs_attr.h xfs: kill xfs_vnodeops.[ch] 2013-08-12 16:53:39 -05:00
xfs_bit.c
xfs_bit.h
xfs_bmap_btree.c xfs: = vs == typo in ASSERT() 2013-09-12 09:42:08 -05:00
xfs_bmap_btree.h xfs: recovery of swap extents operations for CRC filesystems 2013-09-10 12:49:57 -05:00
xfs_bmap_util.c xfs: factor all the kmalloc-or-vmalloc fallback allocations 2013-09-10 13:57:03 -05:00
xfs_bmap_util.h xfs: consolidate extent swap code 2013-08-12 16:56:06 -05:00
xfs_bmap.c xfs: fix some minor sparse warnings 2013-09-09 17:43:05 -05:00
xfs_bmap.h xfs: remove __KERNEL__ from debug code 2013-08-12 16:58:37 -05:00
xfs_btree.c xfs: recovery of swap extents operations for CRC filesystems 2013-09-10 12:49:57 -05:00
xfs_btree.h xfs: recovery of swap extents operations for CRC filesystems 2013-09-10 12:49:57 -05:00
xfs_buf_item.c xfs: lock the AIL before removing the buffer item 2013-09-24 12:31:41 -05:00
xfs_buf_item.h xfs: split out buf log item format definitions 2013-08-12 16:06:37 -05:00
xfs_buf.c super: fix for destroy lrus 2013-09-10 18:56:32 -04:00
xfs_buf.h xfs: rework buffer dispose list tracking 2013-09-10 18:56:31 -04:00
xfs_cksum.h xfs: add CRC infrastructure 2012-11-19 20:11:24 -06:00
xfs_da_btree.c xfs: ensure we copy buffer type in da btree root splits 2013-09-10 13:34:05 -05:00
xfs_da_btree.h XFS: Assertion failed: first <= last && last < BBTOB(bp->b_length), file: fs/xfs/xfs_trans_buf.c, line: 568 2013-08-30 09:48:59 -05:00
xfs_dinode.h xfs: di_flushiter considered harmful 2013-07-25 10:41:42 -05:00
xfs_dir2_block.c xfs: Add write support for dirent filetype field 2013-08-22 08:44:49 -05:00
xfs_dir2_data.c xfs: Add write support for dirent filetype field 2013-08-22 08:44:49 -05:00
xfs_dir2_format.h xfs: Add read-only support for dirent filetype field 2013-08-22 08:40:24 -05:00
xfs_dir2_leaf.c xfs: check magic numbers in dir3 leaf verifier first 2013-09-09 17:43:58 -05:00
xfs_dir2_node.c xfs: Add write support for dirent filetype field 2013-08-22 08:44:49 -05:00
xfs_dir2_priv.h xfs: Add read-only support for dirent filetype field 2013-08-22 08:40:24 -05:00
xfs_dir2_readdir.c xfs: Add read-only support for dirent filetype field 2013-08-22 08:40:24 -05:00
xfs_dir2_sf.c xfs: dtype changed xfs_dir2_sfe_put_ino to xfs_dir3_sfe_put_ino 2013-09-03 14:51:16 -05:00
xfs_dir2.c XFS: Assertion failed: first <= last && last < BBTOB(bp->b_length), file: fs/xfs/xfs_trans_buf.c, line: 568 2013-08-30 09:48:59 -05:00
xfs_dir2.h xfs: dtype changed xfs_dir2_sfe_put_ino to xfs_dir3_sfe_put_ino 2013-09-03 14:51:16 -05:00
xfs_discard.c xfs: split out transaction reservation code 2013-08-12 16:36:16 -05:00
xfs_discard.h xfs: remove subdirectories 2011-08-12 16:21:35 -05:00
xfs_dquot_item.c xfs: fix some minor sparse warnings 2013-09-09 17:43:05 -05:00
xfs_dquot_item.h xfs: remove subdirectories 2011-08-12 16:21:35 -05:00
xfs_dquot.c xfs: convert dquot cache lru to list_lru 2013-09-10 18:56:31 -04:00
xfs_dquot.h xfs: Add pquota fields where gquota is used. 2013-07-11 10:35:32 -05:00
xfs_error.c xfs: consolidate xfs_utils.c 2013-08-12 16:55:17 -05:00
xfs_error.h xfs: kill support/debug.[ch] 2011-03-07 10:09:35 +11:00
xfs_export.c xfs: kill xfs_vnodeops.[ch] 2013-08-12 16:53:39 -05:00
xfs_export.h xfs: remove subdirectories 2011-08-12 16:21:35 -05:00
xfs_extent_busy.c xfs: fix some minor sparse warnings 2013-09-09 17:43:05 -05:00
xfs_extent_busy.h xfs: make xfs_extent_busy_trim not static 2012-05-14 16:21:04 -05:00
xfs_extfree_item.c xfs: return log item size in IOP_SIZE 2013-08-13 16:10:21 -05:00
xfs_extfree_item.h xfs: split out EFI/EFD log item format definition 2013-08-12 16:07:13 -05:00
xfs_file.c xfs: kill xfs_vnodeops.[ch] 2013-08-12 16:53:39 -05:00
xfs_filestream.c xfs: consolidate xfs_utils.c 2013-08-12 16:55:17 -05:00
xfs_filestream.h xfs: xfs_filestreams.h doesn't need __KERNEL__ 2013-08-12 17:00:11 -05:00
xfs_format.h xfs: split out the remote symlink handling 2013-08-12 16:43:38 -05:00
xfs_fs.h xfs: fix XFS_IOC_FREE_EOFBLOCKS definition 2013-09-24 12:35:08 -05:00
xfs_fsops.c xfs: refactor xfs_trans_reserve() interface 2013-08-12 17:47:34 -05:00
xfs_fsops.h xfs: ensure log covering transactions are synchronous 2011-01-11 20:28:17 -06:00
xfs_globals.c xfs: add background scanning to clear eofblocks inodes 2012-11-08 15:34:59 -06:00
xfs_ialloc_btree.c xfs: introduce CONFIG_XFS_WARN 2013-05-07 18:45:36 -05:00
xfs_ialloc_btree.h xfs: add support for large btree blocks 2013-04-21 14:53:46 -05:00
xfs_ialloc.c xfs: check correct status variable for xfs_inobt_get_rec() call 2013-08-30 13:48:35 -05:00
xfs_ialloc.h xfs: Inode create item recovery 2013-06-27 14:26:21 -05:00
xfs_icache.c xfs: asserting lock not held during freeing not valid 2013-09-24 12:32:57 -05:00
xfs_icache.h xfs: update #2 for v3.12-rc1 2013-09-12 16:13:41 -07:00
xfs_icreate_item.c xfs: return log item size in IOP_SIZE 2013-08-13 16:10:21 -05:00
xfs_icreate_item.h xfs: separate icreate log format definitions from xfs_icreate_item.h 2013-08-12 16:10:35 -05:00
xfs_inode_buf.c xfs: don't assert fail on bad inode numbers 2013-09-10 14:07:54 -05:00
xfs_inode_buf.h xfs: recovery of swap extents operations for CRC filesystems 2013-09-10 12:49:57 -05:00
xfs_inode_fork.c xfs: check for underflow in xfs_iformat_fork() 2013-08-26 11:28:08 -05:00
xfs_inode_fork.h xfs: move inode fork definitions to a new header file 2013-08-12 16:37:32 -05:00
xfs_inode_item.c xfs: return log item size in IOP_SIZE 2013-08-13 16:10:21 -05:00
xfs_inode_item.h xfs: split out inode log item format definition 2013-08-12 16:05:19 -05:00
xfs_inode.c xfs: fix the comment of xfs_ifree_cluster() 2013-08-20 15:44:36 -05:00
xfs_inode.h xfs: consolidate xfs_utils.c 2013-08-12 16:55:17 -05:00
xfs_inum.h xfs: move xfsagino_t to xfs_types.h 2012-05-14 16:20:54 -05:00
xfs_ioctl32.c xfs: factor all the kmalloc-or-vmalloc fallback allocations 2013-09-10 13:57:03 -05:00
xfs_ioctl32.h xfs: remove subdirectories 2011-08-12 16:21:35 -05:00
xfs_ioctl.c xfs: factor all the kmalloc-or-vmalloc fallback allocations 2013-09-10 13:57:03 -05:00
xfs_ioctl.h xfs: consolidate extent swap code 2013-08-12 16:56:06 -05:00
xfs_iomap.c xfs: refactor xfs_trans_reserve() interface 2013-08-12 17:47:34 -05:00
xfs_iomap.h xfs: kill xfs_iomap 2010-12-16 16:05:51 -06:00
xfs_iops.c xfs: Add read-only support for dirent filetype field 2013-08-22 08:40:24 -05:00
xfs_iops.h xfs: kill xfs_vnodeops.[ch] 2013-08-12 16:53:39 -05:00
xfs_itable.c xfs: factor all the kmalloc-or-vmalloc fallback allocations 2013-09-10 13:57:03 -05:00
xfs_itable.h xfs: remove block number from inode lookup code 2010-06-24 11:35:17 +10:00
xfs_linux.h xfs: remove two unused macro definitions in xfs_linux.h 2013-08-20 15:30:23 -05:00
xfs_log_cil.c xfs: split the CIL lock 2013-08-13 16:21:21 -05:00
xfs_log_format.h xfs: recovery of swap extents operations for CRC filesystems 2013-09-10 12:49:57 -05:00
xfs_log_priv.h xfs: split the CIL lock 2013-08-13 16:21:21 -05:00
xfs_log_recover.c xfs: log recovery lsn ordering needs uuid check 2013-09-24 12:35:57 -05:00
xfs_log_recover.h xfs: Clean up XFS_BLI_* flag namespace 2010-05-24 10:33:39 -05:00
xfs_log_rlimit.c xfs: call roundup_64() to calculate the min_logblks 2013-08-13 14:19:11 -05:00
xfs_log.c xfs: fix some minor sparse warnings 2013-09-09 17:43:05 -05:00
xfs_log.h xfs: Reduce allocations during CIL insertion 2013-08-13 16:12:30 -05:00
xfs_message.c xfs: introduce CONFIG_XFS_WARN 2013-05-07 18:45:36 -05:00
xfs_message.h xfs: introduce CONFIG_XFS_WARN 2013-05-07 18:45:36 -05:00
xfs_mount.c xfs: Register hotcpu notifier after initialization 2013-08-22 14:05:27 -05:00
xfs_mount.h xfs: Introduce a new structure to hold transaction reservation items 2013-08-12 17:45:49 -05:00
xfs_mru_cache.c xfs: convert to alloc_workqueue() 2011-02-01 11:42:43 +01:00
xfs_mru_cache.h xfs: Kill filestreams cache flush 2010-01-15 15:34:22 -06:00
xfs_qm_bhv.c xfs: separate dquot on disk format definitions out of xfs_quota.h 2013-08-12 16:09:52 -05:00
xfs_qm_syscalls.c xfs: Add support for the Q_XGETQSTATV 2013-08-20 17:00:38 -05:00
xfs_qm.c super: fix for destroy lrus 2013-09-10 18:56:32 -04:00
xfs_qm.h xfs: convert dquot cache lru to list_lru 2013-09-10 18:56:31 -04:00
xfs_quota_defs.h xfs: introduce xfs_quota_defs.h 2013-08-12 16:20:18 -05:00
xfs_quota_priv.h xfs: use per-filesystem radix trees for dquot lookup 2012-03-14 11:09:06 -05:00
xfs_quota.h xfs: XFS_MOUNT_QUOTA_ALL needed by userspace 2013-09-03 15:00:06 -05:00
xfs_quotaops.c xfs: Add support for the Q_XGETQSTATV 2013-08-20 17:00:38 -05:00
xfs_rtalloc.c xfs: refactor xfs_trans_reserve() interface 2013-08-12 17:47:34 -05:00
xfs_rtalloc.h xfs: introduce xfs_rtalloc_defs.h 2013-08-12 16:13:10 -05:00
xfs_sb.c xfs: fix the comment of xfs_sb_quiet_read_verify() 2013-08-20 15:51:49 -05:00
xfs_sb.h xfs: add xfs sb v4 support for dirent filetype field 2013-08-22 08:49:59 -05:00
xfs_stats.c xfs: use common code for quota statistics 2012-03-14 11:09:06 -05:00
xfs_stats.h xfs: use common code for quota statistics 2012-03-14 11:09:06 -05:00
xfs_super.c fs: convert inode and dentry shrinking to be node aware 2013-09-10 18:56:31 -04:00
xfs_super.h xfs: xfs_sync_data is redundant. 2012-10-17 12:01:25 -05:00
xfs_symlink_remote.c xfs: make struct xfs_perag kernel only 2013-08-12 17:44:36 -05:00
xfs_symlink.c xfs: set remote symlink buffer type for recovery 2013-09-10 12:57:09 -05:00
xfs_symlink.h xfs: split out the remote symlink handling 2013-08-12 16:43:38 -05:00
xfs_sysctl.c xfs: Convert use of typedef ctl_table to struct ctl_table 2013-06-17 17:42:25 -05:00
xfs_sysctl.h xfs: add background scanning to clear eofblocks inodes 2012-11-08 15:34:59 -06:00
xfs_trace.c xfs: separate dquot on disk format definitions out of xfs_quota.h 2013-08-12 16:09:52 -05:00
xfs_trace.h xfs: update for 3.11-rc1 2013-07-09 12:29:12 -07:00
xfs_trans_ail.c xfs: finish removing IOP_* macros. 2013-08-30 14:14:35 -05:00
xfs_trans_buf.c xfs: finish removing IOP_* macros. 2013-08-30 14:14:35 -05:00
xfs_trans_dquot.c xfs: separate dquot on disk format definitions out of xfs_quota.h 2013-08-12 16:09:52 -05:00
xfs_trans_extfree.c xfs: move xfsagino_t to xfs_types.h 2012-05-14 16:20:54 -05:00
xfs_trans_inode.c xfs: implement inode change count 2013-06-28 13:00:05 -05:00
xfs_trans_priv.h xfs: Simplify xfs_ail_min() with list_first_entry_or_null() 2013-08-23 12:57:43 -05:00
xfs_trans_resv.c xfs: inode log reservations are too small 2013-08-30 13:59:30 -05:00
xfs_trans_resv.h xfs: Get rid of all XFS_XXX_LOG_RES() macro 2013-08-12 17:48:08 -05:00
xfs_trans_space.h
xfs_trans.c xfs: finish removing IOP_* macros. 2013-08-30 14:14:35 -05:00
xfs_trans.h xfs: finish removing IOP_* macros. 2013-08-30 14:14:35 -05:00
xfs_types.h xfs: Add read-only support for dirent filetype field 2013-08-22 08:40:24 -05:00
xfs_vnode.h xfs: remove remaining scraps of struct xfs_iomap 2012-03-15 13:40:16 -05:00
xfs_xattr.c xfs: kill xfs_vnodeops.[ch] 2013-08-12 16:53:39 -05:00
xfs.h xfs: introduce CONFIG_XFS_WARN 2013-05-07 18:45:36 -05:00