From 4056ccc2e52930ad6200ca8ba351f813a03c1f81 Mon Sep 17 00:00:00 2001 From: Eric Biggers Date: Thu, 29 Jul 2021 19:04:41 -0700 Subject: [PATCH] fs_mgr: Look for fstab file in /system/etc Look for the fstab file in /system/etc as an alternative to /, in order to allow fstab files to be installed using the "prebuilt_etc" Soong module. This new path is meant to be used by the vendor ramdisk only. As before, fstabs should *not* be placed in /system/etc on the system partition. In more detail: sometimes, multiple nearly-identical fstabs need to be installed to a device, with the correct one being selected at boot time (b/191417025 as well as other cases that partners have run into). To avoid error-prone duplication of configuration files, these fstabs should be generated from a template by the build system instead of being duplicated in the source tree. But if this is done, the usual way of installing fstabs (PRODUCT_COPY_FILES) can't be used; they need to be made into real build system modules instead. Currently, the "prebuilt_etc" Soong module can't correctly install the vendor_ramdisk copy of the fstab(s), since it will install it into the /system/etc directory whereas Android currently requires that the vendor_ramdisk copy of the fstab(s) be placed in the root directory. Earlier I proposed adding a "prebuilt_fstab" module to handle this quirk (https://r.android.com/1744033). However, it was requested to instead always look for the fstabs in /etc too, in order to allow "prebuilt_etc" to be used and because /etc is the appropriate place for this file. This change implements that suggestion (but actually using /system/etc, since that is where "prebuilt_etc" actually installs it). Bug: 191417025 Test: Tested that a device boots both with this, both before and after http://ag/15075136 which uses the new location. Change-Id: Id083070e51ae85959167e4615cd96b31a0b1bd6a Merged-In: Id083070e51ae85959167e4615cd96b31a0b1bd6a (cherry picked from commit e98afa2687eb56184dad8569b929eba04fb93068) --- fs_mgr/fs_mgr_fstab.cpp | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/fs_mgr/fs_mgr_fstab.cpp b/fs_mgr/fs_mgr_fstab.cpp index d0c89b909..f5ab5571f 100644 --- a/fs_mgr/fs_mgr_fstab.cpp +++ b/fs_mgr/fs_mgr_fstab.cpp @@ -413,17 +413,24 @@ std::string ReadFstabFromDt() { return fstab_result; } -// Identify path to fstab file. Lookup is based on pattern -// fstab., fstab., fstab. in -// folders /odm/etc, vendor/etc, or /. +// Return the path to the fstab file. There may be multiple fstab files; the +// one that is returned will be the first that exists of fstab., +// fstab., and fstab.. The fstab is searched for +// in /odm/etc/ and /vendor/etc/, as well as in the locations where it may be in +// the first stage ramdisk during early boot. Previously, the first stage +// ramdisk's copy of the fstab had to be located in the root directory, but now +// the system/etc directory is supported too and is the preferred location. std::string GetFstabPath() { for (const char* prop : {"fstab_suffix", "hardware", "hardware.platform"}) { std::string suffix; if (!fs_mgr_get_boot_config(prop, &suffix)) continue; - for (const char* prefix : - {"/odm/etc/fstab.", "/vendor/etc/fstab.", "/fstab.", "/first_stage_ramdisk/fstab."}) { + for (const char* prefix : {// late-boot/post-boot locations + "/odm/etc/fstab.", "/vendor/etc/fstab.", + // early boot locations + "/system/etc/fstab.", "/first_stage_ramdisk/system/etc/fstab.", + "/fstab.", "/first_stage_ramdisk/fstab."}) { std::string fstab_path = prefix + suffix; if (access(fstab_path.c_str(), F_OK) == 0) { return fstab_path;