Revert "Use /bootstrap-apex for bootstrap APEXes"
Revert submission 2666915-share-bootstrap
Reason for revert: b/293949266 vold_prepare_subdirs fails to create apexdata directories.
Reverted changes: /q/submissionid:2666915-share-bootstrap
Change-Id: I3e97e8511755844de4b54f51ff20afc154bd8e74
diff --git a/init/builtins.cpp b/init/builtins.cpp
index e4f0bd0..2176233 100644
--- a/init/builtins.cpp
+++ b/init/builtins.cpp
@@ -1262,51 +1262,6 @@
return {};
}
-
-static Result<void> MountApexRootForDefaultNamespace() {
- auto mount_namespace_id = GetCurrentMountNamespace();
- if (!mount_namespace_id.ok()) {
- return mount_namespace_id.error();
- }
- // There's nothing to do if it's still in the bootstrap mount namespace.
- // This happens when we don't need to update APEXes (e.g. Microdroid)
- // where bootstrap mount namespace == default mount namespace.
- if (mount_namespace_id.value() == NS_BOOTSTRAP) {
- return {};
- }
-
- // Now, we're in the "default" mount namespace and need a fresh /apex for
- // the default mount namespace.
- //
- // At this point, there are two mounts at the same mount point: /apex
- // - to tmpfs (private)
- // - to /bootstrap-apex (shared)
- //
- // We need unmount the second mount so that /apex in the default mount
- // namespace becomes RW/empty and "private" (we don't want mount events to
- // propagate to the bootstrap mount namespace).
- //
- // Likewise, we don't want the unmount event itself to propagate to the
- // bootstrap mount namespace. Otherwise, /apex in the bootstrap mount
- // namespace would become empty due to the unmount.
- //
- // Hence, before unmounting, we make /apex (the second one) "private" first.
- // so that the unmouting below doesn't affect to the bootstrap mount namespace.
- if (mount(nullptr, "/apex", nullptr, MS_PRIVATE | MS_REC, nullptr) == -1) {
- return ErrnoError() << "Failed to remount /apex as private";
- }
-
- // Now we can unmount /apex (bind-mount to /bootstrap-apex). This only affects
- // in the default mount namespace and /apex is now seen as tmpfs mount.
- // Note that /apex in the bootstrap mount namespace is still a bind-mount to
- // /bootstrap-apex and holds the APEX mounts.
- if (umount2("/apex", MNT_DETACH) == -1) {
- return ErrnoError() << "Failed to umount /apex";
- }
-
- return {};
-}
-
static Result<void> do_update_linker_config(const BuiltinArguments&) {
return GenerateLinkerConfiguration();
}
@@ -1359,11 +1314,6 @@
if (auto result = SwitchToMountNamespaceIfNeeded(NS_DEFAULT); !result.ok()) {
return result.error();
}
-
- if (auto result = MountApexRootForDefaultNamespace(); !result.ok()) {
- return result.error();
- }
-
if (auto result = MountLinkerConfigForDefaultNamespace(); !result.ok()) {
return result.error();
}
diff --git a/init/init.cpp b/init/init.cpp
index 4bb8eec..da63fdc 100644
--- a/init/init.cpp
+++ b/init/init.cpp
@@ -832,12 +832,6 @@
CHECKCALL(mount("tmpfs", "/apex", "tmpfs", MS_NOEXEC | MS_NOSUID | MS_NODEV,
"mode=0755,uid=0,gid=0"));
- if (NeedsTwoMountNamespaces()) {
- // /bootstrap-apex is used to mount "bootstrap" APEXes.
- CHECKCALL(mount("tmpfs", "/bootstrap-apex", "tmpfs", MS_NOEXEC | MS_NOSUID | MS_NODEV,
- "mode=0755,uid=0,gid=0"));
- }
-
// /linkerconfig is used to keep generated linker configuration
CHECKCALL(mount("tmpfs", "/linkerconfig", "tmpfs", MS_NOEXEC | MS_NOSUID | MS_NODEV,
"mode=0755,uid=0,gid=0"));
diff --git a/init/mount_namespace.cpp b/init/mount_namespace.cpp
index e069a5d..5b53d50 100644
--- a/init/mount_namespace.cpp
+++ b/init/mount_namespace.cpp
@@ -66,6 +66,15 @@
return ret;
}
+// In case we have two sets of APEXes (non-updatable, updatable), we need two separate mount
+// namespaces.
+static bool NeedsTwoMountNamespaces() {
+ if (IsRecoveryMode()) return false;
+ // In microdroid, there's only one set of APEXes in built-in directories include block devices.
+ if (IsMicrodroid()) return false;
+ return true;
+}
+
static android::base::unique_fd bootstrap_ns_fd;
static android::base::unique_fd default_ns_fd;
@@ -74,15 +83,6 @@
} // namespace
-// In case we have two sets of APEXes (non-updatable, updatable), we need two separate mount
-// namespaces.
-bool NeedsTwoMountNamespaces() {
- if (IsRecoveryMode()) return false;
- // In microdroid, there's only one set of APEXes in built-in directories include block devices.
- if (IsMicrodroid()) return false;
- return true;
-}
-
bool SetupMountNamespaces() {
// Set the propagation type of / as shared so that any mounting event (e.g.
// /data) is by default visible to all processes. When private mounting is
@@ -96,27 +96,6 @@
// the bootstrap namespace get APEXes from the read-only partition.
if (!(ChangeMount("/apex", MS_PRIVATE))) return false;
- // However, some components (e.g. servicemanager) need to access bootstrap
- // APEXes from the default mount namespace. To achieve that, we bind-mount
- // /apex with /bootstrap-apex (not private) in the bootstrap mount namespace.
- // Bootstrap APEXes are mounted in /apex and also visible in /bootstrap-apex.
- // In the default mount namespace, we detach /bootstrap-apex from /apex and
- // bootstrap APEXes are still be visible in /bootstrap-apex.
- //
- // The end result will look like:
- // in the bootstrap mount namespace:
- // /apex (== /bootstrap-apex)
- // {bootstrap APEXes from the read-only partition}
- //
- // in the default mount namespace:
- // /bootstrap-apex
- // {bootstrap APEXes from the read-only partition}
- // /apex
- // {APEXes, can be from /data partition}
- if (NeedsTwoMountNamespaces()) {
- if (!(BindMount("/bootstrap-apex", "/apex"))) return false;
- }
-
// /linkerconfig is a private mountpoint to give a different linker configuration
// based on the mount namespace. Subdirectory will be bind-mounted based on current mount
// namespace
diff --git a/init/mount_namespace.h b/init/mount_namespace.h
index 43c5476..5e3dab2 100644
--- a/init/mount_namespace.h
+++ b/init/mount_namespace.h
@@ -24,12 +24,9 @@
enum MountNamespace { NS_BOOTSTRAP, NS_DEFAULT };
bool SetupMountNamespaces();
-
base::Result<void> SwitchToMountNamespaceIfNeeded(MountNamespace target_mount_namespace);
base::Result<MountNamespace> GetCurrentMountNamespace();
-bool NeedsTwoMountNamespaces();
-
} // namespace init
} // namespace android
diff --git a/init/selinux.cpp b/init/selinux.cpp
index 8532c44..51093d8 100644
--- a/init/selinux.cpp
+++ b/init/selinux.cpp
@@ -766,7 +766,7 @@
selinux_android_restorecon("/dev/device-mapper", 0);
selinux_android_restorecon("/apex", 0);
- selinux_android_restorecon("/bootstrap-apex", 0);
+
selinux_android_restorecon("/linkerconfig", 0);
// adb remount, snapshot-based updates, and DSUs all create files during
diff --git a/rootdir/Android.mk b/rootdir/Android.mk
index 5218753..3362872 100644
--- a/rootdir/Android.mk
+++ b/rootdir/Android.mk
@@ -91,7 +91,7 @@
#
# create some directories (some are mount points) and symlinks
LOCAL_POST_INSTALL_CMD := mkdir -p $(addprefix $(TARGET_ROOT_OUT)/, \
- dev proc sys system data data_mirror odm oem acct config storage mnt apex bootstrap-apex debug_ramdisk \
+ dev proc sys system data data_mirror odm oem acct config storage mnt apex debug_ramdisk \
linkerconfig second_stage_resources postinstall $(BOARD_ROOT_EXTRA_FOLDERS)); \
ln -sf /system/bin $(TARGET_ROOT_OUT)/bin; \
ln -sf /system/etc $(TARGET_ROOT_OUT)/etc; \