OpenCloudOS-Kernel/fs/xfs/libxfs
Dave Chinner e55ec4ddbe xfs: fix error handling in xfs_bmap_extents_to_btree
Commit 01239d77b9 ("xfs: fix a null pointer dereference in
xfs_bmap_extents_to_btree") attempted to fix a null pointer
dreference when a fuzzing corruption of some kind was found.
This fix was flawed, resulting in assert failures like:

XFS: Assertion failed: ifp->if_broot == NULL, file: fs/xfs/libxfs/xfs_bmap.c, line: 715
.....
Call Trace:
  xfs_bmap_extents_to_btree+0x6b9/0x7b0
  __xfs_bunmapi+0xae7/0xf00
  ? xfs_log_reserve+0x1c8/0x290
  xfs_reflink_remap_extent+0x20b/0x620
  xfs_reflink_remap_blocks+0x7e/0x290
  xfs_reflink_remap_range+0x311/0x530
  vfs_dedupe_file_range_one+0xd7/0xe0
  vfs_dedupe_file_range+0x15b/0x1a0
  do_vfs_ioctl+0x267/0x6c0

The problem is that the error handling code now asserts that the
inode fork is not in btree format before the error handling code
undoes the modifications that put the fork back in extent format.
Fix this by moving the assert back to after the xfs_iroot_realloc()
call that returns the fork to extent format, and clean up the jump
labels to be meaningful.

Also, returning ENOSPC when xfs_btree_get_bufl() fails to
instantiate the buffer that was allocated (the actual fix in the
commit mentioned above) is incorrect. This is a fatal error - only
an invalid block address or a filesystem shutdown can result in
failing to get a buffer here.

Hence change this to EFSCORRUPTED so that the higher layer knows
this was a corruption related failure and should not treat it as an
ENOSPC error.  This should result in a shutdown (via cancelling a
dirty transaction) which is necessary as we do not attempt to clean
up the (invalid) block that we have already allocated.

Signed-off-by: Dave Chinner <dchinner@redhat.com>
Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com>
Signed-off-by: Dave Chinner <david@fromorbit.com>
2018-10-01 08:11:07 +10:00
..
xfs_ag.c xfs: factor the ag length extension code into libxfs 2018-05-15 18:12:51 -07:00
xfs_ag.h xfs: factor the ag length extension code into libxfs 2018-05-15 18:12:51 -07:00
xfs_ag_resv.c xfs: pass transaction lock while setting up agresv on cyclic metadata 2018-07-29 22:37:08 -07:00
xfs_ag_resv.h xfs: pass transaction lock while setting up agresv on cyclic metadata 2018-07-29 22:37:08 -07:00
xfs_alloc.c xfs: always defer agfl block frees 2018-08-02 23:05:14 -07:00
xfs_alloc.h xfs: remove xfs_alloc_arg firstblock field 2018-07-11 22:26:30 -07:00
xfs_alloc_btree.c xfs: convert to SPDX license tags 2018-06-06 14:17:53 -07:00
xfs_alloc_btree.h xfs: convert to SPDX license tags 2018-06-06 14:17:53 -07:00
xfs_attr.c xfs: remove last of unnecessary xfs_defer_cancel() callers 2018-09-29 13:41:58 +10:00
xfs_attr_leaf.c xfs: refactor log recovery check 2018-08-01 07:40:48 -07:00
xfs_attr_leaf.h xfs: convert to SPDX license tags 2018-06-06 14:17:53 -07:00
xfs_attr_remote.c xfs: remove last of unnecessary xfs_defer_cancel() callers 2018-09-29 13:41:58 +10:00
xfs_attr_remote.h xfs: convert to SPDX license tags 2018-06-06 14:17:53 -07:00
xfs_attr_sf.h xfs: convert to SPDX license tags 2018-06-06 14:17:53 -07:00
xfs_bit.c xfs: convert to SPDX license tags 2018-06-06 14:17:53 -07:00
xfs_bit.h xfs: convert to SPDX license tags 2018-06-06 14:17:53 -07:00
xfs_bmap.c xfs: fix error handling in xfs_bmap_extents_to_btree 2018-10-01 08:11:07 +10:00
xfs_bmap.h xfs: pass transaction to xfs_defer_add() 2018-08-02 23:05:14 -07:00
xfs_bmap_btree.c xfs: pass transaction to xfs_defer_add() 2018-08-02 23:05:14 -07:00
xfs_bmap_btree.h xfs: convert to SPDX license tags 2018-06-06 14:17:53 -07:00
xfs_btree.c xfs: convert to SPDX license tags 2018-06-06 14:17:53 -07:00
xfs_btree.h xfs: fold dfops into the transaction 2018-08-02 23:05:14 -07:00
xfs_cksum.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
xfs_da_btree.c xfs: check da node magic in _node_lookup_int 2018-08-01 07:42:43 -07:00
xfs_da_btree.h xfs: fold dfops into the transaction 2018-08-02 23:05:14 -07:00
xfs_da_format.c xfs: convert to SPDX license tags 2018-06-06 14:17:53 -07:00
xfs_da_format.h xfs: convert to SPDX license tags 2018-06-06 14:17:53 -07:00
xfs_defer.c xfs: fold dfops into the transaction 2018-08-02 23:05:14 -07:00
xfs_defer.h xfs: fold dfops into the transaction 2018-08-02 23:05:14 -07:00
xfs_dir2.c xfs: fold dfops into the transaction 2018-08-02 23:05:14 -07:00
xfs_dir2.h xfs: fold dfops into the transaction 2018-08-02 23:05:14 -07:00
xfs_dir2_block.c xfs: clean up MIN/MAX 2018-06-08 10:07:52 -07:00
xfs_dir2_data.c xfs: convert to SPDX license tags 2018-06-06 14:17:53 -07:00
xfs_dir2_leaf.c xfs: clean up MIN/MAX 2018-06-08 10:07:52 -07:00
xfs_dir2_node.c xfs: use swap macro in xfs_dir2_leafn_rebalance 2018-07-17 14:25:57 -07:00
xfs_dir2_priv.h xfs: convert to SPDX license tags 2018-06-06 14:17:53 -07:00
xfs_dir2_sf.c xfs: convert to SPDX license tags 2018-06-06 14:17:53 -07:00
xfs_dquot_buf.c xfs: convert to SPDX license tags 2018-06-06 14:17:53 -07:00
xfs_errortag.h xfs: force summary counter recalc at next mount 2018-07-23 09:08:01 -07:00
xfs_format.h xfs: don't treat unknown di_flags2 as corruption in scrub 2018-09-29 13:49:00 +10:00
xfs_fs.h xfs: convert to SPDX license tags 2018-06-06 14:17:53 -07:00
xfs_ialloc.c xfs: pass transaction to xfs_defer_add() 2018-08-02 23:05:14 -07:00
xfs_ialloc.h xfs: remove dfops parameter from ifree call stack 2018-07-11 22:26:07 -07:00
xfs_ialloc_btree.c xfs: pass transaction lock while setting up agresv on cyclic metadata 2018-07-29 22:37:08 -07:00
xfs_ialloc_btree.h xfs: pass transaction lock while setting up agresv on cyclic metadata 2018-07-29 22:37:08 -07:00
xfs_iext_tree.c xfs: use WRITE_ONCE to update if_seq 2018-08-07 10:57:12 -07:00
xfs_inode_buf.c xfs: validate inode di_forkoff 2018-09-29 13:50:13 +10:00
xfs_inode_buf.h xfs: convert to SPDX license tags 2018-06-06 14:17:53 -07:00
xfs_inode_fork.c xfs: remove the xfs_ifork_t typedef 2018-07-30 07:57:48 -07:00
xfs_inode_fork.h xfs: maintain a sequence count for inode fork manipulations 2018-07-31 13:18:09 -07:00
xfs_log_format.h xfs: refactor unmount record write 2018-07-23 09:08:01 -07:00
xfs_log_recover.h xfs: convert to SPDX license tags 2018-06-06 14:17:53 -07:00
xfs_log_rlimit.c xfs: convert to SPDX license tags 2018-06-06 14:17:53 -07:00
xfs_quota_defs.h xfs: convert to SPDX license tags 2018-06-06 14:17:53 -07:00
xfs_refcount.c xfs: pass transaction to xfs_defer_add() 2018-08-02 23:05:14 -07:00
xfs_refcount.h xfs: pass transaction to xfs_defer_add() 2018-08-02 23:05:14 -07:00
xfs_refcount_btree.c xfs: pass transaction lock while setting up agresv on cyclic metadata 2018-07-29 22:37:08 -07:00
xfs_refcount_btree.h xfs: pass transaction lock while setting up agresv on cyclic metadata 2018-07-29 22:37:08 -07:00
xfs_rmap.c xfs: pass transaction to xfs_defer_add() 2018-08-02 23:05:14 -07:00
xfs_rmap.h xfs: pass transaction to xfs_defer_add() 2018-08-02 23:05:14 -07:00
xfs_rmap_btree.c xfs: pass transaction lock while setting up agresv on cyclic metadata 2018-07-29 22:37:08 -07:00
xfs_rmap_btree.h xfs: pass transaction lock while setting up agresv on cyclic metadata 2018-07-29 22:37:08 -07:00
xfs_rtbitmap.c xfs: fix off-by-one error in xfs_rtalloc_query_range 2018-06-24 11:56:36 -07:00
xfs_sb.c xfs: only validate summary counts on primary superblock 2018-08-03 08:17:35 -07:00
xfs_sb.h xfs: convert to SPDX license tags 2018-06-06 14:17:53 -07:00
xfs_shared.h xfs: replace dop_low with transaction flag 2018-08-02 23:05:13 -07:00
xfs_symlink_remote.c xfs: convert to SPDX license tags 2018-06-06 14:17:53 -07:00
xfs_trans_resv.c xfs: clean up MIN/MAX 2018-06-08 10:07:52 -07:00
xfs_trans_resv.h xfs: convert to SPDX license tags 2018-06-06 14:17:53 -07:00
xfs_trans_space.h xfs: convert to SPDX license tags 2018-06-06 14:17:53 -07:00
xfs_types.c xfs: verify icount in superblock write 2018-07-31 13:18:09 -07:00
xfs_types.h xfs: verify icount in superblock write 2018-07-31 13:18:09 -07:00