From: Qu Wenruo Date: Tue, 3 Dec 2019 06:42:52 +0000 (+0800) Subject: btrfs: relocation: Check cancel request after each data page read X-Git-Url: http://git.hungrycats.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=7ff4a6de7a7a84f353ed39eaf8361fb0d7d37244;p=linux btrfs: relocation: Check cancel request after each data page read When relocating a data extents with large large data extents, we spend most of our time in relocate_file_extent_cluster() at stage "moving data extents": 1) | btrfs_relocate_block_group [btrfs]() { 1) | relocate_file_extent_cluster [btrfs]() { 1) $ 6586769 us | } 1) + 18.260 us | relocate_file_extent_cluster [btrfs](); 1) + 15.770 us | relocate_file_extent_cluster [btrfs](); 1) $ 8916340 us | } 1) | btrfs_relocate_block_group [btrfs]() { 1) | relocate_file_extent_cluster [btrfs]() { 1) $ 11611586 us | } 1) + 16.930 us | relocate_file_extent_cluster [btrfs](); 1) + 15.870 us | relocate_file_extent_cluster [btrfs](); 1) $ 14986130 us | } So to make data relocation cancelling quicker, here add extra balance cancelling check after each page read in relocate_file_extent_cluster(). Signed-off-by: Qu Wenruo (cherry picked from commit 34bb874930d1d6fecec7927101041884fe695aa7) --- diff --git a/fs/btrfs/relocation.c b/fs/btrfs/relocation.c index a313fffbb366..d1c7231bd949 100644 --- a/fs/btrfs/relocation.c +++ b/fs/btrfs/relocation.c @@ -3352,6 +3352,10 @@ static int relocate_file_extent_cluster(struct inode *inode, btrfs_delalloc_release_extents(BTRFS_I(inode), PAGE_SIZE); balance_dirty_pages_ratelimited(inode->i_mapping); btrfs_throttle(fs_info); + if (should_cancel_balance(fs_info)) { + ret = -ECANCELED; + goto out; + } } WARN_ON(nr != cluster->nr); out: