On Tue, Mar 8, 2011 at 4:39 PM, Loïc Minier <loic.min...@linaro.org> wrote:
> On Wed, Mar 09, 2011, Shawn Guo wrote:
>> I just added this one, and it does not help.  The l-m-c still fails at
>> the last step.
>> mkimage: Write error on /tmp/tmpUiR_m1/boot-disc/uImage: Success
>
>  This error sounded a bit weird; I checked the u-boot sources, and this
>  string is used in a bunch of places, but essentially it's either on
>  write() or on close() that this fails.  I bet it's on write() as I
>  don't see close() failing without an useful errno, but I could imagine
>  the write tests failing:
>        if (write(ifd, tparams->hdr, tparams->header_size)
>                                        != tparams->header_size) {
>                fprintf (stderr, "%s: Write error on %s: %s\n",
>                        params.cmdname, params.imagefile, strerror(errno));
>  notably if this is a partial write.

libc.info in particular says (of write()):
     "The return value is the number of bytes actually written.  This
     may be SIZE, but can always be smaller.  Your program should
     always call `write' in a loop, iterating until all the data is
     written."

>
>  We could change mkimage's write()s to actually account for the number
>  of bytes written rather than just failing when not all bytes were
>  written.

There's no reason I can see for mkimage to use the low-level POSIX
read/write interface.  Life would be simpler (and more portable) if it
just used stdio, because it provides the desired semantics...

More realistically, we could just propose a write() wrapper contains
the necessary loop to provide the expected semantics.

We should check for other instances of the same error, possibly
including calls to read() as well.  However, I can't find clear
documentation on whether a short read() should ever occur on a normal
file in the absence of signals, provided there is enough data in the
file.  Usually I assume that short reads might happen because
otherwise the program won't work properly on pipes, sockets etc., but
this is probably not so much of a concern for mkimage.


The natty version of u-boot has just the same error with write(); see:

http://bazaar.launchpad.net/~ubuntu-branches/ubuntu/natty/u-boot/natty/view/head:/tools/mkimage.c

The upstream master branch of U-Boot on git://git.denx.de/u-boot.git
has the bug too.


Cheers
---Dave

_______________________________________________
linaro-dev mailing list
linaro-dev@lists.linaro.org
http://lists.linaro.org/mailman/listinfo/linaro-dev

Reply via email to