[U-Boot] [PATCH] fastboot: sparse: fix chunk write offset calculation
Jeffy Chen
jeffy.chen at rock-chips.com
Tue Feb 2 09:43:31 CET 2016
We should count skipped blocks in when calculating write offset.
Signed-off-by: Jeffy Chen <jeffy.chen at rock-chips.com>
---
common/image-sparse.c | 31 ++++++++-----------------------
1 file changed, 8 insertions(+), 23 deletions(-)
diff --git a/common/image-sparse.c b/common/image-sparse.c
index dffe844..542a8c4 100644
--- a/common/image-sparse.c
+++ b/common/image-sparse.c
@@ -52,8 +52,6 @@ typedef struct sparse_buffer {
u16 type;
} sparse_buffer_t;
-static uint32_t last_offset;
-
static unsigned int sparse_get_chunk_data_size(sparse_header_t *sparse,
chunk_header_t *chunk)
{
@@ -273,8 +271,7 @@ int store_sparse_image(sparse_storage_t *storage, void *storage_priv,
sparse_header_t *sparse_header;
chunk_header_t *chunk_header;
sparse_buffer_t *buffer;
- uint32_t start;
- uint32_t total_blocks = 0;
+ uint32_t wrote_blocks = 0;
uint32_t skipped = 0;
int i;
@@ -303,17 +300,8 @@ int store_sparse_image(sparse_storage_t *storage, void *storage_priv,
return -EINVAL;
}
- /*
- * If it's a new flashing session, start at the beginning of
- * the partition. If not, then simply resume where we were.
- */
- if (session_id > 0)
- start = last_offset;
- else
- start = storage->start;
-
printf("Flashing sparse image on partition %s at offset 0x%x (ID: %d)\n",
- storage->name, start * storage->block_sz, session_id);
+ storage->name, storage->start * storage->block_sz, session_id);
/* Start processing chunks */
for (chunk = 0; chunk < sparse_header->total_chunks; chunk++) {
@@ -344,8 +332,7 @@ int store_sparse_image(sparse_storage_t *storage, void *storage_priv,
blkcnt = (buffer->length / storage->block_sz) * buffer->repeat;
- if ((start + total_blocks + blkcnt) >
- (storage->start + storage->size)) {
+ if ((wrote_blocks + skipped + blkcnt) > storage->size) {
printf("%s: Request would exceed partition size!\n",
__func__);
return -EINVAL;
@@ -358,7 +345,7 @@ int store_sparse_image(sparse_storage_t *storage, void *storage_priv,
buffer_blk_cnt = buffer->length / storage->block_sz;
ret = storage->write(storage, storage_priv,
- start + total_blocks,
+ storage->start + wrote_blocks + skipped,
buffer_blk_cnt,
buffer->data);
if (ret < 0) {
@@ -367,27 +354,25 @@ int store_sparse_image(sparse_storage_t *storage, void *storage_priv,
return ret;
}
- total_blocks += ret;
+ wrote_blocks += ret;
}
sparse_put_data_buffer(buffer);
}
debug("Wrote %d blocks, skipped %d, expected to write %d blocks\n",
- total_blocks, skipped,
+ wrote_blocks, skipped,
sparse_block_size_to_storage(sparse_header->total_blks,
storage, sparse_header));
- printf("........ wrote %d blocks to '%s'\n", total_blocks,
+ printf("........ wrote %d blocks to '%s'\n", wrote_blocks,
storage->name);
- if ((total_blocks + skipped) !=
+ if ((wrote_blocks + skipped) !=
sparse_block_size_to_storage(sparse_header->total_blks,
storage, sparse_header)) {
printf("sparse image write failure\n");
return -EIO;
}
- last_offset = start + total_blocks;
-
return 0;
}
--
2.1.4
More information about the U-Boot
mailing list