linux/fs/xfs/libxfs
Dave Chinner 75bcffbb9e xfs: shrink failure needs to hold AGI buffer
Chandan reported a AGI/AGF lock order hang on xfs/168 during recent
testing. The cause of the problem was the task running xfs_growfs
to shrink the filesystem. A failure occurred trying to remove the
free space from the btrees that the shrink would make disappear,
and that meant it ran the error handling for a partial failure.

This error path involves restoring the per-ag block reservations,
and that requires calculating the amount of space needed to be
reserved for the free inode btree. The growfs operation hung here:

[18679.536829]  down+0x71/0xa0
[18679.537657]  xfs_buf_lock+0xa4/0x290 [xfs]
[18679.538731]  xfs_buf_find_lock+0xf7/0x4d0 [xfs]
[18679.539920]  xfs_buf_lookup.constprop.0+0x289/0x500 [xfs]
[18679.542628]  xfs_buf_get_map+0x2b3/0xe40 [xfs]
[18679.547076]  xfs_buf_read_map+0xbb/0x900 [xfs]
[18679.562616]  xfs_trans_read_buf_map+0x449/0xb10 [xfs]
[18679.569778]  xfs_read_agi+0x1cd/0x500 [xfs]
[18679.573126]  xfs_ialloc_read_agi+0xc2/0x5b0 [xfs]
[18679.578708]  xfs_finobt_calc_reserves+0xe7/0x4d0 [xfs]
[18679.582480]  xfs_ag_resv_init+0x2c5/0x490 [xfs]
[18679.586023]  xfs_ag_shrink_space+0x736/0xd30 [xfs]
[18679.590730]  xfs_growfs_data_private.isra.0+0x55e/0x990 [xfs]
[18679.599764]  xfs_growfs_data+0x2f1/0x410 [xfs]
[18679.602212]  xfs_file_ioctl+0xd1e/0x1370 [xfs]

trying to get the AGI lock. The AGI lock was held by a fstress task
trying to do an inode allocation, and it was waiting on the AGF
lock to allocate a new inode chunk on disk. Hence deadlock.

The fix for this is for the growfs code to hold the AGI over the
transaction roll it does in the error path. It already holds the AGF
locked across this, and that is what causes the lock order inversion
in the xfs_ag_resv_init() call.

