linux/fs/xfs
Darrick J. Wong 3fb84dfb97 xfs: fix online repair probing when CONFIG_XFS_ONLINE_REPAIR=n
commit 66314e9a57 upstream.

I received a report from the release engineering side of the house that
xfs_scrub without the -n flag (aka fix it mode) would try to fix a
broken filesystem even on a kernel that doesn't have online repair built
into it:

 # xfs_scrub -dTvn /mnt/test
 EXPERIMENTAL xfs_scrub program in use! Use at your own risk!
 Phase 1: Find filesystem geometry.
 /mnt/test: using 1 threads to scrub.
 Phase 1: Memory used: 132k/0k (108k/25k), time:  0.00/ 0.00/ 0.00s
 <snip>
 Phase 4: Repair filesystem.
 <snip>
 Info: /mnt/test/some/victimdir directory entries: Attempting repair. (repair.c line 351)
 Corruption: /mnt/test/some/victimdir directory entries: Repair unsuccessful; offline repair required. (repair.c line 204)

Source: https://blogs.oracle.com/linux/post/xfs-online-filesystem-repair

It is strange that xfs_scrub doesn't refuse to run, because the kernel
is supposed to return EOPNOTSUPP if we actually needed to run a repair,
and xfs_io's repair subcommand will perror that.  And yet:

 # xfs_io -x -c 'repair probe' /mnt/test
 #

The first problem is commit dcb660f922 (4.15) which should have had
xchk_probe set the CORRUPT OFLAG so that any of the repair machinery
will get called at all.

It turns out that some refactoring that happened in the 6.6-6.8 era
broke the operation of this corner case.  What we *really* want to
happen is that all the predicates that would steer xfs_scrub_metadata()
towards calling xrep_attempt() should function the same way that they do
when repair is compiled in; and then xrep_attempt gets to return the
fatal EOPNOTSUPP error code that causes the probe to fail.

Instead, commit 8336a64eb7 (6.6) started the failwhale swimming by
hoisting OFLAG checking logic into a helper whose non-repair stub always
returns false, causing scrub to return "repair not needed" when in fact
the repair is not supported.  Prior to that commit, the oflag checking
that was open-coded in scrub.c worked correctly.

Similarly, in commit 4bdfd7d157 (6.8) we hoisted the IFLAG_REPAIR
and ALREADY_FIXED logic into a helper whose non-repair stub always
returns false, so we never enter the if test body that would have called
xrep_attempt, let alone fail to decode the OFLAGs correctly.

