diff options
author | Marc Kleine-Budde <mkl@pengutronix.de> | 2015-04-28 13:12:20 +0200 |
---|---|---|
committer | Marc Kleine-Budde <mkl@pengutronix.de> | 2015-04-28 15:13:37 +0200 |
commit | f327ec4a34fd787050bddbe6426c452a4c6b7c83 (patch) | |
tree | 8e1f1d0a673db4df206b212c9f4f23a280a06a2b | |
parent | 6d58ca4cf725db7e694c376f97de81c69dc5c9d6 (diff) | |
download | dt-utils-f327ec4a34fd787050bddbe6426c452a4c6b7c83.tar.gz dt-utils-f327ec4a34fd787050bddbe6426c452a4c6b7c83.tar.xz |
barebox-state: backend_raw: properly align write and erase size
On Linux the ease and write size have to be aligned. This patch uses step_size
(which is already aligned to erase block size) during erase, aligns full_size
to writesize and uses it while writing.
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
-rw-r--r-- | src/barebox-state.c | 14 |
1 files changed, 7 insertions, 7 deletions
diff --git a/src/barebox-state.c b/src/barebox-state.c index 61f8a2d..3e3cb41 100644 --- a/src/barebox-state.c +++ b/src/barebox-state.c @@ -1097,7 +1097,7 @@ static int backend_raw_write_one(struct state_backend_raw *backend_raw, return ret; if (backend_raw->need_erase) { - ret = erase(fd, backend_raw->size_full, offset); + ret = erase(fd, backend_raw->step, offset); if (ret) return ret; } @@ -1114,14 +1114,12 @@ static int state_backend_raw_save(struct state_backend *backend, { struct state_backend_raw *backend_raw = container_of(backend, struct state_backend_raw, backend); - int ret = 0, size, fd; + int ret = 0, fd; void *buf, *data; struct backend_raw_header *header; struct state_variable *sv; - size = backend_raw->size_data + sizeof(struct backend_raw_header); - - buf = xzalloc(size); + buf = xzalloc(backend_raw->size_full); header = buf; data = buf + sizeof(*header); @@ -1140,12 +1138,12 @@ static int state_backend_raw_save(struct state_backend *backend, goto out_free; ret = backend_raw_write_one(backend_raw, state, fd, - !backend_raw->num_copy_read, buf, size); + !backend_raw->num_copy_read, buf, backend_raw->size_full); if (ret) goto out_close; ret = backend_raw_write_one(backend_raw, state, fd, - backend_raw->num_copy_read, buf, size); + backend_raw->num_copy_read, buf, backend_raw->size_full); if (ret) goto out_close; @@ -1216,6 +1214,8 @@ int state_backend_raw_file(struct state *state, const char *path, off_t offset, ret = mtd_get_meminfo(backend->path, &meminfo); if (!ret && !(meminfo.flags & MTD_NO_ERASE)) { backend_raw->need_erase = true; + backend_raw->size_full = ALIGN(backend_raw->size_full, + meminfo.writesize); backend_raw->step = ALIGN(backend_raw->size_full, meminfo.erasesize); dev_dbg(&state->dev, "is a mtd, adjust stepsize to %ld\n", |