summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTao Bao <tbao@google.com>2015-08-01 17:47:48 +0200
committerAndroid Git Automerger <android-git-automerger@android.com>2015-08-01 17:47:48 +0200
commit414c576cf8fb5a8defef40d72f6c75012acdecab (patch)
treec5b20159f20aa9b15b40b90291164dde137e693d
parentam 7666f65b: am 62e19231: Merge "updater: Hoist fsync() to outer loop." (diff)
parentam 302779e7: Merge "recovery: Allow "Mount /system" for system_root_image." (diff)
downloadandroid_bootable_recovery-414c576cf8fb5a8defef40d72f6c75012acdecab.tar
android_bootable_recovery-414c576cf8fb5a8defef40d72f6c75012acdecab.tar.gz
android_bootable_recovery-414c576cf8fb5a8defef40d72f6c75012acdecab.tar.bz2
android_bootable_recovery-414c576cf8fb5a8defef40d72f6c75012acdecab.tar.lz
android_bootable_recovery-414c576cf8fb5a8defef40d72f6c75012acdecab.tar.xz
android_bootable_recovery-414c576cf8fb5a8defef40d72f6c75012acdecab.tar.zst
android_bootable_recovery-414c576cf8fb5a8defef40d72f6c75012acdecab.zip
-rw-r--r--recovery.cpp19
-rw-r--r--roots.cpp26
-rw-r--r--roots.h13
3 files changed, 39 insertions, 19 deletions
diff --git a/recovery.cpp b/recovery.cpp
index 83ca5812d..8123903ae 100644
--- a/recovery.cpp
+++ b/recovery.cpp
@@ -863,9 +863,24 @@ prompt_and_wait(Device* device, int status) {
break;
case Device::MOUNT_SYSTEM:
- if (ensure_path_mounted("/system") != -1) {
- ui->Print("Mounted /system.\n");
+ char system_root_image[PROPERTY_VALUE_MAX];
+ property_get("ro.build.system_root_image", system_root_image, "");
+
+ // For a system image built with the root directory (i.e.
+ // system_root_image == "true"), we mount it to /system_root, and symlink /system
+ // to /system_root/system to make adb shell work (the symlink is created through
+ // the build system).
+ // Bug: 22855115
+ if (strcmp(system_root_image, "true") == 0) {
+ if (ensure_path_mounted_at("/", "/system_root") != -1) {
+ ui->Print("Mounted /system.\n");
+ }
+ } else {
+ if (ensure_path_mounted("/system") != -1) {
+ ui->Print("Mounted /system.\n");
+ }
}
+
break;
}
}
diff --git a/roots.cpp b/roots.cpp
index 9288177e7..12c6b5ee2 100644
--- a/roots.cpp
+++ b/roots.cpp
@@ -70,7 +70,8 @@ Volume* volume_for_path(const char* path) {
return fs_mgr_get_entry_for_mount_point(fstab, path);
}
-int ensure_path_mounted(const char* path) {
+// Mount the volume specified by path at the given mount_point.
+int ensure_path_mounted_at(const char* path, const char* mount_point) {
Volume* v = volume_for_path(path);
if (v == NULL) {
LOGE("unknown volume for path [%s]\n", path);
@@ -88,14 +89,18 @@ int ensure_path_mounted(const char* path) {
return -1;
}
+ if (!mount_point) {
+ mount_point = v->mount_point;
+ }
+
const MountedVolume* mv =
- find_mounted_volume_by_mount_point(v->mount_point);
+ find_mounted_volume_by_mount_point(mount_point);
if (mv) {
// volume is already mounted
return 0;
}
- mkdir(v->mount_point, 0755); // in case it doesn't already exist
+ mkdir(mount_point, 0755); // in case it doesn't already exist
if (strcmp(v->fs_type, "yaffs2") == 0) {
// mount an MTD partition as a YAFFS2 filesystem.
@@ -104,25 +109,30 @@ int ensure_path_mounted(const char* path) {
partition = mtd_find_partition_by_name(v->blk_device);
if (partition == NULL) {
LOGE("failed to find \"%s\" partition to mount at \"%s\"\n",
- v->blk_device, v->mount_point);
+ v->blk_device, mount_point);
return -1;
}
- return mtd_mount_partition(partition, v->mount_point, v->fs_type, 0);
+ return mtd_mount_partition(partition, mount_point, v->fs_type, 0);
} else if (strcmp(v->fs_type, "ext4") == 0 ||
strcmp(v->fs_type, "squashfs") == 0 ||
strcmp(v->fs_type, "vfat") == 0) {
- result = mount(v->blk_device, v->mount_point, v->fs_type,
+ result = mount(v->blk_device, mount_point, v->fs_type,
v->flags, v->fs_options);
if (result == 0) return 0;
- LOGE("failed to mount %s (%s)\n", v->mount_point, strerror(errno));
+ LOGE("failed to mount %s (%s)\n", mount_point, strerror(errno));
return -1;
}
- LOGE("unknown fs_type \"%s\" for %s\n", v->fs_type, v->mount_point);
+ LOGE("unknown fs_type \"%s\" for %s\n", v->fs_type, mount_point);
return -1;
}
+int ensure_path_mounted(const char* path) {
+ // Mount at the default mount point.
+ return ensure_path_mounted_at(path, nullptr);
+}
+
int ensure_path_unmounted(const char* path) {
Volume* v = volume_for_path(path);
if (v == NULL) {
diff --git a/roots.h b/roots.h
index 230d9ded3..6e3b24355 100644
--- a/roots.h
+++ b/roots.h
@@ -19,10 +19,6 @@
#include "common.h"
-#ifdef __cplusplus
-extern "C" {
-#endif
-
// Load and parse volume data from /etc/recovery.fstab.
void load_volume_table();
@@ -33,7 +29,10 @@ Volume* volume_for_path(const char* path);
// success (volume is mounted).
int ensure_path_mounted(const char* path);
-// Make sure that the volume 'path' is on is mounted. Returns 0 on
+// Similar to ensure_path_mounted, but allows one to specify the mount_point.
+int ensure_path_mounted_at(const char* path, const char* mount_point);
+
+// Make sure that the volume 'path' is on is unmounted. Returns 0 on
// success (volume is unmounted);
int ensure_path_unmounted(const char* path);
@@ -46,8 +45,4 @@ int format_volume(const char* volume);
// mounted (/tmp and /cache) are mounted. Returns 0 on success.
int setup_install_mounts();
-#ifdef __cplusplus
-}
-#endif
-
#endif // RECOVERY_ROOTS_H_