On Tue, Jun 28, 2022 at 03:28:00PM +0800, Qu Wenruo wrote: > [BACKGROUND] > Unlike FUSE/Kernel which always pass aligned read range, U-boot fs code > just pass the request range to underlying fses. > > Under most case, this works fine, as U-boot only really needs to read > the whole file (aka, 0 for both offset and len, len will be later > determined using file size). > > But if some advanced user/script wants to extract kernel/initramfs from > combined image, we may need to do unaligned read in that case. > > [ADVANTAGE] > This patchset will handle unaligned read range in _fs_read(): > > - Get blocksize of the underlying fs > > - Read the leading block contianing the unaligned range > The full block will be stored in a local buffer, then only copy > the bytes in the unaligned range into the destination buffer. > > If the first block covers the whole range, we just call it aday. > > - Read the aligned range if there is any > > - Read the tailing block containing the unaligned range > And copy the covered range into the destination. > > [DISADVANTAGE] > There are mainly two problems: > > - Extra memory allocation for every _fs_read() call > For the leading and tailing block. > > - Extra path resolving > All those supported fs will have to do extra path resolving up to 2 > times (one for the leading block, one for the tailing block). > This may slow down the read. This conceptually seems like a good thing. Can you please post some before/after times of reading large images from the supported filesystems? -- Tom