adbd: Fix adb remount when switching roots during first-stage init.
This patch addresses two issues with adb remount. First, the blk_device field in fstab_rec will be incorrect if referring to a device-mapper node (fs_mgr_update_logical_partition must be called). Second, devices that are not system-as-root now move their mount point and chroot to "/" during first-stage init. However, the fstab entry will have "/system" as its mount point. The new logic now reflects this. Bug: N/A Test: adb remount on hikey or device with dynamic partitions Change-Id: I48b379db49d2def555ea49888c4994fbcf501672
This commit is contained in:
parent
91061cc823
commit
bb1efbd1c6
1 changed files with 13 additions and 6 deletions
|
|
@ -78,7 +78,13 @@ static std::string find_fstab_mount(const char* dir) {
|
|||
std::unique_ptr<fstab, decltype(&fs_mgr_free_fstab)> fstab(fs_mgr_read_fstab_default(),
|
||||
fs_mgr_free_fstab);
|
||||
struct fstab_rec* rec = fs_mgr_get_entry_for_mount_point(fstab.get(), dir);
|
||||
return rec ? rec->blk_device : "";
|
||||
if (!rec) {
|
||||
return "";
|
||||
}
|
||||
if (fs_mgr_is_logical(rec)) {
|
||||
fs_mgr_update_logical_partition(rec);
|
||||
}
|
||||
return rec->blk_device;
|
||||
}
|
||||
|
||||
// The proc entry for / is full of lies, so check fstab instead.
|
||||
|
|
@ -87,7 +93,7 @@ static std::string find_mount(const char* dir, bool is_root) {
|
|||
if (is_root) {
|
||||
return find_fstab_mount(dir);
|
||||
} else {
|
||||
return find_proc_mount(dir);
|
||||
return find_proc_mount(dir);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -155,11 +161,12 @@ static bool remount_partition(int fd, const char* dir) {
|
|||
return true;
|
||||
}
|
||||
bool is_root = strcmp(dir, "/") == 0;
|
||||
if (is_root && !find_mount("/system", false).empty()) {
|
||||
dir = "/system";
|
||||
is_root = false;
|
||||
}
|
||||
std::string dev = find_mount(dir, is_root);
|
||||
if (is_root && dev.empty()) {
|
||||
// The fstab entry will be /system if the device switched roots during
|
||||
// first-stage init.
|
||||
dev = find_mount("/system", true);
|
||||
}
|
||||
// Even if the device for the root is not found, we still try to remount it
|
||||
// as rw. This typically only happens when running Android in a container:
|
||||
// the root will almost always be in a loop device, which is dynamic, so
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue