mirror_ubuntu-kernels/fs/xfs/libxfs
Darrick J. Wong e21fea4ac3 xfs: fix di_onlink checking for V1/V2 inodes
"KjellR" complained on IRC that an old V4 filesystem suddenly stopped
mounting after upgrading from 6.9.11 to 6.10.3, with the following splat
when trying to read the rt bitmap inode:

00000000: 49 4e 80 00 01 02 00 01 00 00 00 00 00 00 00 00  IN..............
00000010: 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00  ................
00000020: 00 00 00 00 00 00 00 00 43 d2 a9 da 21 0f d6 30  ........C...!..0
00000030: 43 d2 a9 da 21 0f d6 30 00 00 00 00 00 00 00 00  C...!..0........
00000040: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
00000050: 00 00 00 02 00 00 00 00 00 00 00 04 00 00 00 00  ................
00000060: ff ff ff ff 00 00 00 00 00 00 00 00 00 00 00 00  ................
00000070: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................

As Dave Chinner points out, this is a V1 inode with both di_onlink and
di_nlink set to 1 and di_flushiter == 0.  In other words, this inode was
formatted this way by mkfs and hasn't been touched since then.

Back in the old days of xfsprogs 3.2.3, I observed that libxfs_ialloc
would set di_nlink, but if the filesystem didn't have NLINK, it would
then set di_version = 1.  libxfs_iflush_int later sees the V1 inode and
copies the value of di_nlink to di_onlink without zeroing di_onlink.

Eventually this filesystem must have been upgraded to support NLINK
because 6.10 doesn't support !NLINK filesystems, which is how we tripped
over this old behavior.  The filesystem doesn't have a realtime section,
so that's why the rtbitmap inode has never been touched.

Fix this by removing the di_onlink/di_nlink checking for all V1/V2
inodes because this is a muddy mess.  The V3 inode handling code has
always supported NLINK and written di_onlink==0 so keep that check.
The removal of the V1 inode handling code when we dropped support for
!NLINK obscured this old behavior.

