WSL2-Linux-Kernel/fs/xfs
Dave Chinner e1b4271ac2 xfs: di_flushiter considered harmful
When we made all inode updates transactional, we no longer needed
the log recovery detection for inodes being newer on disk than the
transaction being replayed - it was redundant as replay of the log
would always result in the latest version of the inode would be on
disk. It was redundant, but left in place because it wasn't
considered to be a problem.

However, with the new "don't read inodes on create" optimisation,
flushiter has come back to bite us. Essentially, the optimisation
made always initialises flushiter to zero in the create transaction,
and so if we then crash and run recovery and the inode already on
disk has a non-zero flushiter it will skip recovery of that inode.
As a result, log recovery does the wrong thing and we end up with a
corrupt filesystem.

Because we have to support old kernel to new kernel upgrades, we
can't just get rid of the flushiter support in log recovery as we
might be upgrading from a kernel that doesn't have fully transactional
inode updates.  Unfortunately, for v4 superblocks there is no way to
guarantee that log recovery knows about this fact.

We cannot add a new inode format flag to say it's a "special inode
create" because it won't be understood by older kernels and so
recovery could do the wrong thing on downgrade. We cannot specially
detect the combination of zero mode/non-zero flushiter on disk to
non-zero mode, zero flushiter in the log item during recovery
because wrapping of the flushiter can result in false detection.

Hence that makes this "don't use flushiter" optimisation limited to
a disk format that guarantees that we don't need it. And that means
the only fix here is to limit the "no read IO on create"
optimisation to version 5 superblocks....

Reported-by: Markus Trippelsdorf <markus@trippelsdorf.de>
Signed-off-by: Dave Chinner <dchinner@redhat.com>
Reviewed-by: Mark Tinguely <tinguely@sgi.com>
Signed-off-by: Ben Myers <bpm@sgi.com>

