Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit bb1efbd1 authored by David Anderson's avatar David Anderson
Browse files

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
parent 91061cc8
Loading
Loading
Loading
Loading
+13 −6
Original line number Diff line number Diff line
@@ -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.
@@ -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