Reported-by: kjell.m.randa@gmail.com
Fixes: 40cb8613d6 ("xfs: check unused nlink fields in the ondisk inode")
Signed-off-by: Darrick J. Wong <djwong@kernel.org>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Chandan Babu R <chandanbabu@kernel.org>
2024-08-26 09:50:41 +05:30
..
xfs_ag_resv.c xfs: split xfs_mod_freecounter 2024-04-22 18:00:47 +05:30
xfs_ag_resv.h xfs: get rid of xfs_ag_resv_rmapbt_alloc 2024-07-04 14:36:13 +05:30
xfs_ag.c xfs: convert "skip_discard" to a proper flags bitset 2024-07-02 11:37:01 -07:00
xfs_ag.h xfs: hook live rmap operations during a repair operation 2024-02-22 12:43:40 -08:00
xfs_alloc_btree.c xfs: Avoid races with cnt_btree lastrec updates 2024-07-04 12:44:16 +05:30
xfs_alloc_btree.h xfs: split xfs_allocbt_init_cursor 2024-02-22 12:40:12 -08:00
xfs_alloc.c xfs: Avoid races with cnt_btree lastrec updates 2024-07-04 12:44:16 +05:30
xfs_alloc.h xfs: move xfs_extent_free_defer_add to xfs_extfree_item.c 2024-07-02 11:37:03 -07:00
xfs_attr_leaf.c xfs: don't remove the attr fork when parent pointers are enabled 2024-04-23 07:47:00 -07:00
xfs_attr_leaf.h xfs: validate attr leaf buffer owners 2024-04-15 14:58:51 -07:00
xfs_attr_remote.c xfs: minor cleanups of xfs_attr3_rmt_blocks 2024-05-02 07:48:37 -07:00
xfs_attr_remote.h xfs: create a helper to compute the blockcount of a max sized remote value 2024-05-02 07:48:36 -07:00
xfs_attr_sf.h xfs: pass the attr value to put_listent when possible 2024-04-23 07:47:00 -07:00
xfs_attr.c xfs: fix xfs_init_attr_trans not handling explicit operation codes 2024-05-27 15:55:52 +05:30
xfs_attr.h xfs: fix xfs_init_attr_trans not handling explicit operation codes 2024-05-27 15:55:52 +05:30
xfs_bit.c xfs: fix missing header includes 2019-11-07 13:00:53 -08:00
xfs_bit.h xfs: Use the correct style for SPDX License Identifier 2020-05-13 15:32:45 -07:00
xfs_bmap_btree.c xfs: convert "skip_discard" to a proper flags bitset 2024-07-02 11:37:01 -07:00
xfs_bmap_btree.h xfs: remove xfs_bmbt_stage_cursor 2024-02-22 12:39:45 -08:00
xfs_bmap.c xfs: convert "skip_discard" to a proper flags bitset 2024-07-02 11:37:01 -07:00
xfs_bmap.h xfs: hoist extent size helpers to libxfs 2024-07-02 11:36:55 -07:00
xfs_btree_mem.c xfs: launder in-memory btree buffers before transaction commit 2024-02-22 12:43:36 -08:00
xfs_btree_mem.h xfs: launder in-memory btree buffers before transaction commit 2024-02-22 12:43:36 -08:00
xfs_btree_staging.c xfs: xfs_btree_bload_prep_block() should use __GFP_NOFAIL 2024-02-28 14:04:30 +05:30
xfs_btree_staging.h xfs: don't override bc_ops for staging btrees 2024-02-22 12:37:35 -08:00
xfs_btree.c xfs: Avoid races with cnt_btree lastrec updates 2024-07-04 12:44:16 +05:30
xfs_btree.h xfs: Avoid races with cnt_btree lastrec updates 2024-07-04 12:44:16 +05:30
xfs_cksum.h
xfs_da_btree.c xfs: fix error returns from xfs_bmapi_write 2024-04-30 09:45:18 +05:30
xfs_da_btree.h xfs: create attr log item opcodes and formats for parent pointers 2024-04-23 07:46:57 -07:00
xfs_da_format.h xfs: turn XFS_ATTR3_RMT_BUF_SPACE into a function 2024-05-02 07:48:36 -07:00
xfs_defer.c xfs: background AIL push should target physical space 2024-07-04 12:46:46 +05:30
xfs_defer.h xfs: Increase XFS_DEFER_OPS_NR_INODES to 5 2024-04-15 14:59:01 -07:00
xfs_dir2_block.c xfs: validate explicit directory block buffer owners 2024-04-15 14:58:52 -07:00
xfs_dir2_data.c xfs: don't walk off the end of a directory data block 2024-07-01 09:32:29 +05:30
xfs_dir2_leaf.c xfs: validate explicit directory free block owners 2024-04-15 14:58:52 -07:00
xfs_dir2_node.c xfs: validate explicit directory free block owners 2024-04-15 14:58:52 -07:00
xfs_dir2_priv.h xfs: don't walk off the end of a directory data block 2024-07-01 09:32:29 +05:30
xfs_dir2_sf.c xfs: convert remaining kmem_free() to kfree() 2024-02-13 18:07:34 +05:30
xfs_dir2.c xfs: move dirent update hooks to xfs_dir2.c 2024-07-02 11:37:00 -07:00
xfs_dir2.h xfs: move dirent update hooks to xfs_dir2.c 2024-07-02 11:37:00 -07:00
xfs_dquot_buf.c xfs: remove the xfs_dqblk_t typedef 2021-10-14 09:19:33 -07:00
xfs_errortag.h xfs: add error injection to test file mapping exchange recovery 2024-04-15 14:54:19 -07:00
xfs_exchmaps.c xfs: refactor dir format helpers 2024-04-26 11:21:46 +05:30
xfs_exchmaps.h xfs: use atomic extent swapping to fix user file fork data 2024-04-15 14:58:53 -07:00
xfs_format.h xfs: don't use the incore struct xfs_sb for offsets into struct xfs_dsb 2024-07-02 11:37:00 -07:00
xfs_fs.h xfs: fix direction in XFS_IOC_EXCHANGE_RANGE 2024-06-26 14:29:25 +05:30
xfs_health.h xfs: report directory tree corruption in the health information 2024-04-23 16:55:17 -07:00
xfs_ialloc_btree.c xfs: convert "skip_discard" to a proper flags bitset 2024-07-02 11:37:01 -07:00
xfs_ialloc_btree.h xfs: split xfs_inobt_init_cursor 2024-02-22 12:40:49 -08:00
xfs_ialloc.c xfs: convert "skip_discard" to a proper flags bitset 2024-07-02 11:37:01 -07:00
xfs_ialloc.h xfs: pass xfs_buf lookup flags to xfs_*read_agi 2024-04-15 14:54:03 -07:00
xfs_iext_tree.c xfs: use __GFP_NOLOCKDEP instead of GFP_NOFS 2024-02-13 18:07:34 +05:30
xfs_inode_buf.c xfs: fix di_onlink checking for V1/V2 inodes 2024-08-26 09:50:41 +05:30
xfs_inode_buf.h xfs: kill xfs_sb_version_has_v3inode() 2021-08-19 10:07:14 -07:00
xfs_inode_fork.c xfs: simplify iext overflow checking and upgrade 2024-05-03 11:20:06 +05:30
xfs_inode_fork.h xfs: simplify iext overflow checking and upgrade 2024-05-03 11:20:06 +05:30
xfs_inode_util.c xfs: hoist inode free function to libxfs 2024-07-02 11:36:59 -07:00
xfs_inode_util.h xfs: hoist inode free function to libxfs 2024-07-02 11:36:59 -07:00
xfs_log_format.h xfs: record inode generation in xattr update log intent items 2024-04-23 07:46:57 -07:00
xfs_log_recover.h xfs: capture inode generation numbers in the ondisk exchmaps log item 2024-04-15 14:54:24 -07:00
xfs_log_rlimit.c xfs: drop compatibility minimum log size computations for reflink 2024-04-23 07:47:01 -07:00
xfs_ondisk.h xfs: don't use the incore struct xfs_sb for offsets into struct xfs_dsb 2024-07-02 11:37:00 -07:00
xfs_parent.c xfs: add raw parent pointer apis to support repair 2024-04-23 07:47:04 -07:00
xfs_parent.h xfs: add raw parent pointer apis to support repair 2024-04-23 07:47:04 -07:00
xfs_quota_defs.h xfs: remove unused parameter in macro XFS_DQUOT_LOGRES 2024-07-29 09:29:31 +05:30
xfs_refcount_btree.c xfs: convert "skip_discard" to a proper flags bitset 2024-07-02 11:37:01 -07:00
xfs_refcount_btree.h xfs: remove xfs_refcountbt_stage_cursor 2024-02-22 12:39:40 -08:00
xfs_refcount.c xfs: move xfs_refcount_update_defer_add to xfs_refcount_item.c 2024-07-02 11:37:07 -07:00
xfs_refcount.h xfs: move xfs_refcount_update_defer_add to xfs_refcount_item.c 2024-07-02 11:37:07 -07:00
xfs_rmap_btree.c xfs: get rid of xfs_ag_resv_rmapbt_alloc 2024-07-04 14:36:13 +05:30
xfs_rmap_btree.h xfs: create a shadow rmap btree during rmap repair 2024-02-22 12:43:39 -08:00
xfs_rmap.c xfs: move xfs_rmap_update_defer_add to xfs_rmap_item.c 2024-07-02 11:37:05 -07:00
xfs_rmap.h xfs: move xfs_rmap_update_defer_add to xfs_rmap_item.c 2024-07-02 11:37:05 -07:00
xfs_rtbitmap.c xfs: refactor realtime inode locking 2024-04-22 18:00:47 +05:30
xfs_rtbitmap.h xfs: refactor realtime inode locking 2024-04-22 18:00:47 +05:30
xfs_sb.c xfs: make sure sb_fdblocks is non-negative 2024-06-10 11:38:12 +05:30
xfs_sb.h xfs: allow sunit mount option to repair bad primary sb stripe values 2024-03-25 10:17:18 +05:30
xfs_shared.h xfs: hoist new inode initialization functions to libxfs 2024-07-02 11:36:57 -07:00
xfs_symlink_remote.c xfs: pass the owner to xfs_symlink_write_target 2024-04-15 14:58:57 -07:00
xfs_symlink_remote.h xfs: pass the owner to xfs_symlink_write_target 2024-04-15 14:58:57 -07:00
xfs_trans_inode.c xfs: implement atime updates in xfs_trans_ichgtime 2024-07-02 11:36:56 -07:00
xfs_trans_resv.c xfs: remove unused parameter in macro XFS_DQUOT_LOGRES 2024-07-29 09:29:31 +05:30
xfs_trans_resv.h xfs: rename xfs_*alloc*_log_count to _block_count 2022-04-28 10:25:59 -07:00
xfs_trans_space.c xfs: Add parent pointers to rename 2024-04-23 07:46:59 -07:00
xfs_trans_space.h xfs: Add parent pointers to rename 2024-04-23 07:46:59 -07:00
xfs_types.c xfs: rename xfs_verify_rtext to xfs_verify_rtbext 2023-10-17 16:24:22 -07:00
xfs_types.h xfs: remove xfs_btnum_t 2024-02-22 12:40:51 -08:00