btrfs: pre-load data checksum for reads in btrfs_submit_bio
authorChristoph Hellwig <hch@lst.de>
Sat, 21 Jan 2023 06:50:05 +0000 (07:50 +0100)
committerDavid Sterba <dsterba@suse.com>
Wed, 15 Feb 2023 18:38:51 +0000 (19:38 +0100)
Instead of calling btrfs_lookup_bio_sums in every caller of
btrfs_submit_bio that reads data, do the call once in btrfs_submit_bio.

Reviewed-by: Johannes Thumshirn <johannes.thumshirn@wdc.com>
Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: David Sterba <dsterba@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/bio.c
fs/btrfs/compression.c
fs/btrfs/inode.c

index 8285aa4..3e23b97 100644 (file)
@@ -14,6 +14,7 @@
 #include "dev-replace.h"
 #include "rcu-string.h"
 #include "zoned.h"
+#include "file-item.h"
 
 static struct bio_set btrfs_bioset;
 
@@ -253,9 +254,16 @@ void btrfs_submit_bio(struct btrfs_fs_info *fs_info, struct bio *bio, int mirror
                BUG();
        }
 
-       /* Save the iter for the end_io handler for data reads. */
-       if (bio_op(bio) == REQ_OP_READ && !(bio->bi_opf & REQ_META))
+       /*
+        * Save the iter for the end_io handler and preload the checksums for
+        * data reads.
+        */
+       if (bio_op(bio) == REQ_OP_READ && !(bio->bi_opf & REQ_META)) {
                bbio->iter = bio->bi_iter;
+               ret = btrfs_lookup_bio_sums(bbio);
+               if (ret)
+                       goto fail;
+       }
 
        if (!bioc) {
                /* Single mirror read/write fast path */
index 3e504a2..585f32e 100644 (file)
@@ -797,12 +797,6 @@ void btrfs_submit_compressed_read(struct inode *inode, struct bio *bio,
                         */
                        btrfs_bio(comp_bio)->file_offset = file_offset;
 
-                       ret = btrfs_lookup_bio_sums(btrfs_bio(comp_bio));
-                       if (ret) {
-                               btrfs_bio_end_io(btrfs_bio(comp_bio), ret);
-                               break;
-                       }
-
                        ASSERT(comp_bio->bi_iter.bi_size);
                        btrfs_submit_bio(fs_info, comp_bio, mirror_num);
                        comp_bio = NULL;
index c368a45..598897b 100644 (file)
@@ -2762,7 +2762,6 @@ void btrfs_submit_data_read_bio(struct btrfs_inode *inode, struct bio *bio,
                        int mirror_num, enum btrfs_compression_type compress_type)
 {
        struct btrfs_fs_info *fs_info = inode->root->fs_info;
-       blk_status_t ret;
 
        if (compress_type != BTRFS_COMPRESS_NONE) {
                /*
@@ -2773,16 +2772,6 @@ void btrfs_submit_data_read_bio(struct btrfs_inode *inode, struct bio *bio,
                return;
        }
 
-       /*
-        * Lookup bio sums does extra checks around whether we need to csum or
-        * not, which is why we ignore skip_sum here.
-        */
-       ret = btrfs_lookup_bio_sums(btrfs_bio(bio));
-       if (ret) {
-               btrfs_bio_end_io(btrfs_bio(bio), ret);
-               return;
-       }
-
        btrfs_submit_bio(fs_info, bio, mirror_num);
 }
 
@@ -8004,12 +7993,6 @@ static void btrfs_submit_dio_bio(struct bio *bio, struct btrfs_inode *inode,
                        btrfs_bio_end_io(btrfs_bio(bio), ret);
                        return;
                }
-       } else {
-               ret = btrfs_lookup_bio_sums(btrfs_bio(bio));
-               if (ret) {
-                       btrfs_bio_end_io(btrfs_bio(bio), ret);
-                       return;
-               }
        }
 map:
        btrfs_submit_bio(fs_info, bio, 0);
@@ -10269,13 +10252,6 @@ static blk_status_t submit_encoded_read_bio(struct btrfs_inode *inode,
 {
        struct btrfs_encoded_read_private *priv = btrfs_bio(bio)->private;
        struct btrfs_fs_info *fs_info = inode->root->fs_info;
-       blk_status_t ret;
-
-       if (!priv->skip_csum) {
-               ret = btrfs_lookup_bio_sums(btrfs_bio(bio));
-               if (ret)
-                       return ret;
-       }
 
        atomic_inc(&priv->pending);
        btrfs_submit_bio(fs_info, bio, mirror_num);