Skip to content

Commit b75b51f

Browse files
adam900710kdave
authored andcommitted
Revert "btrfs: scrub: use larger block size for data extent scrub"
This reverts commit 786672e. [BUG] Since commit 786672e ("btrfs: scrub: use larger block size for data extent scrub"), btrfs scrub no longer reports errors if the corruption is not in the first sector of a STRIPE_LEN. The following script can expose the problem: mkfs.btrfs -f $dev mount $dev $mnt xfs_io -f -c "pwrite -S 0xff 0 8k" $mnt/foobar umount $mnt # 13631488 is the logical bytenr of above 8K extent btrfs-map-logical -l 13631488 -b 4096 $dev mirror 1 logical 13631488 physical 13631488 device /dev/test/scratch1 # Corrupt the 2nd sector of that extent xfs_io -f -c "pwrite -S 0x00 13635584 4k" $dev mount $dev $mnt btrfs scrub start -B $mnt scrub done for 54e63f9f-0c30-4c84-a33b-5c56014629b7 Scrub started: Mon Nov 7 07:18:27 2022 Status: finished Duration: 0:00:00 Total to scrub: 536.00MiB Rate: 0.00B/s Error summary: no errors found <<< [CAUSE] That offending commit enlarges the data extent scrub size from sector size to BTRFS_STRIPE_LEN, to avoid extra scrub_block to be allocated. But unfortunately the data extent scrub is still heavily relying on the fact that there is only one scrub_sector per scrub_block. Thus it will only check the first sector, and ignoring the remaining sectors. Furthermore the error reporting is not able to handle multiple sectors either. [FIX] For now just revert the offending commit. The consequence is just extra memory usage during scrub. We will need a proper change to make the remaining data scrub path to handle multiple sectors before we enlarging the data scrub size. Reported-by: Li Zhang <[email protected]> Signed-off-by: Qu Wenruo <[email protected]> Signed-off-by: David Sterba <[email protected]>
1 parent 8bb808c commit b75b51f

File tree

1 file changed

+1
-7
lines changed

1 file changed

+1
-7
lines changed

fs/btrfs/scrub.c

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2672,17 +2672,11 @@ static int scrub_extent(struct scrub_ctx *sctx, struct map_lookup *map,
26722672
u8 csum[BTRFS_CSUM_SIZE];
26732673
u32 blocksize;
26742674

2675-
/*
2676-
* Block size determines how many scrub_block will be allocated. Here
2677-
* we use BTRFS_STRIPE_LEN (64KiB) as default limit, so we won't
2678-
* allocate too many scrub_block, while still won't cause too large
2679-
* bios for large extents.
2680-
*/
26812675
if (flags & BTRFS_EXTENT_FLAG_DATA) {
26822676
if (map->type & BTRFS_BLOCK_GROUP_RAID56_MASK)
26832677
blocksize = map->stripe_len;
26842678
else
2685-
blocksize = BTRFS_STRIPE_LEN;
2679+
blocksize = sctx->fs_info->sectorsize;
26862680
spin_lock(&sctx->stat_lock);
26872681
sctx->stat.data_extents_scrubbed++;
26882682
sctx->stat.data_bytes_scrubbed += len;

0 commit comments

Comments
 (0)