btrfs: allow hole and data seeking to be interruptible
authorFilipe Manana <fdmanana@suse.com>
Thu, 1 Sep 2022 13:18:21 +0000 (14:18 +0100)
committerDavid Sterba <dsterba@suse.com>
Mon, 26 Sep 2022 10:28:00 +0000 (12:28 +0200)
Doing hole or data seeking on a file with a very large number of extents
can take a long time, and we have reports of it being too slow (such as
at LSFMM from 2017, see the Link below). So make it interruptible.

Link: https://lwn.net/Articles/718805/
Reviewed-by: Josef Bacik <josef@toxicpanda.com>
Reviewed-by: Qu Wenruo <wqu@suse.com>
Signed-off-by: Filipe Manana <fdmanana@suse.com>
Reviewed-by: David Sterba <dsterba@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/file.c

index 0a76ae8..96f444a 100644 (file)
@@ -3652,6 +3652,10 @@ static loff_t find_desired_extent(struct btrfs_inode *inode, loff_t offset,
                start = em->start + em->len;
                free_extent_map(em);
                em = NULL;
+               if (fatal_signal_pending(current)) {
+                       ret = -EINTR;
+                       break;
+               }
                cond_resched();
        }
        free_extent_map(em);