diff options
author | Markus Pargmann <mpa@pengutronix.de> | 2016-07-05 12:37:36 +0200 |
---|---|---|
committer | Markus Pargmann <mpa@pengutronix.de> | 2016-07-05 16:05:21 +0200 |
commit | 2839d4f6f4fe6908cd41976807261ec760490499 (patch) | |
tree | 5444c351ab2e00d19bd7be066630fbe80c0fc1e6 /src/barebox-state/backend_storage.c | |
parent | 10c085e428ab5497166142cbd57de2b52cccc2e5 (diff) | |
download | dt-utils-2839d4f6f4fe6908cd41976807261ec760490499.tar.gz dt-utils-2839d4f6f4fe6908cd41976807261ec760490499.tar.xz |
Update barebox-state
Fixed direct bucket
Signed-off-by: Markus Pargmann <mpa@pengutronix.de>
Diffstat (limited to 'src/barebox-state/backend_storage.c')
-rw-r--r-- | src/barebox-state/backend_storage.c | 65 |
1 files changed, 60 insertions, 5 deletions
diff --git a/src/barebox-state/backend_storage.c b/src/barebox-state/backend_storage.c index 4620eda..6b9d86b 100644 --- a/src/barebox-state/backend_storage.c +++ b/src/barebox-state/backend_storage.c @@ -27,6 +27,23 @@ const unsigned int min_copies_written = 1; +static int bucket_lazy_init(struct state_backend_storage_bucket *bucket) +{ + int ret; + + if (bucket->initialized) + return 0; + + if (bucket->init) { + ret = bucket->init(bucket); + if (ret) + return ret; + } + bucket->initialized = true; + + return 0; +} + /** * state_storage_write - Writes the given data to the storage * @param storage Storage object @@ -48,9 +65,19 @@ int state_storage_write(struct state_backend_storage *storage, int ret; int copies_written = 0; + if (storage->readonly) + return 0; + list_for_each_entry(bucket, &storage->buckets, bucket_list) { - ret = bucket->write(bucket, buf, len); + ret = bucket_lazy_init(bucket); if (ret) { + dev_warn(storage->dev, "Failed to init bucket/write state backend bucket, %d\n", + ret); + continue; + } + + ret = bucket->write(bucket, buf, len); + if (ret < 0) { dev_warn(storage->dev, "Failed to write state backend bucket, %d\n", ret); } else { @@ -78,9 +105,8 @@ int state_storage_write(struct state_backend_storage *storage, * to all buckets. Bucket implementations that need to keep the number of writes * low, can read their own copy first and compare it. */ -int state_storage_restore_consistency(struct state_backend_storage - *storage, const uint8_t * buf, - ssize_t len) +int state_storage_restore_consistency(struct state_backend_storage *storage, + const uint8_t * buf, ssize_t len) { return state_storage_write(storage, buf, len); } @@ -111,6 +137,13 @@ int state_storage_read(struct state_backend_storage *storage, list_for_each_entry(bucket, &storage->buckets, bucket_list) { *len = len_hint; + ret = bucket_lazy_init(bucket); + if (ret) { + dev_warn(storage->dev, "Failed to init bucket/read state backend bucket, %d\n", + ret); + continue; + } + ret = bucket->read(bucket, buf, len); if (ret) { dev_warn(storage->dev, "Failed to read from state backend bucket, trying next, %d\n", @@ -250,6 +283,7 @@ static int state_storage_mtd_buckets_init(struct state_backend_storage *storage, int ret; ssize_t writesize = meminfo->writesize; unsigned int eraseblock = offset / meminfo->erasesize; + bool lazy_init = true; if (non_circular) writesize = meminfo->erasesize; @@ -258,13 +292,21 @@ static int state_storage_mtd_buckets_init(struct state_backend_storage *storage, &bucket, eraseblock, writesize, - meminfo); + meminfo, + lazy_init); if (ret) { dev_warn(storage->dev, "Failed to create bucket at '%s' eraseblock %u\n", path, eraseblock); continue; } + ret = state_backend_bucket_cached_create(storage->dev, bucket, + &bucket); + if (ret) { + dev_warn(storage->dev, "Failed to setup cache bucket, continuing without cache, %d\n", + ret); + } + list_add_tail(&bucket->bucket_list, &storage->buckets); ++nr_copies; if (nr_copies >= desired_copies) @@ -387,6 +429,13 @@ static int state_storage_file_buckets_init(struct state_backend_storage *storage continue; } + ret = state_backend_bucket_cached_create(storage->dev, bucket, + &bucket); + if (ret) { + dev_warn(storage->dev, "Failed to setup cache bucket, continuing without cache, %d\n", + ret); + } + list_add_tail(&bucket->bucket_list, &storage->buckets); ++nr_copies; if (nr_copies >= desired_copies) @@ -428,6 +477,7 @@ int state_storage_init(struct state_backend_storage *storage, INIT_LIST_HEAD(&storage->buckets); storage->dev = dev; storage->name = storagetype; + storage->stridesize = stridesize; ret = mtd_get_meminfo(path, &meminfo); if (!ret && !(meminfo.flags & MTD_NO_ERASE)) { @@ -450,6 +500,11 @@ int state_storage_init(struct state_backend_storage *storage, dev_err(storage->dev, "storage init done\n"); } +void state_storage_set_readonly(struct state_backend_storage *storage) +{ + storage->readonly = true; +} + /** * state_storage_free - Free backend storage * @param storage Storage object |