summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarc Kleine-Budde <mkl@pengutronix.de>2015-04-28 13:12:20 +0200
committerMarc Kleine-Budde <mkl@pengutronix.de>2015-04-28 15:13:37 +0200
commitf327ec4a34fd787050bddbe6426c452a4c6b7c83 (patch)
tree8e1f1d0a673db4df206b212c9f4f23a280a06a2b
parent6d58ca4cf725db7e694c376f97de81c69dc5c9d6 (diff)
downloaddt-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.c14
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",