summaryrefslogtreecommitdiffstats
path: root/common/state
diff options
context:
space:
mode:
authorSascha Hauer <s.hauer@pengutronix.de>2019-02-13 20:31:47 +0100
committerSascha Hauer <s.hauer@pengutronix.de>2019-02-13 20:31:47 +0100
commit2a17e75a976d11c1712972d29813094b8020ac35 (patch)
treeea0e991c927752937803d72a5411f7159365aa83 /common/state
parenta5f75fe8175aefec5b7cefaadc5359096c8eb22c (diff)
parent7185b353c96e1e831533eeaaada06ad9bebf84a2 (diff)
downloadbarebox-2a17e75a976d11c1712972d29813094b8020ac35.tar.gz
barebox-2a17e75a976d11c1712972d29813094b8020ac35.tar.xz
Merge branch 'for-next/misc'
Diffstat (limited to 'common/state')
-rw-r--r--common/state/backend_bucket_circular.c40
-rw-r--r--common/state/backend_bucket_direct.c3
-rw-r--r--common/state/backend_format_raw.c4
-rw-r--r--common/state/backend_storage.c22
-rw-r--r--common/state/state.c12
-rw-r--r--common/state/state.h2
6 files changed, 48 insertions, 35 deletions
diff --git a/common/state/backend_bucket_circular.c b/common/state/backend_bucket_circular.c
index 4b71d8751d..da7c8421ae 100644
--- a/common/state/backend_bucket_circular.c
+++ b/common/state/backend_bucket_circular.c
@@ -23,6 +23,10 @@
#include <mtd/mtd-peb.h>
#include <string.h>
+#ifndef __BAREBOX__
+#include <sys/param.h>
+#endif
+
#include "state.h"
/*
@@ -161,17 +165,17 @@ static int state_mtd_peb_read(struct state_backend_storage_bucket_circular *circ
ret = lseek(circ->fd, offset, SEEK_SET);
if (ret < 0) {
dev_err(circ->dev, "Failed to set circular read position to %lld, %d\n",
- offset, ret);
+ (long long) offset, ret);
return ret;
}
- dev_dbg(circ->dev, "Read state from %ld length %zd\n", offset,
+ dev_dbg(circ->dev, "Read state from %lld length %d\n", (long long) offset,
len);
ret = read_full(circ->fd, buf, len);
if (ret < 0) {
- dev_err(circ->dev, "Failed to read circular storage len %zd, %d\n",
+ dev_err(circ->dev, "Failed to read circular storage len %d, %d\n",
len, ret);
free(buf);
}
@@ -189,15 +193,15 @@ static int state_mtd_peb_write(struct state_backend_storage_bucket_circular *cir
ret = lseek(circ->fd, offset, SEEK_SET);
if (ret < 0) {
- dev_err(circ->dev, "Failed to set position for circular write %ld, %d\n",
- offset, ret);
+ dev_err(circ->dev, "Failed to set position for circular write %lld, %d\n",
+ (long long) offset, ret);
return ret;
}
ret = write_full(circ->fd, buf, len);
if (ret < 0) {
- dev_err(circ->dev, "Failed to write circular to %ld length %zd, %d\n",
- offset, len, ret);
+ dev_err(circ->dev, "Failed to write circular to %lld length %d, %d\n",
+ (long long) offset, len, ret);
return ret;
}
@@ -207,8 +211,8 @@ static int state_mtd_peb_write(struct state_backend_storage_bucket_circular *cir
*/
flush(circ->fd);
- dev_dbg(circ->dev, "Written state to offset %ld length %zd data length %zd\n",
- offset, len, len);
+ dev_dbg(circ->dev, "Written state to offset %lld length %d data length %d\n",
+ (long long) offset, len, len);
return 0;
}
@@ -265,8 +269,8 @@ static int state_backend_bucket_circular_read(struct state_backend_storage_bucke
if (!buf)
return -ENOMEM;
- dev_dbg(circ->dev, "Read state from PEB %u global offset %ld length %zd\n",
- circ->eraseblock, offset, read_len);
+ dev_dbg(circ->dev, "Read state from PEB %u global offset %lld length %zd\n",
+ circ->eraseblock, (long long) offset, read_len);
ret = state_mtd_peb_read(circ, buf, offset, read_len);
if (ret < 0 && ret != -EUCLEAN) {
@@ -298,7 +302,7 @@ static int state_backend_bucket_circular_write(struct state_backend_storage_buck
void *write_buf;
if (written_length > circ->max_size) {
- dev_err(circ->dev, "Error, state data too big to be written, to write: %zd, writesize: %zd, length: %zd, available: %zd\n",
+ dev_err(circ->dev, "Error, state data too big to be written, to write: %u, writesize: %zd, length: %zd, available: %zd\n",
written_length, circ->writesize, len, circ->max_size);
return -E2BIG;
}
@@ -345,13 +349,13 @@ static int state_backend_bucket_circular_write(struct state_backend_storage_buck
ret = state_mtd_peb_write(circ, write_buf, offset, written_length);
if (ret < 0 && ret != -EUCLEAN) {
- dev_err(circ->dev, "Failed to write circular to %ld length %zd, %d\n",
- offset, written_length, ret);
+ dev_err(circ->dev, "Failed to write circular to %lld length %u, %d\n",
+ (long long) offset, written_length, ret);
goto out_free;
}
- dev_dbg(circ->dev, "Written state to PEB %u offset %ld length %zd data length %zd\n",
- circ->eraseblock, offset, written_length, len);
+ dev_dbg(circ->dev, "Written state to PEB %u offset %lld length %u data length %zd\n",
+ circ->eraseblock, (long long) offset, written_length, len);
out_free:
free(write_buf);
@@ -445,8 +449,8 @@ static int bucket_circular_is_block_bad(struct state_backend_storage_bucket_circ
ret = ioctl(circ->fd, MEMGETBADBLOCK, &offs);
if (ret < 0)
- dev_err(circ->dev, "Failed to use ioctl to check for bad block at offset %ld, %d\n",
- offs, ret);
+ dev_err(circ->dev, "Failed to use ioctl to check for bad block at offset %lld, %d\n",
+ (long long) offs, ret);
return ret;
}
diff --git a/common/state/backend_bucket_direct.c b/common/state/backend_bucket_direct.c
index 9d6a337e66..1f00b0fb2f 100644
--- a/common/state/backend_bucket_direct.c
+++ b/common/state/backend_bucket_direct.c
@@ -110,6 +110,9 @@ static int state_backend_bucket_direct_write(struct state_backend_storage_bucket
int ret;
struct state_backend_storage_bucket_direct_meta meta;
+ if (len > direct->max_size - sizeof(meta))
+ return -E2BIG;
+
ret = lseek(direct->fd, direct->offset, SEEK_SET);
if (ret < 0) {
dev_err(direct->dev, "Failed to seek file, %d\n", ret);
diff --git a/common/state/backend_format_raw.c b/common/state/backend_format_raw.c
index 4369f76e37..5a71149d34 100644
--- a/common/state/backend_format_raw.c
+++ b/common/state/backend_format_raw.c
@@ -127,7 +127,7 @@ static int backend_format_raw_verify(struct state_backend_format *format,
return -EINVAL;
}
- if (backend_raw->algo && !(flags & STATE_FLAG_NO_AUTHENTIFICATION)) {
+ if (backend_raw->algo && !(flags & STATE_FLAG_NO_AUTHENTICATION)) {
ret = backend_raw_digest_init(backend_raw);
if (ret)
return ret;
@@ -153,7 +153,7 @@ static int backend_format_raw_verify(struct state_backend_format *format,
*lenp = header->data_len + sizeof(*header);
- if (backend_raw->algo && !(flags & STATE_FLAG_NO_AUTHENTIFICATION)) {
+ if (backend_raw->algo && !(flags & STATE_FLAG_NO_AUTHENTICATION)) {
const void *hmac = data + header->data_len;
/* hmac over header and data */
diff --git a/common/state/backend_storage.c b/common/state/backend_storage.c
index c6ebe86244..fca887e93f 100644
--- a/common/state/backend_storage.c
+++ b/common/state/backend_storage.c
@@ -19,7 +19,7 @@
#include <linux/kernel.h>
#include <linux/list.h>
#include <linux/mtd/mtd-abi.h>
-#include <linux/stat.h>
+#include <sys/stat.h>
#include <malloc.h>
#include <printk.h>
@@ -111,11 +111,11 @@ refresh:
ret = bucket->write(bucket, buf, len);
if (ret) {
- dev_warn(storage->dev, "Failed to restore bucket %d@0x%08lx\n",
- bucket->num, bucket->offset);
+ dev_warn(storage->dev, "Failed to restore bucket %d@0x%08llx\n",
+ bucket->num, (long long) bucket->offset);
} else {
- dev_info(storage->dev, "restored bucket %d@0x%08lx\n",
- bucket->num, bucket->offset);
+ dev_info(storage->dev, "restored bucket %d@0x%08llx\n",
+ bucket->num, (long long) bucket->offset);
bucket->needs_refresh = 0;
}
@@ -166,7 +166,7 @@ int state_storage_read(struct state_backend_storage *storage,
if (!ret && !bucket_used)
bucket_used = bucket;
if (ret)
- dev_info(storage->dev, "Ignoring broken bucket %d@0x%08lx...\n", bucket->num, bucket->offset);
+ dev_info(storage->dev, "Ignoring broken bucket %d@0x%08llx...\n", bucket->num, (long long) bucket->offset);
}
dev_dbg(storage->dev, "Checking redundant buckets finished.\n");
@@ -177,7 +177,7 @@ int state_storage_read(struct state_backend_storage *storage,
return -ENOENT;
}
- dev_info(storage->dev, "Using bucket %d@0x%08lx\n", bucket_used->num, bucket_used->offset);
+ dev_info(storage->dev, "Using bucket %d@0x%08llx\n", bucket_used->num, (long long) bucket_used->offset);
/*
* Restore/refresh all buckets except the one we currently use (in case
@@ -252,8 +252,8 @@ static int state_storage_mtd_buckets_init(struct state_backend_storage *storage,
end = meminfo->size;
if (!IS_ALIGNED(storage->offset, meminfo->erasesize)) {
- dev_err(storage->dev, "Offset within the device is not aligned to eraseblocks. Offset is %ld, erasesize %u\n",
- storage->offset, meminfo->erasesize);
+ dev_err(storage->dev, "Offset within the device is not aligned to eraseblocks. Offset is %lld, erasesize %u\n",
+ (long long) storage->offset, meminfo->erasesize);
return -EINVAL;
}
@@ -326,8 +326,8 @@ static int state_storage_file_buckets_init(struct state_backend_storage *storage
&bucket, offset,
stridesize);
if (ret) {
- dev_warn(storage->dev, "Failed to create direct bucket at '%s' offset %ld\n",
- storage->path, offset);
+ dev_warn(storage->dev, "Failed to create direct bucket at '%s' offset %lld\n",
+ storage->path, (long long) offset);
continue;
}
diff --git a/common/state/state.c b/common/state/state.c
index 54c57232e6..3f5d43ecbf 100644
--- a/common/state/state.c
+++ b/common/state/state.c
@@ -128,7 +128,7 @@ int state_load(struct state *state)
int state_load_no_auth(struct state *state)
{
- return state_do_load(state, STATE_FLAG_NO_AUTHENTIFICATION);
+ return state_do_load(state, STATE_FLAG_NO_AUTHENTICATION);
}
static int state_format_init(struct state *state, const char *backend_format,
@@ -596,6 +596,8 @@ struct state *state_new_from_node(struct device_node *node, bool readonly)
const char *alias;
uint32_t stridesize;
struct device_node *partition_node;
+ off_t offset = 0;
+ size_t size = 0;
alias = of_alias_get(node);
if (!alias) {
@@ -614,7 +616,11 @@ struct state *state_new_from_node(struct device_node *node, bool readonly)
goto out_release_state;
}
+#ifdef __BAREBOX__
ret = of_find_path_by_node(partition_node, &state->backend_path, 0);
+#else
+ ret = of_get_devicepath(partition_node, &state->backend_path, &offset, &size);
+#endif
if (ret) {
if (ret != -EPROBE_DEFER)
dev_err(&state->dev, "state failed to parse path to backend: %s\n",
@@ -645,8 +651,8 @@ struct state *state_new_from_node(struct device_node *node, bool readonly)
if (ret)
goto out_release_state;
- ret = state_storage_init(state, state->backend_path, 0,
- 0, stridesize, storage_type);
+ ret = state_storage_init(state, state->backend_path, offset,
+ size, stridesize, storage_type);
if (ret)
goto out_release_state;
diff --git a/common/state/state.h b/common/state/state.h
index 3a0662fd25..912d6d4848 100644
--- a/common/state/state.h
+++ b/common/state/state.h
@@ -6,7 +6,7 @@ struct state;
struct mtd_info_user;
enum state_flags {
- STATE_FLAG_NO_AUTHENTIFICATION = (1 << 0),
+ STATE_FLAG_NO_AUTHENTICATION = (1 << 0),
};
enum state_variable_type {