diff --git a/adb/remount_service.cpp b/adb/remount_service.cpp index 3a4d2da7b..28932636d 100644 --- a/adb/remount_service.cpp +++ b/adb/remount_service.cpp @@ -33,9 +33,12 @@ #include "adb_io.h" #include "adb_utils.h" #include "cutils/properties.h" +#include "fs_mgr.h" + +const std::string kFstab_Prefix = "/fstab."; // Returns the device used to mount a directory in /proc/mounts. -static std::string find_mount(const char* dir) { +static std::string find_proc_mount(const char* dir) { std::unique_ptr fp(setmntent("/proc/mounts", "r"), endmntent); if (!fp) { return ""; @@ -50,6 +53,29 @@ static std::string find_mount(const char* dir) { return ""; } +// Returns the device used to mount a directory in the fstab. +static std::string find_fstab_mount(const char* dir) { + char propbuf[PROPERTY_VALUE_MAX]; + + property_get("ro.hardware", propbuf, ""); + std::string fstab_filename = kFstab_Prefix + propbuf; + struct fstab* fstab = fs_mgr_read_fstab(fstab_filename.c_str()); + struct fstab_rec* rec = fs_mgr_get_entry_for_mount_point(fstab, dir); + std::string dev = rec ? std::string(rec->blk_device) : ""; + fs_mgr_free_fstab(fstab); + return dev; +} + +// The proc entry for / is full of lies, so check fstab instead. +// /proc/mounts lists rootfs and /dev/root, neither of which is what we want. +static std::string find_mount(const char* dir) { + if (strcmp(dir, "/") == 0) { + return find_fstab_mount(dir); + } else { + return find_proc_mount(dir); + } +} + bool make_block_device_writable(const std::string& dev) { int fd = unix_open(dev.c_str(), O_RDONLY | O_CLOEXEC); if (fd == -1) { @@ -112,7 +138,13 @@ void remount_service(int fd, void* cookie) { } bool success = true; - success &= remount_partition(fd, "/system"); + property_get("ro.build.system_root_image", prop_buf, ""); + bool system_root = !strcmp(prop_buf, "true"); + if (system_root) { + success &= remount_partition(fd, "/"); + } else { + success &= remount_partition(fd, "/system"); + } success &= remount_partition(fd, "/vendor"); success &= remount_partition(fd, "/oem");