[PATCH] fs/btrfs: handle data extents, which crosss stripe boundaries, correctly

Tom Rini trini at konsulko.com
Thu Jan 12 16:19:21 CET 2023


On Fri, Dec 30, 2022 at 09:07:05AM +0800, Qu Wenruo wrote:

> [BUG]
> Since btrfs supports single device RAID0 at mkfs time after btrfs-progs
> v5.14, if we create a single device raid0 btrfs, and created a file
> crossing stripe boundary:
> 
>   # mkfs.btrfs -m dup -d raid0 test.img
>   # mount test.img mnt
>   # xfs_io -f -c "pwrite 0 128K" mnt/file
>   # umount mnt
> 
> Since btrfs is using 64K as stripe length, above 128K data write is
> definitely going to cross at least one stripe boundary.
> 
> Then u-boot would fail to read above 128K file:
> 
>  => host bind 0 /home/adam/test.img
>  => ls host 0
>  <   >     131072  Fri Dec 30 00:18:25 2022  file
>  => load host 0 0 file
>  BTRFS: An error occurred while reading file file
>  Failed to load 'file'
> 
> [CAUSE]
> Unlike tree blocks read, data extent reads doesn't consider cases in which
> one data extent can cross stripe boundary.
> 
> In read_data_extent(), we just call btrfs_map_block() once and read the
> first mapped range.
> 
> And if the first mapped range is smaller than the desired range, it
> would return error.
> 
> But since even single device btrfs can utilize RAID0 profiles, the first
> mapped range can only be at most 64K for RAID0 profiles, and cause false
> error.
> 
> [FIX]
> Just like read_whole_eb(), we should call btrfs_map_block() in a loop
> until we read all data.
> 
> Since we're here, also add extra error messages for the following cases:
> 
> - btrfs_map_block() failure
>   We already have the error message for it.
> 
> - Missing device
>   This should not happen, as we only support single device for now.
> 
> - __btrfs_devread() failure
> 
> With this bug fixed, btrfs driver of u-boot can properly read the above
> 128K file, and have the correct content:
> 
>  => host bind 0 /home/adam/test.img
>  => ls host 0
>  <   >     131072  Fri Dec 30 00:18:25 2022  file
>  => load host 0 0 file
>  131072 bytes read in 0 ms
>  => md5sum 0 0x20000
>  md5 for 00000000 ... 0001ffff ==> d48858312a922db7eb86377f638dbc9f
>  ^^^ Above md5sum also matches.
> 
> Reported-by: Sam Winchenbach <swichenbach at tethers.com>
> Signed-off-by: Qu Wenruo <wqu at suse.com>

Applied to u-boot/master, thanks!

-- 
Tom
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 659 bytes
Desc: not available
URL: <https://lists.denx.de/pipermail/u-boot/attachments/20230112/bd15c676/attachment.sig>


More information about the U-Boot mailing list