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"