btrfs: do not start readahead for csum tree when scrubbing non-data block groups
authorFilipe Manana <fdmanana@suse.com>
Mon, 12 Oct 2020 10:55:26 +0000 (11:55 +0100)
committerDavid Sterba <dsterba@suse.com>
Tue, 8 Dec 2020 14:53:39 +0000 (15:53 +0100)
When scrubbing a stripe of a block group we always start readahead for the
checksums btree and wait for it to complete, however when the blockgroup is
not a data block group (or a mixed block group) it is a waste of time to do
it, since there are no checksums for metadata extents in that btree.

So skip that when the block group does not have the data flag set, saving
some time doing memory allocations, queueing a job in the readahead work
queue, waiting for it to complete and potentially avoiding some IO as well
(when csum tree extents are not in memory already).

Reviewed-by: Johannes Thumshirn <johannes.thumshirn@wdc.com>
Reviewed-by: Josef Bacik <josef@toxicpanda.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/scrub.c

index e71e7586e9eb0600cb57bb28677b14cd6612985c..04351b55dd1475d4e5970f8ff7fb4dced00653f7 100644 (file)
@@ -3084,17 +3084,21 @@ static noinline_for_stack int scrub_stripe(struct scrub_ctx *sctx,
        key_end.offset = (u64)-1;
        reada1 = btrfs_reada_add(root, &key, &key_end);
 
-       key.objectid = BTRFS_EXTENT_CSUM_OBJECTID;
-       key.type = BTRFS_EXTENT_CSUM_KEY;
-       key.offset = logical;
-       key_end.objectid = BTRFS_EXTENT_CSUM_OBJECTID;
-       key_end.type = BTRFS_EXTENT_CSUM_KEY;
-       key_end.offset = logic_end;
-       reada2 = btrfs_reada_add(csum_root, &key, &key_end);
+       if (cache->flags & BTRFS_BLOCK_GROUP_DATA) {
+               key.objectid = BTRFS_EXTENT_CSUM_OBJECTID;
+               key.type = BTRFS_EXTENT_CSUM_KEY;
+               key.offset = logical;
+               key_end.objectid = BTRFS_EXTENT_CSUM_OBJECTID;
+               key_end.type = BTRFS_EXTENT_CSUM_KEY;
+               key_end.offset = logic_end;
+               reada2 = btrfs_reada_add(csum_root, &key, &key_end);
+       } else {
+               reada2 = NULL;
+       }
 
        if (!IS_ERR(reada1))
                btrfs_reada_wait(reada1);
-       if (!IS_ERR(reada2))
+       if (!IS_ERR_OR_NULL(reada2))
                btrfs_reada_wait(reada2);