From 0bfa1c8b3c19146405372d0cfb527b66ee75d433 Mon Sep 17 00:00:00 2001 From: David Anderson Date: Tue, 30 Oct 2018 15:06:46 -0700 Subject: [PATCH] fs_mgr: Allow overriding the super partition name via the kernel commandline. For retrofit devices where the super partition is not called "super", this allows the correct partition to be passed via the kernel command-line, i.e.: androidboot.super_partition=system Since retrofitting is only supported for A/B devices, we assume that a partition named this way must be slot-suffixed. Bug: 116802789 Test: manual test Change-Id: I930dbbd397d5552e9ded89baa5a7bb0e63c67426 --- fs_mgr/fs_mgr.cpp | 21 ++++++++++++++++++++- fs_mgr/fs_mgr_priv.h | 2 ++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/fs_mgr/fs_mgr.cpp b/fs_mgr/fs_mgr.cpp index ae2e2fe4c..c321fe3eb 100644 --- a/fs_mgr/fs_mgr.cpp +++ b/fs_mgr/fs_mgr.cpp @@ -1588,6 +1588,25 @@ bool fs_mgr_update_verity_state(std::function call return true; } -std::string fs_mgr_get_super_partition_name(int /* slot */) { +std::string fs_mgr_get_super_partition_name(int slot) { + // Devices upgrading to dynamic partitions are allowed to specify a super + // partition name, assumed to be A/B (non-A/B retrofit is not supported). + // For devices launching with dynamic partition support, the partition + // name must be "super". + std::string super_partition; + if (fs_mgr_get_boot_config_from_kernel_cmdline("super_partition", &super_partition)) { + std::string suffix; + if (slot == 0) { + suffix = "_a"; + } else if (slot == 1) { + suffix = "_b"; + } else if (slot == -1) { + suffix = fs_mgr_get_slot_suffix(); + } + if (suffix.empty()) { + LFATAL << "Super partition name can only be overridden on A/B devices."; + } + return super_partition + suffix; + } return LP_METADATA_DEFAULT_PARTITION_NAME; } diff --git a/fs_mgr/fs_mgr_priv.h b/fs_mgr/fs_mgr_priv.h index 5e83cfb2f..23a92d39e 100644 --- a/fs_mgr/fs_mgr_priv.h +++ b/fs_mgr/fs_mgr_priv.h @@ -39,11 +39,13 @@ #define LINFO LOG(INFO) << FS_MGR_TAG #define LWARNING LOG(WARNING) << FS_MGR_TAG #define LERROR LOG(ERROR) << FS_MGR_TAG +#define LFATAL LOG(FATAL) << FS_MGR_TAG // Logs a message with strerror(errno) at the end #define PINFO PLOG(INFO) << FS_MGR_TAG #define PWARNING PLOG(WARNING) << FS_MGR_TAG #define PERROR PLOG(ERROR) << FS_MGR_TAG +#define PFATAL PLOG(FATAL) << FS_MGR_TAG #define CRYPTO_TMPFS_OPTIONS "size=512m,mode=0771,uid=1000,gid=1000"