Reported-by: Chandan Babu R <chandanbabu@kernel.org>
Fixes: 46141dc891 ("xfs: introduce xfs_ag_shrink_space()")
Signed-off-by: Dave Chinner <dchinner@redhat.com>
Reviewed-by: Gao Xiang <hsiangkao@linux.alibaba.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Chandan Babu R <chandanbabu@kernel.org>
2024-03-07 14:59:05 +05:30
..
xfs_ag_resv.c xfs: repair free space btrees 2023-12-15 10:03:32 -08:00
xfs_ag_resv.h xfs: move perag structure and setup to libxfs/xfs_ag.[ch] 2021-06-02 10:48:24 +10:00
xfs_ag.c xfs: shrink failure needs to hold AGI buffer 2024-03-07 14:59:05 +05:30
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: rename btree helpers that depends on the block number representation 2024-02-22 12:40:58 -08:00
xfs_alloc_btree.h xfs: split xfs_allocbt_init_cursor 2024-02-22 12:40:12 -08:00
xfs_alloc.c xfs: remove xfs_btnum_t 2024-02-22 12:40:51 -08:00
xfs_alloc.h xfs: repair free space btrees 2023-12-15 10:03:32 -08:00
xfs_attr_leaf.c xfs: report dir/attr block corruption errors to the health system 2024-02-22 12:32:18 -08:00
xfs_attr_leaf.h xfs: remove struct xfs_attr_shortform 2023-12-29 13:37:05 +05:30
xfs_attr_remote.c xfs: report XFS_IS_CORRUPT errors to the health system 2024-02-22 12:32:55 -08:00
xfs_attr_remote.h xfs: rename struct xfs_attr_item to xfs_attr_intent 2022-05-22 16:00:26 +10:00
xfs_attr_sf.h xfs: remove xfs_attr_sf_hdr_t 2023-12-29 13:37:05 +05:30
xfs_attr.c xfs: Replace xfs_isilocked with xfs_assert_ilocked 2024-02-19 21:19:33 +05:30
xfs_attr.h xfs: replace XFS_IFORK_Q with a proper predicate function 2022-07-12 11:17:27 -07:00
xfs_bit.c
xfs_bit.h
xfs_bmap_btree.c xfs: rename btree helpers that depends on the block number representation 2024-02-22 12:40:58 -08:00
xfs_bmap_btree.h xfs: remove xfs_bmbt_stage_cursor 2024-02-22 12:39:45 -08:00
xfs_bmap.c xfs: move xfs_symlink_remote.c declarations to xfs_symlink_remote.h 2024-02-22 12:45:01 -08:00
xfs_bmap.h xfs: support deferred bmap updates on the attr fork 2024-02-22 12:44:32 -08: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: support in-memory btrees 2024-02-22 12:43:35 -08:00
xfs_btree.h xfs: support in-memory btrees 2024-02-22 12:43:35 -08:00
xfs_cksum.h
xfs_da_btree.c xfs: report dir/attr block corruption errors to the health system 2024-02-22 12:32:18 -08:00
xfs_da_btree.h xfs: extract xfs_da_buf_copy() helper function 2023-12-07 14:57:14 +05:30
xfs_da_format.h xfs: create a macro for decoding ftypes in tracepoints 2024-02-22 12:30:50 -08:00
xfs_defer.c xfs: Replace xfs_isilocked with xfs_assert_ilocked 2024-02-19 21:19:33 +05:30
xfs_defer.h xfs: pass the defer ops directly to xfs_defer_add 2023-12-14 11:13:52 +05:30
xfs_dir2_block.c xfs: report dir/attr block corruption errors to the health system 2024-02-22 12:32:18 -08:00
xfs_dir2_data.c xfs: report dir/attr block corruption errors to the health system 2024-02-22 12:32:18 -08:00
xfs_dir2_leaf.c xfs: report dir/attr block corruption errors to the health system 2024-02-22 12:32:18 -08:00
xfs_dir2_node.c xfs: report dir/attr block corruption errors to the health system 2024-02-22 12:32:18 -08:00
xfs_dir2_priv.h xfs: zap broken inode forks 2023-12-15 10:03:37 -08:00
xfs_dir2_sf.c xfs: convert remaining kmem_free() to kfree() 2024-02-13 18:07:34 +05:30
xfs_dir2.c xfs: report dir/attr block corruption errors to the health system 2024-02-22 12:32:18 -08:00
xfs_dir2.h xfs: create a predicate to determine if two xfs_names are the same 2024-02-22 12:30:49 -08: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 debug knob to slow down write for fun 2022-11-28 17:54:49 -08:00
xfs_format.h xfs: split the agf_roots and agf_levels arrays 2024-02-22 12:39:46 -08:00
xfs_fs.h xfs: update health status if we get a clean bill of health 2024-02-22 12:33:04 -08:00
xfs_health.h xfs: remember sick inodes that get inactivated 2024-02-22 12:33:03 -08:00
xfs_ialloc_btree.c xfs: rename btree helpers that depends on the block number representation 2024-02-22 12:40:58 -08:00
xfs_ialloc_btree.h xfs: split xfs_inobt_init_cursor 2024-02-22 12:40:49 -08:00
xfs_ialloc.c xfs: remove xfs_btnum_t 2024-02-22 12:40:51 -08:00
xfs_ialloc.h xfs: repair inode btrees 2023-12-15 10:03:32 -08: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: remember sick inodes that get inactivated 2024-02-22 12:33:03 -08:00
xfs_inode_buf.h xfs: kill xfs_sb_version_has_v3inode() 2021-08-19 10:07:14 -07:00
xfs_inode_fork.c xfs: move xfs_symlink_remote.c declarations to xfs_symlink_remote.h 2024-02-22 12:45:01 -08:00
xfs_inode_fork.h xfs: create a helper to decide if a file mapping targets the rt volume 2024-02-22 12:43:36 -08:00
xfs_log_format.h xfs: add a realtime flag to the bmap update log redo items 2024-02-22 12:44:23 -08:00
xfs_log_recover.h xfs: pass the defer ops instead of type to xfs_defer_start_recovery 2023-12-14 11:13:38 +05:30
xfs_log_rlimit.c xfs: reduce transaction reservations with reflink 2022-04-28 10:25:42 -07:00
xfs_ondisk.h xfs: remove struct xfs_attr_shortform 2023-12-29 13:37:05 +05:30
xfs_quota_defs.h xfs: remove warning counters from struct xfs_dquot_res 2022-05-11 17:12:09 +10:00
xfs_refcount_btree.c xfs: rename btree helpers that depends on the block number representation 2024-02-22 12:40:58 -08:00
xfs_refcount_btree.h xfs: remove xfs_refcountbt_stage_cursor 2024-02-22 12:39:40 -08:00
xfs_refcount.c xfs: split the per-btree union in struct xfs_btree_cur 2024-02-22 12:37:03 -08:00
xfs_refcount.h xfs: create a ranged query function for refcount btrees 2023-12-15 10:03:40 -08:00
xfs_rmap_btree.c xfs: create a shadow rmap btree during rmap repair 2024-02-22 12:43:39 -08:00
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: hook live rmap operations during a repair operation 2024-02-22 12:43:40 -08:00
xfs_rmap.h xfs: hook live rmap operations during a repair operation 2024-02-22 12:43:40 -08:00
xfs_rtbitmap.c xfs: report realtime metadata corruption errors to the health system 2024-02-22 12:32:44 -08:00
xfs_rtbitmap.h xfs: remove conditional building of rt geometry validator functions 2024-01-30 14:04:43 +05:30
xfs_sb.c xfs: report ag header corruption errors to the health tracking system 2024-02-22 12:31:03 -08:00
xfs_sb.h xfs: remove conditional building of rt geometry validator functions 2024-01-30 14:04:43 +05:30
xfs_shared.h xfs: move xfs_symlink_remote.c declarations to xfs_symlink_remote.h 2024-02-22 12:45:01 -08:00
xfs_symlink_remote.c xfs: move symlink target write function to libxfs 2024-02-22 12:52:37 -08:00
xfs_symlink_remote.h xfs: move symlink target write function to libxfs 2024-02-22 12:52:37 -08:00
xfs_trans_inode.c xfs: Replace xfs_isilocked with xfs_assert_ilocked 2024-02-19 21:19:33 +05:30
xfs_trans_resv.c xfs: create helpers for rtbitmap block/wordcount computations 2023-10-18 10:58:58 -07:00
xfs_trans_resv.h xfs: rename xfs_*alloc*_log_count to _block_count 2022-04-28 10:25:59 -07:00
xfs_trans_space.h xfs: compute the maximum height of the rmap btree when reflink enabled 2021-10-19 11:45:16 -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