]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
btrfs: allow swap activation to be interruptible
authorFilipe Manana <fdmanana@suse.com>
Mon, 9 Dec 2024 16:31:41 +0000 (16:31 +0000)
committerDavid Sterba <dsterba@suse.com>
Mon, 23 Dec 2024 21:04:38 +0000 (22:04 +0100)
During swap activation we iterate over the extents of a file, then do
several checks for each extent, some of which may take some significant
time such as checking if an extent is shared. Since a file can have
many thousands of extents, this can be a very slow operation and it's
currently not interruptible. I had a bug during development of a previous
patch that resulted in an infinite loop when iterating the extents, so
a core was busy looping and I couldn't cancel the operation, which is very
annoying and requires a reboot. So make the loop interruptible by checking
for fatal signals at the end of each iteration and stopping immediately if
there is one.

CC: stable@vger.kernel.org # 5.4+
Reviewed-by: Qu Wenruo <wqu@suse.com>
Signed-off-by: Filipe Manana <fdmanana@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/inode.c

index b87f19630b00900da3f27a72784e8b0f5371385f..c4675f4345fd7fcf8fe44b232f50e1f7f3875220 100644 (file)
@@ -10073,6 +10073,11 @@ static int btrfs_swap_activate(struct swap_info_struct *sis, struct file *file,
                        bsi.block_start = physical_block_start;
                        bsi.block_len = len;
                }
+
+               if (fatal_signal_pending(current)) {
+                       ret = -EINTR;
+                       goto out;
+               }
        }
 
        if (bsi.block_len)