• Dave Chinner's avatar
    xfs: fix error handling in xfs_bmap_extents_to_btree · e55ec4dd
    Dave Chinner authored
    Commit 01239d77 ("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: default avatarDave Chinner <dchinner@redhat.com>
    Reviewed-by: default avatarDarrick J. Wong <darrick.wong@oracle.com>
    Signed-off-by: default avatarDave Chinner <david@fromorbit.com>
    
    e55ec4dd
xfs_bmap.c 166 KB