On Fri, Apr 30, 2021 at 04:45:46PM +1200, Campbell Suter wrote: > In SquashFS, the contents of a directory is stored by > squashfs_directory_entry structures which contain the file's name, inode > and position within the filesystem. > > The inode number is not stored directly; instead each directory has one > or more headers which set a base inode number, and files store the > offset from that to the file's inode number. > > In mksquashfs, each inode is allocated a number in the same order as > they are written to the directory table; thus the offset from the > header's base inode number to the file's inode number is usually > positive. > > Hardlinks are simply stored with two directory entries referencing the > same file. This means the second entry will thus have an inode number > much lower than the surrounding files. Since the header's base inode > number comes from the first entry that uses the header, this delta will > usually be negative. > > Previously, U-Boot's squashfs_directory_entry.inode_offset field was > declared as an unsigned value. Thus when a negative value was found, it > would either resolve to an invalid inode number or to that of an > unrelated file. > > A squashfs image to test this can be created like so: > > echo hi > sqfs_test_files/001-root-file > mkdir sqfs_test_files/002-subdir > touch sqfs_test_files/002-subdir/003-file > ln sqfs_test_files/{001-root-file,002-subdir/004-link} > mksquashfs sqfs_test_files/ test.sqfs -noappend > > Note that squashfs sorts the files ASCIIbetacally, so we can use the > names to control the order they appear in. The ordering is important - > the first reference to the file must have a lower inode number than the > directory in which the second reference resides, and the second > reference cannot be the first file in the directory. > > Listing this sample image in U-Boot results in: > > => sqfsls virtio 2 002-subdir > 0 003-file > Inode not found. > 0 004-link > > Signed-off-by: Campbell Suter > Reviewed-by: Miquel Raynal Applied to u-boot/master, thanks! -- Tom