On Tue, Jul 28, 2015 at 09:55:03PM -0600, Stephen Warren wrote: > The FAT code contains a special case to parse the root directory. This > is needed since the root directory location/layout on disk is special > cased for FAT12/16. In particular, the location and size of the FAT12/16 > root directory is hard-coded and contiguous, whereas all FAT12/16 non-root > directories, and all FAT32 directories, are stored in a non-contiguous > fashion, with the layout represented by a linked-list of clusters in the > FAT. > > If a file path contains ../ (for example /extlinux/../bcm2835-rpi-cm.dtb), > it is possible to need to parse the root directory for the first element > in the path (requiring application of the special case), then a sub- > directory (in the general way), then re-parse the root directory (again > requiring the special case). However, the current code in U-Boot only > applies the special case for the very first path element, and never for > any later path element. When reparsing the root directory without > applying the special case, any file in a sector (or cluster?) other than > the first sector/cluster of the root directory will not be found. > > This change modifies the non-root-dir-parsing loop of do_fat_read_at() > to detect if it's walked back to the root directory, and if so, jumps > back to the special case code that handles parsing of the root directory. > > This change was tested using sandbox by executing: > > ./u-boot -c "host bind 0 ../sd-p1.bin; ls host 0:0" > ./u-boot -c "host bind 0 ../sd-p1.bin; ls host 0:0 /" > ./u-boot -c "host bind 0 ../sd-p1.bin; ls host 0:0 /extlinux" > ./u-boot -c "host bind 0 ../sd-p1.bin; ls host 0:0 /extlinux/" > ./u-boot -c "host bind 0 ../sd-p1.bin; ls host 0:0 /extlinux/.." > ./u-boot -c "host bind 0 ../sd-p1.bin; ls host 0:0 /extlinux/../" > ./u-boot -c "host bind 0 ../sd-p1.bin; ls host 0:0 /extlinux/../backup" > ./u-boot -c "host bind 0 ../sd-p1.bin; ls host 0:0 /extlinux/../backup/" > ./u-boot -c "host bind 0 ../sd-p1.bin; ls host 0:0 /extlinux/../backup/.." > ./u-boot -c "host bind 0 ../sd-p1.bin; ls host 0:0 /extlinux/../backup/../" > ./u-boot -c "host bind 0 ../sd-p1.bin; load host 0:0 0 /bcm2835-rpi-cm.dtb" > ./u-boot -c "host bind 0 ../sd-p1.bin; load host 0:0 0 > /extlinux/../bcm2835-rpi-cm.dtb" > ./u-boot -c "host bind 0 ../sd-p1.bin; load host 0:0 0 > /backup/../bcm2835-rpi-cm.dtb" > ./u-boot -c "host bind 0 ../sd-p1.bin; load host 0:0 0 > /extlinux/..backup/../bcm2835-rpi-cm.dtb" > ./u-boot -c "host bind 0 ../sd-p1.bin; load host 0:0 0 > /extlinux/../backup/../bcm2835-rpi-cm.dtb" > > (/extlinux and /backup are in different sectors so trigger some different > cases, and bcm2835-rpi-cm.dtb is in a sector of the root directory other > than the first). > > In all honesty, this change is a bit of a hack, using goto and all. > However, as demonstrated above it appears to work well in practice, is > quite minimal, likely doesn't introduce any risk of regressions, and > hopefully doesn't introduce any maintenance issues. > > The correct fix would be to collapse the root and non-root loops in > do_fat_read_at() and get_dentfromdir() into a single loop that has a > small special-case when moving from one sector to the next, to handle > the layout difference of root/non-root directories. AFAIK all other > aspects of directory parsing are identical. However, that's a much > larger change which needs significantly more thought before it's > implemented. > > Signed-off-by: Stephen Warren <swar...@wwwdotorg.org>
Applied to u-boot/master, thanks! -- Tom
signature.asc
Description: Digital signature
_______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot