
On 12/28/22 21:51, Sam Winchenbach wrote:
Hello,
Hello, I have hit the following situation when trying to load files from a BTRFS partition with duplication enabled.
In the first example I read a 16KiB file - __btrfs_map_block() changes the length to something larger than the file being read. This works fine, as length is later clamped to the file size.
In the second example, __btrfs_map_block() changes the length parameter to something smaller than the file (the size of a stripe). This seems to break this check here:
read = len; num_copies = btrfs_num_copies(fs_info, logical, len); for (i = 1; i <= num_copies; i++) { ret = read_extent_data(fs_info, dest, logical, &read, i); if (ret < 0 || read != len) { continue; } finished = true; break; }
The problem being that read is always less than len.
I am not sure if __btrfs_map_block is changing "len" to the incorrect value, or if there is some logic in "read_extent_data" that isn't correct. Any pointers on how this code is supposed to work would be greatly appreciated. Thanks.
Thanks for reporting the issue
$ scripts/get_maintainer.pl -f fs/btrfs/volumes.c
suggests to include
"Marek BehĂșn" kabel@kernel.org (maintainer:BTRFS) Qu Wenruo wqu@suse.com (reviewer:BTRFS) linux-btrfs@vger.kernel.org
to the communication.
Best regards
Heinrich
=== EXAMPLE 2 === Zynq> load mmc 1:0 0 16K [btrfs_file_read,fs/btrfs/inode.c:710] === read the aligned part === [btrfs_read_extent_reg,fs/btrfs/inode.c:458] before read_extent_data (ret = 0, read = 16384, len = 16384) [read_extent_data,fs/btrfs/disk-io.c:547] before __btrfs_map_block (len = 16384) [read_extent_data,fs/btrfs/disk-io.c:550] after __btrfs_map_block (len = 28672) [read_extent_data,fs/btrfs/disk-io.c:565] before __btrfs_devread (len = 16384) [read_extent_data,fs/btrfs/disk-io.c:568] after __btrfs_devread (len = 16384) [btrfs_read_extent_reg,fs/btrfs/inode.c:460] after read_extent_data (ret = 0, read = 16384, len = 16384) cur: 0, extent_num_bytes: 16384, aligned_end: 16384 16384 bytes read in 100 ms (159.2 KiB/s)
=== EXAMPLE 2 === Zynq> load mmc 1:0 0 32K [btrfs_file_read,fs/btrfs/inode.c:710] === read the aligned part === [btrfs_read_extent_reg,fs/btrfs/inode.c:458] before read_extent_data (ret = 0, read = 32768, len = 32768) [read_extent_data,fs/btrfs/disk-io.c:547] before __btrfs_map_block (len = 32768) [read_extent_data,fs/btrfs/disk-io.c:550] after __btrfs_map_block (len = 12288) [read_extent_data,fs/btrfs/disk-io.c:565] before __btrfs_devread (len = 12288) [read_extent_data,fs/btrfs/disk-io.c:568] after __btrfs_devread (len = 12288) [btrfs_read_extent_reg,fs/btrfs/inode.c:460] after read_extent_data (ret = 0, read = 12288, len = 32768) [btrfs_read_extent_reg,fs/btrfs/inode.c:458] before read_extent_data (ret = 0, read = 12288, len = 32768) [read_extent_data,fs/btrfs/disk-io.c:547] before __btrfs_map_block (len = 12288) [read_extent_data,fs/btrfs/disk-io.c:550] after __btrfs_map_block (len = 12288) [read_extent_data,fs/btrfs/disk-io.c:565] before __btrfs_devread (len = 12288) [read_extent_data,fs/btrfs/disk-io.c:568] after __btrfs_devread (len = 12288) [btrfs_read_extent_reg,fs/btrfs/inode.c:460] after read_extent_data (ret = 0, read = 12288, len = 32768) file: fs/btrfs/inode.c, line: 468 cur: 0, extent_num_bytes: 32768, aligned_end: 32768 -----> btrfs_read_extent_reg: -5, line: 758 BTRFS: An error occurred while reading file 32K Failed to load '32K'
Sam Winchenbach Embedded Software Engineer III Tethers Unlimited, Inc. | Connect Your Universe | www.tethers.com swinchenbach@tethers.com | C: 207-974-6934 11711 North Creek Pkwy # D113, Bothell, WA 98011-8808, USA