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 <[email protected] >
Signed-off-by: Dave Chinner <[email protected] >
Reviewed-by: Mark Tinguely <[email protected] >
Signed-off-by: Ben Myers <[email protected] >
(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
kmem.c
xfs: switch to proper __bitwise type for KM_... flags
2012-05-29 23:28:32 -04:00
kmem.h
xfs: switch to proper __bitwise type for KM_... flags
2012-05-29 23:28:32 -04:00
Makefile
xfs: Inode create log items
2013-06-27 13:34:12 -05:00
mrlock.h
xfs: introduce CONFIG_XFS_WARN
2013-05-07 18:45:36 -05:00
time.h
uuid.c
uuid.h
xfs: add CRC infrastructure
2012-11-19 20:11:24 -06:00
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: add CRC checks to the AGI
2013-04-21 14:57:43 -05:00
xfs_alloc.c
xfs: Avoid pathological backwards allocation
2013-05-20 13:09:11 -05:00
xfs_alloc.h
xfs: convert buffer verifiers to an ops structure.
2012-11-15 21:35:12 -06: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_aops.c
Lots of bug fixes, cleanups and optimizations. In the bug fixes
2013-07-02 09:39:34 -07:00
xfs_aops.h
Prefix IO_XX flags with XFS_IO_XX to avoid namespace colision.
2012-07-22 11:00:55 -05:00
xfs_attr.c
xfs: split remote attribute code out
2013-04-27 12:49:32 -05:00
xfs_attr.h
xfs: split remote attribute code out
2013-04-27 12:49:32 -05:00
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: use b_maps[] for discontiguous buffers
2013-01-16 16:07:11 -06:00
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: add CRC infrastructure
2012-11-19 20:11:24 -06:00
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: check for possible overflow in xfs_ioc_trim
2012-08-23 14:48:44 -05:00
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: clean up xfs_bit.h includes
2012-05-14 16:21:00 -05:00
xfs_dquot_item.h
xfs_error.c
xfs: increase hexdump output in xfs_corruption_error
2013-04-21 14:48:41 -05:00
xfs_error.h
xfs_export.c
fs: encode_fh: return FILEID_INVALID if invalid fid_type
2013-02-26 02:46:10 -05:00
xfs_export.h
xfs_extent_busy.c
xfs: make xfs_extent_busy_trim not static
2012-05-14 16:21:04 -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: Don't reference the EFI after it is freed
2013-05-24 16:27:57 -05:00
xfs_extfree_item.h
xfs: don't free EFIs before the EFDs are committed
2013-04-05 13:25:35 -05:00
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: add background scanning to clear eofblocks inodes
2012-11-08 15:34:59 -06:00
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: add support for large btree blocks
2013-04-21 14:53:46 -05:00
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: add version 3 inode format with CRCs
2013-04-21 15:03:33 -05:00
xfs_inode_item.h
xfs remove the XFS_TRANS_DEBUG routines
2012-12-17 16:29:00 -06:00
xfs_inum.h
xfs: move xfsagino_t to xfs_types.h
2012-05-14 16:20:54 -05:00
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: Remove the obsolete XLOG_CIL_HARD_SPACE_LIMIT() macros
2013-04-16 13:18:33 -05:00
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: use per-filesystem radix trees for dquot lookup
2012-03-14 11:09:06 -05:00
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: move xfsagino_t to xfs_types.h
2012-05-14 16:20:54 -05:00
xfs_rtalloc.c
xfs: uncached buffer reads need to return an error
2012-11-15 21:34:05 -06:00
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: 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
xfs: Remove incore use of XFS_OQUOTA_ENFD and XFS_OQUOTA_CHKD
2013-06-28 17:39:22 -05:00
xfs_super.h
xfs: xfs_sync_data is redundant.
2012-10-17 12:01:25 -05:00
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: add background scanning to clear eofblocks inodes
2012-11-08 15:34:59 -06:00
xfs_trace.c
xfs: add CRCs to dir2/da node blocks
2013-04-27 12:33:38 -05:00
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 remove the XFS_TRANS_DEBUG routines
2012-12-17 16:29:00 -06:00
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: 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: re-enable xfsaild idle mode and fix associated races
2012-07-29 16:27:57 -05:00
xfs_trans_space.h
xfs_types.h
xfs: Remove boolean_t typedef completely.
2013-01-17 17:32:57 -06:00
xfs_utils.c
xfs: remove the alloc_done argument to xfs_dialloc
2012-07-29 16:00:31 -05:00
xfs_utils.h
xfs_vnode.h
xfs: remove remaining scraps of struct xfs_iomap
2012-03-15 13:40:16 -05:00
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