summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSami Tolvanen <samitolvanen@google.com>2015-12-10 20:13:02 +0000
committerGerrit Code Review <noreply-gerritcodereview@google.com>2015-12-10 20:13:02 +0000
commit907ec7daa761624012476e540d8fe473b67b94bf (patch)
tree885cbe0bd7ea875a24ed4e4443a03ea3be835e50
parent0d1214c68ea95543468b09f7ae27bd65c8c8d7c0 (diff)
parentff980d22d1c322173bed6289fd9448d8b5e58144 (diff)
downloadcore-907ec7daa761624012476e540d8fe473b67b94bf.tar.gz
core-907ec7daa761624012476e540d8fe473b67b94bf.tar.bz2
core-907ec7daa761624012476e540d8fe473b67b94bf.zip
Merge "fs_mgr: support upstream dm-verity without error correction"
-rw-r--r--fs_mgr/fs_mgr_verity.cpp42
1 files changed, 36 insertions, 6 deletions
diff --git a/fs_mgr/fs_mgr_verity.cpp b/fs_mgr/fs_mgr_verity.cpp
index 13d348571..b5141c934 100644
--- a/fs_mgr/fs_mgr_verity.cpp
+++ b/fs_mgr/fs_mgr_verity.cpp
@@ -254,7 +254,7 @@ static bool format_verity_table(char *buf, const size_t bufsize,
res = snprintf(buf, bufsize, "%s 2 " VERITY_TABLE_OPT_IGNZERO " %s", params->table,
mode_flag);
} else {
- res = strlcpy(buf, params->table, bufsize);
+ res = snprintf(buf, bufsize, "%s 1 " VERITY_TABLE_OPT_IGNZERO, params->table);
}
if (res < 0 || (size_t)res >= bufsize) {
@@ -944,13 +944,43 @@ int fs_mgr_setup_verity(struct fstab_rec *fstab)
// load the verity mapping table
if (load_verity_table(io, mount_point, verity.data_size, fd, &params,
- format_verity_table) < 0 &&
- // try the legacy format for backwards compatibility
- load_verity_table(io, mount_point, verity.data_size, fd, &params,
- format_legacy_verity_table) < 0) {
- goto out;
+ format_verity_table) == 0) {
+ goto loaded;
}
+ if (params.ecc.valid) {
+ // kernel may not support error correction, try without
+ INFO("Disabling error correction for %s\n", mount_point);
+ params.ecc.valid = false;
+
+ if (load_verity_table(io, mount_point, verity.data_size, fd, &params,
+ format_verity_table) == 0) {
+ goto loaded;
+ }
+ }
+
+ // try the legacy format for backwards compatibility
+ if (load_verity_table(io, mount_point, verity.data_size, fd, &params,
+ format_legacy_verity_table) == 0) {
+ goto loaded;
+ }
+
+ if (params.mode != VERITY_MODE_EIO) {
+ // as a last resort, EIO mode should always be supported
+ INFO("Falling back to EIO mode for %s\n", mount_point);
+ params.mode = VERITY_MODE_EIO;
+
+ if (load_verity_table(io, mount_point, verity.data_size, fd, &params,
+ format_legacy_verity_table) == 0) {
+ goto loaded;
+ }
+ }
+
+ ERROR("Failed to load verity table for %s\n", mount_point);
+ goto out;
+
+loaded:
+
// activate the device
if (resume_verity_table(io, mount_point, fd) < 0) {
goto out;