]> git.baikalelectronics.ru Git - kernel.git/commitdiff
btrfs: don't double-defer bio completions for compressed reads
authorChristoph Hellwig <hch@lst.de>
Thu, 26 May 2022 07:36:37 +0000 (09:36 +0200)
committerDavid Sterba <dsterba@suse.com>
Mon, 25 Jul 2022 15:45:33 +0000 (17:45 +0200)
The bio completion handler of the bio used for the compressed data is
already run in a workqueue using btrfs_bio_wq_end_io, so don't schedule
the completion of the original bio to the same workqueue again but just
execute it directly.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/inode.c

index 316c73d7d8cabb0ae45f192d6ce1fa438062dacf..3067c966d8b63464ecae4dfc7408a1d7861801f9 100644 (file)
@@ -2631,12 +2631,6 @@ void btrfs_submit_data_read_bio(struct inode *inode, struct bio *bio,
        struct btrfs_fs_info *fs_info = btrfs_sb(inode->i_sb);
        blk_status_t ret;
 
-       ret = btrfs_bio_wq_end_io(fs_info, bio,
-                       btrfs_is_free_space_inode(BTRFS_I(inode)) ?
-                       BTRFS_WQ_ENDIO_FREE_SPACE : BTRFS_WQ_ENDIO_DATA);
-       if (ret)
-               goto out;
-
        if (compress_type != BTRFS_COMPRESS_NONE) {
                /*
                 * btrfs_submit_compressed_read will handle completing the bio
@@ -2646,6 +2640,12 @@ void btrfs_submit_data_read_bio(struct inode *inode, struct bio *bio,
                return;
        }
 
+       ret = btrfs_bio_wq_end_io(fs_info, bio,
+                       btrfs_is_free_space_inode(BTRFS_I(inode)) ?
+                       BTRFS_WQ_ENDIO_FREE_SPACE : BTRFS_WQ_ENDIO_DATA);
+       if (ret)
+               goto out;
+
        /*
         * Lookup bio sums does extra checks around whether we need to csum or
         * not, which is why we ignore skip_sum here.