read error with 64 byte erase counter header & 2048 Byte mtd->writesize

Artem Bityutskiy dedekind1 at
Sun Mar 14 05:50:35 EDT 2010


On Mon, 2010-02-22 at 16:00 -0800, Shivdas Gujare wrote:
> Hi all,
> I am trying to use ubifs, but currently I am facing an issue as follows,
> 1) I tries to format a mtd device as, "ubiformat /dev/mtd0 -s 2048 -f
> ./ubi.img" while it return with an error of
> ubiformat: mtd0 (nand), size 164757504 bytes (157.1 MiB), 1257
> eraseblocks of 131072 bytes (128.0 KiB), min. I/O size 2048 bytes
> libscan: scanning eraseblock 0 --  0 % complete  libmtd: error!:
> cannot read 64 bytes from mtd0 (eraseblock 0, offset 0)
>         error 22 (Invalid argument)
> ubiformat: error!: failed to scan mtd0 (/dev/mtd0)

Most probably your NAND driver is broken and is unable to read 64 bytes.

> I tried to understand what it is and came to know that, "ret =
> mtd_read(mtd, fd, eb, 0, &hdr, sizeof(struct ubi_ec_hdr));" from
> "ubi-utils/src/libscan.c"
> tried to read 64 byte "struct ubi_ec_hdr - UBI erase counter header"
> while our MTD driver has set "mtd->writesize = 2048"
> So this mismatch between 64 Byte "erase counter header" and 2048 Byte
> "mtd->writesize" returns with an error.

Your min. I/O unit is indeed 2048 bytes. However, MTD drivers are
supposed to be able to read any amount of bytes. In this case, your
driver should read 2048 bytes, then copy the requested 64 bytes to the
output buffer.

> I would like to know, Is this a real issue or am I missing any layer
> between ubifs & mtd driver which interfaces this 64 & 2048 Byte
> differences.

UBI/UBIFS write only in min. I/O size aligned units, but read in
arbitrary aligned units.

You should debug fix your driver.

And validate it with the mtd tests, just like it is requested here:

Best Regards,
Artem Bityutskiy (Артём Битюцкий)

More information about the linux-mtd mailing list