From e7783a98af9456cb5dbc952ce7edb903d24e2915 Mon Sep 17 00:00:00 2001 From: Yi-Yo Chiang Date: Tue, 3 Aug 2021 01:02:31 +0800 Subject: [PATCH] fs_mgr: Add fs_mgr_flag overlayfs_remove_missing_lowerdir If this flag is given, then fs_mgr_mount_overlayfs_fstab_entry() shall filter out missing directories in the lowerdir= list. For example, test /mnt/vendor/overlay_test overlay \ ro,lowerdir=/dir1:/dir2:/missing_dir3 \ first_stage_mount,overlayfs_remove_missing_lowerdir should mount the overlayfs device with "lowerdir=/dir1:/dir2". Bug: 186342252 Test: Manual boot test with modified fstab on CF Change-Id: Id06b37d0c236528cef981e495280b4f4e9c2b4bb --- fs_mgr/fs_mgr.cpp | 19 ++++++++++++++++++- fs_mgr/fs_mgr_fstab.cpp | 1 + fs_mgr/include_fstab/fstab/fstab.h | 1 + 3 files changed, 20 insertions(+), 1 deletion(-) diff --git a/fs_mgr/fs_mgr.cpp b/fs_mgr/fs_mgr.cpp index 01c8ad3c4..d38fd7e29 100644 --- a/fs_mgr/fs_mgr.cpp +++ b/fs_mgr/fs_mgr.cpp @@ -2322,7 +2322,24 @@ bool fs_mgr_mount_overlayfs_fstab_entry(const FstabEntry& entry) { return false; } - auto options = "lowerdir=" + entry.lowerdir; + auto lowerdir = entry.lowerdir; + if (entry.fs_mgr_flags.overlayfs_remove_missing_lowerdir) { + bool removed_any = false; + std::vector lowerdirs; + for (const auto& dir : android::base::Split(entry.lowerdir, ":")) { + if (access(dir.c_str(), F_OK)) { + PWARNING << __FUNCTION__ << "(): remove missing lowerdir '" << dir << "'"; + removed_any = true; + } else { + lowerdirs.push_back(dir); + } + } + if (removed_any) { + lowerdir = android::base::Join(lowerdirs, ":"); + } + } + + auto options = "lowerdir=" + lowerdir; if (overlayfs_valid_result == OverlayfsValidResult::kOverrideCredsRequired) { options += ",override_creds=off"; } diff --git a/fs_mgr/fs_mgr_fstab.cpp b/fs_mgr/fs_mgr_fstab.cpp index d0c89b909..230a703f5 100644 --- a/fs_mgr/fs_mgr_fstab.cpp +++ b/fs_mgr/fs_mgr_fstab.cpp @@ -181,6 +181,7 @@ void ParseFsMgrFlags(const std::string& flags, FstabEntry* entry) { CheckFlag("fsverity", fs_verity); CheckFlag("metadata_csum", ext_meta_csum); CheckFlag("fscompress", fs_compress); + CheckFlag("overlayfs_remove_missing_lowerdir", overlayfs_remove_missing_lowerdir); #undef CheckFlag diff --git a/fs_mgr/include_fstab/fstab/fstab.h b/fs_mgr/include_fstab/fstab/fstab.h index f33768b9d..9a4ed465a 100644 --- a/fs_mgr/include_fstab/fstab/fstab.h +++ b/fs_mgr/include_fstab/fstab/fstab.h @@ -86,6 +86,7 @@ struct FstabEntry { bool fs_verity : 1; bool ext_meta_csum : 1; bool fs_compress : 1; + bool overlayfs_remove_missing_lowerdir : 1; } fs_mgr_flags = {}; bool is_encryptable() const {