On Wed, Feb 17, 2021 at 9:24 PM Qu Wenruo <quwenruo.bt...@gmx.com> wrote: > Got it now. > > [ 295.249182] read_extent_buffer_pages: eb->start=26207780683776 mirror=0 > [ 295.249188] __btrfs_map_block: logical=8615594639360 chunk > start=8614760677376 len=4294967296 type=0x81 > [ 295.249189] __btrfs_map_block: stripe[0] devid=3 phy=2118735708160 > > Note that, the initial request is to read from 26207780683776. > But inside btrfs_map_block(), we want to read from 8615594639360. > > This is totally screwed up in a unexpected way. > > 26207780683776 = 0x17d5f9754000 > 8615594639360 = 0x07d5f9754000 > > See the missing leading 1, which screws up the result. > > The problem should be the logical calculation part, which doesn't do > proper u64 conversion which could cause the problem. > > Would you like to test the single line fix below? > > Thanks, > Qu > > diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c > index b8fab44394f5..69d728f5ff9e 100644 > --- a/fs/btrfs/volumes.c > +++ b/fs/btrfs/volumes.c > @@ -6575,7 +6575,7 @@ blk_status_t btrfs_map_bio(struct btrfs_fs_info > *fs_info, struct bio *bio, > { > struct btrfs_device *dev; > struct bio *first_bio = bio; > - u64 logical = bio->bi_iter.bi_sector << 9; > + u64 logical = ((u64)bio->bi_iter.bi_sector) << 9; > u64 length = 0; > u64 map_length; > int ret;
So… it appears my kernel tree (Arch32's 5.10.14-arch1) already has that: blk_status_t btrfs_map_bio(struct btrfs_fs_info *fs_info, struct bio *bio, int mirror_num) { struct btrfs_device *dev; struct bio *first_bio = bio; u64 logical = (u64)bio->bi_iter.bi_sector << 9; u64 length = 0; u64 map_length; int ret; int dev_nr; int total_devs; struct btrfs_bio *bbio = NULL;