(cherry picked from commit e60896d8f2)
2013-07-25 10:41:42 -05:00
..
Kconfig xfs: introduce CONFIG_XFS_WARN 2013-05-07 18:45:36 -05:00
Makefile xfs: Inode create log items 2013-06-27 13:34:12 -05:00
kmem.c
kmem.h
mrlock.h xfs: introduce CONFIG_XFS_WARN 2013-05-07 18:45:36 -05:00
time.h
uuid.c
uuid.h
xfs.h xfs: introduce CONFIG_XFS_WARN 2013-05-07 18:45:36 -05:00
xfs_acl.c xfs: increase number of ACL entries for V5 superblocks 2013-06-06 10:52:15 -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_alloc.c xfs: Avoid pathological backwards allocation 2013-05-20 13:09:11 -05:00
xfs_alloc.h
xfs_alloc_btree.c xfs: introduce CONFIG_XFS_WARN 2013-05-07 18:45:36 -05:00
xfs_alloc_btree.h
xfs_aops.c Lots of bug fixes, cleanups and optimizations. In the bug fixes 2013-07-02 09:39:34 -07:00
xfs_aops.h
xfs_attr.c
xfs_attr.h
xfs_attr_leaf.c xfs: remove local fork format handling from xfs_bmapi_write() 2013-07-09 16:40:22 -05:00
xfs_attr_leaf.h xfs: fix implicit padding in directory and attr CRC formats 2013-06-14 15:59:16 -05:00
xfs_attr_remote.c xfs: rework remote attr CRCs 2013-05-30 17:26:31 -05:00
xfs_attr_remote.h xfs: rework remote attr CRCs 2013-05-30 17:26:31 -05:00
xfs_attr_sf.h
xfs_bit.c
xfs_bit.h
xfs_bmap.c xfs: remove local fork format handling from xfs_bmapi_write() 2013-07-09 16:40:22 -05:00
xfs_bmap.h xfs: remove local fork format handling from xfs_bmapi_write() 2013-07-09 16:40:22 -05:00
xfs_bmap_btree.c xfs: introduce CONFIG_XFS_WARN 2013-05-07 18:45:36 -05:00
xfs_bmap_btree.h xfs: check on-disk (not incore) btree root size in dfrag.c 2013-06-20 13:26:09 -05:00
xfs_btree.c xfs: ensure btree root split sets blkno correctly 2013-06-14 15:59:31 -05:00
xfs_btree.h xfs: introduce CONFIG_XFS_WARN 2013-05-07 18:45:36 -05:00
xfs_buf.c xfs: rework remote attr CRCs 2013-05-30 17:26:31 -05:00
xfs_buf.h
xfs_buf_item.c xfs: Use inode create transaction 2013-06-27 14:27:18 -05:00
xfs_buf_item.h xfs: Introduce an ordered buffer item 2013-06-27 13:33:11 -05:00
xfs_cksum.h
xfs_da_btree.c xfs: xfs_da3_node_read_verify() doesn't handle XFS_ATTR3_LEAF_MAGIC 2013-05-24 16:29:37 -05:00
xfs_da_btree.h xfs: add buffer types to directory and attribute buffers 2013-04-27 13:01:06 -05:00
xfs_dfrag.c xfs: check on-disk (not incore) btree root size in dfrag.c 2013-06-20 13:26:09 -05:00
xfs_dfrag.h
xfs_dinode.h xfs: di_flushiter considered harmful 2013-07-25 10:41:42 -05:00
xfs_dir2.c [readdir] convert xfs 2013-06-29 12:57:00 +04:00
xfs_dir2.h
xfs_dir2_block.c xfs: update (#2) for 3.11-rc1 2013-07-13 11:40:24 -07:00
xfs_dir2_data.c xfs: buffer type overruns blf_flags field 2013-04-27 13:01:58 -05:00
xfs_dir2_format.h xfs: fix implicit padding in directory and attr CRC formats 2013-06-14 15:59:16 -05:00
xfs_dir2_leaf.c xfs: update for 3.11-rc1 2013-07-09 12:29:12 -07:00
xfs_dir2_node.c xfs: fix dir3 freespace block corruption 2013-05-30 17:22:54 -05:00
xfs_dir2_priv.h [readdir] convert xfs 2013-06-29 12:57:00 +04:00
xfs_dir2_sf.c [readdir] convert xfs 2013-06-29 12:57:00 +04:00
xfs_discard.c
xfs_discard.h
xfs_dquot.c xfs: Add pquota fields where gquota is used. 2013-07-11 10:35:32 -05:00
xfs_dquot.h xfs: Add pquota fields where gquota is used. 2013-07-11 10:35:32 -05:00
xfs_dquot_item.c
xfs_dquot_item.h
xfs_error.c
xfs_error.h
xfs_export.c
xfs_export.h
xfs_extent_busy.c
xfs_extent_busy.h
xfs_extfree_item.c xfs: Don't reference the EFI after it is freed 2013-05-24 16:27:57 -05:00
xfs_extfree_item.h
xfs_file.c vfs: export lseek_execute() to modules 2013-07-03 16:23:27 +04:00
xfs_filestream.c
xfs_filestream.h
xfs_fs.h xfs: add fsgeom flag for v5 superblock support. 2013-05-30 17:19:45 -05:00
xfs_fsops.c xfs: Remove redundant error variable from xfs_growfs_data_private() 2013-06-17 17:43:04 -05:00
xfs_fsops.h
xfs_globals.c
xfs_ialloc.c xfs: Use inode create transaction 2013-06-27 14:27:18 -05:00
xfs_ialloc.h xfs: Inode create item recovery 2013-06-27 14:26:21 -05:00
xfs_ialloc_btree.c xfs: introduce CONFIG_XFS_WARN 2013-05-07 18:45:36 -05:00
xfs_ialloc_btree.h
xfs_icache.c xfs: Add pquota fields where gquota is used. 2013-07-11 10:35:32 -05:00
xfs_icache.h xfs: Remove dead function prototype xfs_sync_inode_grab() 2013-06-26 12:29:27 -05:00
xfs_icreate_item.c xfs: Inode create log items 2013-06-27 13:34:12 -05:00
xfs_icreate_item.h xfs: Inode create log items 2013-06-27 13:34:12 -05:00
xfs_inode.c xfs: di_flushiter considered harmful 2013-07-25 10:41:42 -05:00
xfs_inode.h xfs: Add pquota fields where gquota is used. 2013-07-11 10:35:32 -05:00
xfs_inode_item.c
xfs_inode_item.h
xfs_inum.h
xfs_ioctl.c xfs: Add pquota fields where gquota is used. 2013-07-11 10:35:32 -05:00
xfs_ioctl.h
xfs_ioctl32.c xfs: fallback to vmalloc for large buffers in xfs_compat_attrlist_by_handle 2013-05-07 19:00:10 -05:00
xfs_ioctl32.h
xfs_iomap.c xfs: don't use speculative prealloc for small files 2013-06-27 13:27:37 -05:00
xfs_iomap.h
xfs_iops.c xfs: Add pquota fields where gquota is used. 2013-07-11 10:35:32 -05:00
xfs_iops.h
xfs_itable.c xfs: clean up unused codes at xfs_bulkstat() 2013-07-09 15:36:21 -05:00
xfs_itable.h
xfs_linux.h xfs: introduce CONFIG_XFS_WARN 2013-05-07 18:45:36 -05:00
xfs_log.c xfs: Introduce ordered log vector support 2013-06-27 13:32:08 -05:00
xfs_log.h xfs: Inode create log items 2013-06-27 13:34:12 -05:00
xfs_log_cil.c xfs: Introduce ordered log vector support 2013-06-27 13:32:08 -05:00
xfs_log_priv.h
xfs_log_recover.c xfs: di_flushiter considered harmful 2013-07-25 10:41:42 -05:00
xfs_log_recover.h
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: Remove incore use of XFS_OQUOTA_ENFD and XFS_OQUOTA_CHKD 2013-06-28 17:39:22 -05:00
xfs_mount.h xfs: Remove XFS_MOUNT_RETERR 2013-06-19 14:54:17 -05:00
xfs_mru_cache.c
xfs_mru_cache.h
xfs_qm.c xfs: Add pquota fields where gquota is used. 2013-07-11 10:35:32 -05:00
xfs_qm.h xfs: Add pquota fields where gquota is used. 2013-07-11 10:35:32 -05:00
xfs_qm_bhv.c xfs: Add pquota fields where gquota is used. 2013-07-11 10:35:32 -05:00
xfs_qm_syscalls.c xfs: Fix the logic check for all quotas being turned off 2013-07-11 16:49:10 -05:00
xfs_quota.h xfs: Fix the logic check for all quotas being turned off 2013-07-11 16:49:10 -05:00
xfs_quota_priv.h
xfs_quotaops.c xfs: Remove incore use of XFS_OQUOTA_ENFD and XFS_OQUOTA_CHKD 2013-06-28 17:39:22 -05:00
xfs_rename.c
xfs_rtalloc.c
xfs_rtalloc.h
xfs_sb.h xfs: Define a new function xfs_is_quota_inode() 2013-06-28 13:03:49 -05:00
xfs_stats.c
xfs_stats.h
xfs_super.c xfs: Remove incore use of XFS_OQUOTA_ENFD and XFS_OQUOTA_CHKD 2013-06-28 17:39:22 -05:00
xfs_super.h
xfs_symlink.c xfs: Add pquota fields where gquota is used. 2013-07-11 10:35:32 -05:00
xfs_symlink.h xfs: fix the symbolic link assert in xfs_ifree 2013-06-19 14:14:43 -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_trace.c
xfs_trace.h xfs: update for 3.11-rc1 2013-07-09 12:29:12 -07:00
xfs_trans.c xfs: Inode create transaction reservations 2013-06-27 13:36:37 -05:00
xfs_trans.h xfs: Inode create log items 2013-06-27 13:34:12 -05:00
xfs_trans_ail.c
xfs_trans_buf.c xfs: Introduce an ordered buffer item 2013-06-27 13:33:11 -05:00
xfs_trans_dquot.c xfs: Add pquota fields where gquota is used. 2013-07-11 10:35:32 -05:00
xfs_trans_extfree.c
xfs_trans_inode.c xfs: implement inode change count 2013-06-28 13:00:05 -05:00
xfs_trans_priv.h
xfs_trans_space.h
xfs_types.h
xfs_utils.c
xfs_utils.h
xfs_vnode.h
xfs_vnodeops.c xfs: Add pquota fields where gquota is used. 2013-07-11 10:35:32 -05:00
xfs_vnodeops.h [readdir] convert xfs 2013-06-29 12:57:00 +04:00
xfs_xattr.c