• Dave Chinner's avatar
    xfs: fix double xfs_perag_rele() in xfs_filestream_pick_ag() · 1e473279
    Dave Chinner authored
    xfs_bmap_longest_free_extent() can return an error when accessing
    the AGF fails. In this case, the behaviour of
    xfs_filestream_pick_ag() is conditional on the error. We may
    continue the loop, or break out of it. The error handling after the
    loop cleans up the perag reference held when the break occurs. If we
    continue, the next loop iteration handles cleaning up the perag
    reference.
    
    EIther way, we don't need to release the active perag reference when
    xfs_bmap_longest_free_extent() fails. Doing so means we do a double
    decrement on the active reference count, and this causes tha active
    reference count to fall to zero. At this point, new active
    references will fail.
    
    This leads to unmount hanging because it tries to grab active
    references to that perag, only for it to fail. This happens inside a
    loop that retries until a inode tree radix tree tag is cleared,
    which cannot happen because we can't get an active reference to the
    perag.
    
    The unmount livelocks in this path:
    
      xfs_reclaim_inodes+0x80/0xc0
      xfs_unmount_flush_inodes+0x5b/0x70
      xfs_unmountfs+0x5b/0x1a0
      xfs_fs_put_super+0x49/0x110
      generic_shutdown_super+0x7c/0x1a0
      kill_block_super+0x27/0x50
      deactivate_locked_super+0x30/0x90
      deactivate_super+0x3c/0x50
      cleanup_mnt+0xc2/0x160
      __cleanup_mnt+0x12/0x20
      task_work_run+0x5e/0xa0
      exit_to_user_mode_prepare+0x1bc/0x1c0
      syscall_exit_to_user_mode+0x16/0x40
      do_syscall_64+0x40/0x80
      entry_SYSCALL_64_after_hwframe+0x63/0xcd
    Reported-by: default avatarPengfei Xu <pengfei.xu@intel.com>
    Fixes: eb70aa2d ("xfs: use for_each_perag_wrap in xfs_filestream_pick_ag")
    Signed-off-by: default avatarDave Chinner <dchinner@redhat.com>
    Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
    Reviewed-by: default avatarDarrick J. Wong <djwong@kernel.org>
    Signed-off-by: default avatarDave Chinner <david@fromorbit.com>
    1e473279
xfs_filestream.c 10.1 KB