
On 02/27/2013 10:49:55 AM, Tom Rini wrote:
On Tue, Feb 26, 2013 at 10:56:08AM -0500, Tom Rini wrote:
We make these two functions take a size_t pointer to how much space was used on NAND to read or write the buffer (when reads/writes
happen)
so that bad blocks can be accounted for. We also make them take an loff_t limit on how much data can be read or written. This means
that
we can now catch the case of when writing to a partition would
exceed
the partition size due to bad blocks. To do this we also need to
make [snip]
int nand_read_skip_bad(nand_info_t *nand, loff_t offset, size_t
*length,
u_char *buffer)
size_t *actual, loff_t lim, u_char *buffer)
[snip]
- if (*actual > lim) {
puts("Size of read exceeds partition or device
limit\n");
*length = 0;
return -EFBIG;
- }
The more I look at this and try testing things, I think I shouldn't be introducing a change here. Before you could do: nand read ${address} partname-with-badblock
And it would suceed but bleed into the next partition if it wasn't the last one. So your production system could do "nand read ${address} kernel" and be OK. But with this change, it would fail because reading the whole partition is now too large with a bad block (you would need partition+(blocksize*number bad blocks).
You wouldn't be quite so OK if it were a write instead.
So I'm going to put this back to a check simply against requested size being greater than lim rather than required size greater than lim (since required size exceeds device is still caught).
No, please retain the check. The other issue is a separate (though related) bug, and there's a patch from Harvey Chapman to deal with it.
-Scott