The final insult (yes, we're doing The Naked Gun now) is commit
48a72f6086 (6.8) in which we hoisted the "are we going to try a
repair?" predicate into yet another function with a non-repair stub
always returns false.

Fix xchk_probe to trigger xrep_probe if repair is enabled, or return
EOPNOTSUPP directly if it is not.  For all the other scrub types, we
need to fix the header predicates so that the ->repair functions (which
are all xrep_notsupported) get called to return EOPNOTSUPP.  Commit
48a72 is tagged here because the scrub code prior to LTS 6.12 are
incomplete and not worth patching.

Reported-by: David Flynn <david.flynn@oracle.com>
Cc: <stable@vger.kernel.org> # v6.8
Fixes: 8336a64eb7 ("xfs: don't complain about unfixed metadata when repairs were injected")
Signed-off-by: "Darrick J. Wong" <djwong@kernel.org>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Carlos Maiolino <cem@kernel.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
History 2025-02-27 04:30:22 -08:00
..
libxfs xfs: fix sb_spino_align checks for large fsblock sizes 2024-12-27 14:02:01 +01:00
scrub xfs: fix online repair probing when CONFIG_XFS_ONLINE_REPAIR=n 2025-02-27 04:30:22 -08:00
Kconfig xfs: verify buffer, inode, and dquot items every tx commit 2024-07-02 11:36:54 -07:00
Makefile xfs: hoist inode flag conversion functions to libxfs 2024-07-02 11:36:55 -07:00
xfs.h xfs: verify buffer, inode, and dquot items every tx commit 2024-07-02 11:36:54 -07:00
xfs_acl.c xfs: make attr removal an explicit operation 2024-04-23 07:46:51 -07:00
xfs_acl.h fs: port ->set_acl() to pass mnt_idmap 2023-01-19 09:24:27 +01:00
xfs_aops.c xfs: support the COW fork in xfs_bmap_punch_delalloc_range 2024-10-15 11:37:42 +02:00
xfs_aops.h xfs: add a xfs_inode_buftarg helper 2019-10-28 08:37:54 -07:00
xfs_attr_inactive.c xfs: report dir/attr block corruption errors to the health system 2024-02-22 12:32:18 -08:00
xfs_attr_item.c xfs: fix xfs_init_attr_trans not handling explicit operation codes 2024-05-27 15:55:52 +05:30
xfs_attr_item.h xfs: create attr log item opcodes and formats for parent pointers 2024-04-23 07:46:57 -07:00
xfs_attr_list.c xfs: convert comma to semicolon 2024-07-29 09:32:53 +05:30
xfs_bio_io.c fs/xfs: Use the enum req_op and blk_opf_t types 2022-07-14 12:14:33 -06:00
xfs_bmap_item.c xfs: ensure st_blocks never goes to zero during COW writes 2024-09-03 10:07:47 +05:30
xfs_bmap_item.h xfs: move xfs_bmap_defer_add to xfs_bmap_item.c 2024-02-22 12:44:21 -08:00
xfs_bmap_util.c xfs: return a 64-bit block count from xfs_btree_count_blocks 2024-12-19 18:13:08 +01:00
xfs_bmap_util.h xfs: support the COW fork in xfs_bmap_punch_delalloc_range 2024-10-15 11:37:42 +02:00
xfs_buf.c xfs: check for dead buffers in xfs_buf_find_insert 2025-02-08 09:58:13 +01:00
xfs_buf.h treewide: Fix wrong singular form of jiffies in comments 2024-09-08 20:47:40 +02:00
xfs_buf_item.c xfs: verify buffer, inode, and dquot items every tx commit 2024-07-02 11:36:54 -07:00
xfs_buf_item.h xfs: convert buffer log item flags to unsigned. 2022-04-21 10:46:40 +10:00
xfs_buf_item_recover.c xfs: fix mount hang during primary superblock recovery failure 2025-02-17 10:05:46 +01:00
xfs_buf_mem.c mm,tmpfs: consider end of file write in shmem_is_huge 2024-09-09 16:39:12 -07:00
xfs_buf_mem.h xfs: launder in-memory btree buffers before transaction commit 2024-02-22 12:43:36 -08:00
xfs_dahash_test.c xfs: test the ascii case-insensitive hash 2023-04-11 19:05:05 -07:00
xfs_dahash_test.h xfs: test dir/attr hash when loading module 2023-03-19 09:55:49 -07:00
xfs_dir2_readdir.c xfs: refactor dir format helpers 2024-04-26 11:21:46 +05:30
xfs_discard.c xfs: fix FITRIM reporting again 2024-09-01 08:58:20 -07:00
xfs_discard.h xfs: move log discard work to xfs_discard.c 2023-10-04 09:24:02 +11:00
xfs_dquot.c xfs: lock dquot buffer before detaching dquot from b_li_list 2025-02-17 10:05:46 +01:00
xfs_dquot.h xfs: convert quotacheck to attach dquot buffers 2025-02-17 10:05:45 +01:00
xfs_dquot_item.c xfs: attach dquot buffer to dquot log item buffer 2025-02-17 10:05:45 +01:00
xfs_dquot_item.h xfs: attach dquot buffer to dquot log item buffer 2025-02-17 10:05:45 +01:00
xfs_dquot_item_recover.c xfs: dquot recovery does not validate the recovered dquot 2023-11-22 23:39:36 +05:30
xfs_drain.c xfs: pass the fsbno to xfs_perag_intent_get 2024-07-02 11:37:01 -07:00
xfs_drain.h xfs: pass the fsbno to xfs_perag_intent_get 2024-07-02 11:37:01 -07:00
xfs_error.c xfs: add error injection to test file mapping exchange recovery 2024-04-15 14:54:19 -07:00
xfs_error.h xfs: allow setting full range of panic tags 2023-02-09 18:36:17 -08:00
xfs_exchmaps_item.c xfs: capture inode generation numbers in the ondisk exchmaps log item 2024-04-15 14:54:24 -07:00
xfs_exchmaps_item.h xfs: create deferred log items for file mapping exchanges 2024-04-15 14:54:17 -07:00
xfs_exchrange.c xfs: don't call remap_verify_area with sb write protection held 2025-02-17 10:05:29 +01:00
xfs_exchrange.h xfs: introduce new file range commit ioctls 2024-09-01 08:58:19 -07:00
xfs_export.c xfs: add parent pointer ioctls 2024-04-23 07:47:00 -07:00
xfs_export.h xfs: add parent pointer ioctls 2024-04-23 07:47:00 -07:00
xfs_extent_busy.c xfs: unwind xfs_extent_busy_clear 2024-04-22 12:53:34 +05:30
xfs_extent_busy.h xfs: repair free space btrees 2023-12-15 10:03:32 -08:00
xfs_extfree_item.c xfs: move xfs_extent_free_defer_add to xfs_extfree_item.c 2024-07-02 11:37:03 -07:00
xfs_extfree_item.h xfs: move xfs_extent_free_defer_add to xfs_extfree_item.c 2024-07-02 11:37:03 -07:00
xfs_file.c xfs: don't drop errno values when we fail to ficlone the entire range 2024-12-19 18:13:08 +01:00
xfs_file.h xfs: create a new helper to return a file's allocation unit 2024-04-15 14:54:10 -07:00
xfs_filestream.c xfs: streamline xfs_filestream_pick_ag 2024-10-30 11:27:18 +01:00
xfs_filestream.h xfs: pass perag to filestreams tracing 2023-02-13 09:14:56 +11:00
xfs_fsmap.c xfs: fix off-by-one error in fsmap's end_daddr usage 2024-12-27 14:02:00 +01:00
xfs_fsmap.h xfs: move xfs_ioc_getfsmap out of xfs_ioctl.c 2024-09-01 08:58:19 -07:00
xfs_fsops.c xfs: merge the perag freeing helpers 2024-10-22 13:37:18 +02:00
xfs_fsops.h xfs: split xfs_mod_freecounter 2024-04-22 18:00:47 +05:30
xfs_globals.c xfs: add debug knobs to control btree bulk load slack factors 2023-12-15 10:03:28 -08:00
xfs_handle.c struct fd: representation change 2024-08-12 22:01:05 -04:00
xfs_handle.h xfs: add parent pointer ioctls 2024-04-23 07:47:00 -07:00
xfs_health.c xfs: report directory tree corruption in the health information 2024-04-23 16:55:17 -07:00
xfs_hooks.c xfs: allow scrub to hook metadata updates in other writers 2024-02-22 12:30:45 -08:00
xfs_hooks.h xfs: allow scrub to hook metadata updates in other writers 2024-02-22 12:30:45 -08:00
xfs_icache.c xfs: don't free cowblocks from under dirty pagecache on unshare 2024-10-09 10:05:10 +02:00
xfs_icache.h xfs: use per-mount cpumask to track nonempty percpu inodegc lists 2023-09-11 08:39:03 -07:00
xfs_icreate_item.c xfs: convert kmem_free() for kvmalloc users to kvfree() 2024-02-13 18:07:34 +05:30
xfs_icreate_item.h xfs: rename _zone variables to _cache 2021-10-22 16:04:20 -07:00
xfs_inode.c xfs: Add error handling for xfs_reflink_cancel_cow_range 2025-02-17 10:05:30 +01:00
xfs_inode.h xfs: Check for delayed allocations before setting extsize 2024-10-30 11:27:18 +01:00
xfs_inode_item.c xfs: skip flushing log items during push 2024-07-04 12:46:47 +05:30
xfs_inode_item.h xfs: fix AGF vs inode cluster buffer deadlock 2023-06-05 04:08:27 +10:00
xfs_inode_item_recover.c xfs: convert remaining kmem_free() to kfree() 2024-02-13 18:07:34 +05:30
xfs_ioctl.c xfs: Check for delayed allocations before setting extsize 2024-10-30 11:27:18 +01:00
xfs_ioctl.h xfs: move handle ioctl code to xfs_handle.c 2024-04-23 07:47:00 -07:00
xfs_ioctl32.c xfs: move handle ioctl code to xfs_handle.c 2024-04-23 07:47:00 -07:00
xfs_ioctl32.h arch: Remove Itanium (IA-64) architecture 2023-09-11 08:13:17 +00:00
xfs_iomap.c xfs: Propagate errors from xfs_reflink_cancel_cow_range in xfs_dax_write_iomap_end 2025-02-17 10:05:30 +01:00
xfs_iomap.h xfs: use iomap_valid method to detect stale cached iomaps 2022-11-29 09:09:17 +11:00
xfs_iops.c iomap: fix handling of dirty folios over unwritten extents 2024-09-03 15:01:24 +02:00
xfs_iops.h xfs: declare xfs_file.c symbols in xfs_file.h 2024-04-15 14:54:09 -07:00
xfs_itable.c xfs: hide private inodes from bulkstat and handle functions 2024-04-15 14:58:48 -07:00
xfs_itable.h fs: port i_{g,u}id_into_vfs{g,u}id() to mnt_idmap 2023-01-19 09:24:29 +01:00
xfs_iunlink_item.c xfs: create traced helper to get extra perag references 2023-04-11 18:59:55 -07:00
xfs_iunlink_item.h xfs: add in-memory iunlink log item 2022-07-14 11:47:42 +10:00
xfs_iwalk.c xfs: Clear W=1 warning in xfs_iwalk_run_callbacks() 2024-05-27 15:54:24 +05:30
xfs_iwalk.h xfs: Decouple XFS_IBULK flags from XFS_IWALK flags 2022-04-13 07:02:44 +00:00
xfs_linux.h move asm/unaligned.h to linux/unaligned.h 2024-10-02 17:23:23 -04:00
xfs_log.c xfs: Use xfs set and clear mp state helpers 2024-09-03 10:07:39 +05:30
xfs_log.h xfs: Remove empty declartion in header file 2024-10-07 08:00:11 +02:00
xfs_log_cil.c xfs: Use try_cmpxchg() in xlog_cil_insert_pcp_aggregate() 2024-10-07 08:00:11 +02:00
xfs_log_priv.h xfs: grant heads track byte counts, not LSNs 2024-07-04 12:46:47 +05:30
xfs_log_recover.c xfs: update the file system geometry after recoverying superblock buffers 2024-10-22 13:37:18 +02:00
xfs_message.c Merge branch 'guilt/xfs-unsigned-flags-5.18' into xfs-5.19-for-next 2022-04-21 16:45:03 +10:00
xfs_message.h xfs: implement per-mount warnings for scrub and shrink usage 2022-05-27 10:31:34 +10:00
xfs_mount.c xfs: merge the perag freeing helpers 2024-10-22 13:37:18 +02:00
xfs_mount.h xfs: convert perag lookup to xarray 2024-09-03 10:07:46 +05:30
xfs_mru_cache.c xfs: use LIST_HEAD() to simplify code 2024-09-03 10:07:42 +05:30
xfs_mru_cache.h xfs: convert to SPDX license tags 2018-06-06 14:17:53 -07:00
xfs_notify_failure.c xfs: don't shut down the filesystem for media failures beyond end of log 2025-02-08 09:58:13 +01:00
xfs_pnfs.c fs: port ->setattr() to pass mnt_idmap 2023-01-19 09:24:02 +01:00
xfs_pnfs.h xfs: prepare xfs_break_layouts() for another layout type 2018-05-22 07:19:08 -07:00
xfs_pwork.c xfs: increase the default parallelism levels of pwork clients 2021-02-03 09:18:49 -08:00
xfs_pwork.h xfs: increase the default parallelism levels of pwork clients 2021-02-03 09:18:49 -08:00
xfs_qm.c xfs: convert quotacheck to attach dquot buffers 2025-02-17 10:05:45 +01:00
xfs_qm.h xfs: refactor loading quota inodes in the regular case 2024-09-01 08:58:20 -07:00
xfs_qm_bhv.c xfs: don't over-report free space or inodes in statvfs 2025-02-17 10:04:57 +01:00
xfs_qm_syscalls.c xfs: refactor loading quota inodes in the regular case 2024-09-01 08:58:20 -07:00
xfs_quota.h xfs: don't lose solo dquot update transactions 2025-02-18 09:34:42 +01:00
xfs_quotaops.c xfs: refactor loading quota inodes in the regular case 2024-09-01 08:58:20 -07:00
xfs_refcount_item.c xfs: move xfs_refcount_update_defer_add to xfs_refcount_item.c 2024-07-02 11:37:07 -07:00
xfs_refcount_item.h xfs: move xfs_refcount_update_defer_add to xfs_refcount_item.c 2024-07-02 11:37:07 -07:00
xfs_reflink.c xfs: don't free cowblocks from under dirty pagecache on unshare 2024-10-09 10:05:10 +02:00
xfs_reflink.h xfs: don't free cowblocks from under dirty pagecache on unshare 2024-10-09 10:05:10 +02:00
xfs_rmap_item.c xfs: move xfs_rmap_update_defer_add to xfs_rmap_item.c 2024-07-02 11:37:05 -07:00
xfs_rmap_item.h xfs: move xfs_rmap_update_defer_add to xfs_rmap_item.c 2024-07-02 11:37:05 -07:00
xfs_rtalloc.c xfs: fix null bno_hint handling in xfs_rtallocate_rtg 2024-12-19 18:13:08 +01:00
xfs_rtalloc.h xfs: move xfs_bmap_rtalloc to xfs_rtalloc.c 2023-12-22 11:18:11 +05:30
xfs_stats.c xfs: define an in-memory btree for storing refcount bag info during repairs 2024-02-22 12:43:40 -08:00
xfs_stats.h xfs: define an in-memory btree for storing refcount bag info during repairs 2024-02-22 12:43:40 -08:00
xfs_super.c xfs: report realtime block quota limits on realtime directories 2025-02-17 10:04:57 +01:00
xfs_super.h xfs: create scaffolding for creating debugfs entries 2023-08-10 07:48:07 -07:00
xfs_symlink.c xfs: pass the icreate args object to xfs_dialloc 2024-09-01 08:58:19 -07:00
xfs_symlink.h xfs: move remote symlink target read function to libxfs 2024-02-22 12:45:17 -08:00
xfs_sysctl.c sysctl: treewide: constify the ctl_table argument of proc_handlers 2024-07-24 20:59:29 +02:00
xfs_sysctl.h xfs: add debug knobs to control btree bulk load slack factors 2023-12-15 10:03:28 -08:00
xfs_sysfs.c xfs: grant heads track byte counts, not LSNs 2024-07-04 12:46:47 +05:30
xfs_sysfs.h xfs: make kobj_type structures constant 2023-02-10 08:59:48 -08:00
xfs_trace.c xfs: l_last_sync_lsn is really AIL state 2024-07-04 12:46:46 +05:30
xfs_trace.h xfs: fix finding a last resort AG in xfs_filestream_pick_ag 2024-10-30 11:27:18 +01:00
xfs_trans.c xfs: don't lose solo dquot update transactions 2025-02-18 09:34:42 +01:00
xfs_trans.h xfs: skip flushing log items during push 2024-07-04 12:46:47 +05:30
xfs_trans_ail.c xfs: attach dquot buffer to dquot log item buffer 2025-02-17 10:05:45 +01:00
xfs_trans_buf.c xfs: launder in-memory btree buffers before transaction commit 2024-02-22 12:43:36 -08:00
xfs_trans_dquot.c xfs: don't lose solo dquot update transactions 2025-02-18 09:34:42 +01:00
xfs_trans_priv.h xfs: l_last_sync_lsn is really AIL state 2024-07-04 12:46:46 +05:30
xfs_xattr.c xfs: allow SECURE namespace xattrs to use reserved block pool 2024-07-29 09:26:20 +05:30
xfs_xattr.h xfs: remove xfs_da_args.attr_flags 2024-04-23 07:46:50 -07:00