diff options
author | Sami Tolvanen <samitolvanen@google.com> | 2015-12-10 20:13:02 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2015-12-10 20:13:02 +0000 |
commit | 907ec7daa761624012476e540d8fe473b67b94bf (patch) | |
tree | 885cbe0bd7ea875a24ed4e4443a03ea3be835e50 | |
parent | 0d1214c68ea95543468b09f7ae27bd65c8c8d7c0 (diff) | |
parent | ff980d22d1c322173bed6289fd9448d8b5e58144 (diff) | |
download | core-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.cpp | 42 |
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, ¶ms, - format_verity_table) < 0 && - // try the legacy format for backwards compatibility - load_verity_table(io, mount_point, verity.data_size, fd, ¶ms, - 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, ¶ms, + format_verity_table) == 0) { + goto loaded; + } + } + + // try the legacy format for backwards compatibility + if (load_verity_table(io, mount_point, verity.data_size, fd, ¶ms, + 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, ¶ms, + 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; |