diff --git a/fs_mgr/fs_mgr.cpp b/fs_mgr/fs_mgr.cpp index 4826ccf6c..4e6d642c9 100644 --- a/fs_mgr/fs_mgr.cpp +++ b/fs_mgr/fs_mgr.cpp @@ -2328,7 +2328,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 f5ab5571f..9b6c3dd41 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 {