On 02/28/2013 01:09:05 PM, 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
check_skip_len count not just complete blocks used but partial ones as
well.  All callers of nand_(read|write)_skip_bad are adjusted to call
these with the most sensible limits available.

The changes were started by Pantelis and finished by Tom.

Signed-off-by: Pantelis Antoniou <[email protected]>
Signed-off-by: Tom Rini <[email protected]>
---
Changes in v3:
- Reworked skip_check_len changes to just add accounting for *used to
  the logic.
- Allow for actual to be NULL in nand_(read|write)_skip_bad, only DFU
calls this with a non-NULL parameter. Make sure the comments for both
  functions explain the parameters and their behavior.
- Other style changes requested by Scott.
- As nand_(write|read)_skip_bad passes back just a used length now.

Changes in v2:
- NAND skip_check_len changes reworked to allow
  nand_(read|write)_skip_bad to return this information to the caller.

common/cmd_nand.c | 56 +++++++++++++++++++----------------
 common/env_nand.c            |    3 +-
drivers/mtd/nand/nand_util.c | 67 +++++++++++++++++++++++++++++++++++++-----
 include/nand.h               |    4 +--
 4 files changed, 93 insertions(+), 37 deletions(-)

Looks mostly good, just some minor issues:

-       if (*size > maxsize) {
-               puts("Size exceeds partition or device limit\n");
-               return -1;
-       }
-

I assume you're removing this because you rely on the read/write functions printing the error... what about other users of this such as erase, lock, etc?

@@ -476,20 +483,30 @@ static size_t drop_ffs(const nand_info_t *nand, const u_char *buf,
  * Write image to NAND flash.
* Blocks that are marked bad are skipped and the is written to the next * block instead as long as the image is short enough to fit even after
- * skipping the bad blocks.
+ * skipping the bad blocks.  Due to bad blocks we may not be able to
+ * perform the requested write.  In the case where the write would
+ * extend beyond the end of the NAND device, both length and actual (if
+ * not NULL) are set to 0.  In the case where the write would extend
+ * beyond the limit we are passed, length is set to 0 and actual is set
+ * to the required length.
  *
  * @param nand         NAND device
  * @param offset       offset in flash
  * @param length       buffer length
+ * @param actual       set to size required to write length worth of
+ *                     buffer or 0, if not NULL

s/or 0/or 0 on error/
or
s/or 0/in case of success/

The read function doesn't have the "or 0" comment...

+ * @param lim maximum size that length may be in order to not
+ *                     exceed the buffer

s/that length may be/that actual may be/

  * @param buffer        buffer to read from
* @param flags flags modifying the behaviour of the write to NAND
  * @return             0 in case of success
  */
int nand_write_skip_bad(nand_info_t *nand, loff_t offset, size_t *length,
-                       u_char *buffer, int flags)
+               size_t *actual, loff_t lim, u_char *buffer, int flags)
 {
        int rval = 0, blocksize;
        size_t left_to_write = *length;
+       size_t used_for_write = 0;
        u_char *p_buffer = buffer;
        int need_skip;

@@ -526,16 +543,28 @@ int nand_write_skip_bad(nand_info_t *nand, loff_t offset, size_t *length,
        if ((offset & (nand->writesize - 1)) != 0) {
                printf("Attempt to write non page-aligned data\n");
                *length = 0;
+               if (actual)
+                       *actual = 0;
                return -EINVAL;
        }

Again, what about the returns in the WITH_YAFFS_OOB section? Or if we document that "actual" is undefined for error returns we can not worry about this.

-Scott
_______________________________________________
U-Boot mailing list
[email protected]
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to