[U-Boot] UBIFS LZO decompression failure
Simon Kagstrom
simon.kagstrom at netinsight.net
Tue Sep 15 10:18:24 CEST 2009
Hi List!
I have a slight problem with UBIFS on the OpenRD base board (an ARM
board very similar to sheevaplug). Loading files which have been
compressed with LZO by ubifs fails:
OpenRD>> ubi part root; ubifsmount rootfs
Creating 1 MTD partitions on "nand0":
0x0000001e0000-0x000020000000 : "mtd=1"
UBI: attaching mtd1 to ubi0
UBI: physical eraseblock size: 131072 bytes (128 KiB)
UBI: logical eraseblock size: 129024 bytes
UBI: smallest flash I/O unit: 2048
UBI: sub-page size: 512
UBI: VID header offset: 512 (aligned 512)
UBI: data offset: 2048
UBI: attached mtd1 to ubi0
UBI: MTD device name: "mtd=1"
UBI: MTD device size: 510 MiB
UBI: number of good PEBs: 4081
UBI: number of bad PEBs: 0
UBI: max. allowed volumes: 128
UBI: wear-leveling threshold: 4096
UBI: number of internal volumes: 1
UBI: number of user volumes: 1
UBI: available PEBs: 54
UBI: total number of reserved PEBs: 4027
UBI: number of PEBs reserved for bad PEB handling: 40
UBI: max/mean erase counter: 6/4
UBIFS: mounted UBI device 0, volume 0, name "rootfs"
UBIFS: mounted read-only
UBIFS: file system size: 511967232 bytes (499968 KiB, 488 MiB, 3968 LEBs)
UBIFS: journal size: 25675776 bytes (25074 KiB, 24 MiB, 199 LEBs)
UBIFS: media format: w4/r0 (latest is w4/r0)
UBIFS: default compressor: LZO
UBIFS: reserved for root: 5182151 bytes (5060 KiB)
OpenRD>> ubifsload 0x8000000 /boot/primary/uImage
Loading file '/boot/primary/uImage' to addr 0x08000000 with size 7196920 (0x006dd0f8)...
UBIFS error (pid 0): ubifs_decompress: cannot decompress 3204 bytes, compressor LZO, error -6
UBIFS error (pid 0): read_block: bad data node (block 0, inode 88)
UBIFS error (pid 0): do_readpage: cannot read page 0 of inode 88, error -22
Error reading file '/boot/primary/uImage'
I've created the filesystem in Linux on the target (v2.6.31). The
compression error -6 is LZO_E_LOOKBEHIND_OVERRUN, and it fails because
of this test in lzo1x_decompress.c:
if (HAVE_LB(m_pos, out, op))
goto lookbehind_overrun;
where HAVE_LB is defined as (m_pos < out || m_pos >= op) and the
m_pos, out and op values are 0x07ffde77, 0x08000000, 0x08000083 (i.e.,
the first test fails).
The lzo1x_decompress.c file is identical to that in Linux, so something
is fishy here. Does it work for the rest of you?
In our case it doesn't matter very much since the file (an uImage) is
compressed anyway and we therefore save work anyway by marking it as
using no compression, but it would be nice if this would work anyhow.
// Simon
More information about the U-Boot
mailing list