Skip to content

Commit

Permalink
fastboot: Mount /metadata before overlayfs teardown.
Browse files Browse the repository at this point in the history
fs_mgr_overlayfs needs access to /metadata to tell whether or not the
scratch partition exists on /data.

Bug: 134949511
Test: adb remount, fastboot flash system
Change-Id: I3a09aae495d691e9c1a1e25a8fb3514e355ecd05

Former-commit-id: 23243497fd67747c2f45463d8bb98c3cb401bbbb
  • Loading branch information
dvandercorp committed Dec 30, 2019
1 parent 51eb60f commit 2cf89b0
Show file tree
Hide file tree
Showing 4 changed files with 43 additions and 37 deletions.
37 changes: 0 additions & 37 deletions fastboot/device/commands.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,6 @@
#include <cutils/android_reboot.h>
#include <ext4_utils/wipe.h>
#include <fs_mgr.h>
#include <fs_mgr/roots.h>
#include <libgsi/libgsi.h>
#include <liblp/builder.h>
#include <liblp/liblp.h>
Expand Down Expand Up @@ -550,42 +549,6 @@ bool UpdateSuperHandler(FastbootDevice* device, const std::vector<std::string>&
return UpdateSuper(device, args[1], wipe);
}

class AutoMountMetadata {
public:
AutoMountMetadata() {
android::fs_mgr::Fstab proc_mounts;
if (!ReadFstabFromFile("/proc/mounts", &proc_mounts)) {
LOG(ERROR) << "Could not read /proc/mounts";
return;
}

auto iter = std::find_if(proc_mounts.begin(), proc_mounts.end(),
[](const auto& entry) { return entry.mount_point == "/metadata"; });
if (iter != proc_mounts.end()) {
mounted_ = true;
return;
}

if (!ReadDefaultFstab(&fstab_)) {
LOG(ERROR) << "Could not read default fstab";
return;
}
mounted_ = EnsurePathMounted(&fstab_, "/metadata");
should_unmount_ = true;
}
~AutoMountMetadata() {
if (mounted_ && should_unmount_) {
EnsurePathUnmounted(&fstab_, "/metadata");
}
}
explicit operator bool() const { return mounted_; }

private:
android::fs_mgr::Fstab fstab_;
bool mounted_ = false;
bool should_unmount_ = false;
};

bool GsiHandler(FastbootDevice* device, const std::vector<std::string>& args) {
if (args.size() != 2) {
return device->WriteFail("Invalid arguments");
Expand Down
3 changes: 3 additions & 0 deletions fastboot/device/flashing.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@

#include <algorithm>
#include <memory>
#include <optional>
#include <set>
#include <string>

Expand Down Expand Up @@ -56,13 +57,15 @@ void WipeOverlayfsForPartition(FastbootDevice* device, const std::string& partit
Fstab fstab;
ReadDefaultFstab(&fstab);

std::optional<AutoMountMetadata> mount_metadata;
for (const auto& entry : fstab) {
auto partition = android::base::Basename(entry.mount_point);
if ("/" == entry.mount_point) {
partition = "system";
}

if ((partition + device->GetCurrentSlot()) == partition_name) {
mount_metadata.emplace();
fs_mgr_overlayfs_teardown(entry.mount_point.c_str());
}
}
Expand Down
27 changes: 27 additions & 0 deletions fastboot/device/utility.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
#include <android-base/properties.h>
#include <android-base/strings.h>
#include <fs_mgr.h>
#include <fs_mgr/roots.h>
#include <fs_mgr_dm_linear.h>
#include <liblp/builder.h>
#include <liblp/liblp.h>
Expand Down Expand Up @@ -240,3 +241,29 @@ std::string GetSuperSlotSuffix(FastbootDevice* device, const std::string& partit
}
return current_slot_suffix;
}

AutoMountMetadata::AutoMountMetadata() {
android::fs_mgr::Fstab proc_mounts;
if (!ReadFstabFromFile("/proc/mounts", &proc_mounts)) {
LOG(ERROR) << "Could not read /proc/mounts";
return;
}

if (GetEntryForMountPoint(&proc_mounts, "/metadata")) {
mounted_ = true;
return;
}

if (!ReadDefaultFstab(&fstab_)) {
LOG(ERROR) << "Could not read default fstab";
return;
}
mounted_ = EnsurePathMounted(&fstab_, "/metadata");
should_unmount_ = true;
}

AutoMountMetadata::~AutoMountMetadata() {
if (mounted_ && should_unmount_) {
EnsurePathUnmounted(&fstab_, "/metadata");
}
}
13 changes: 13 additions & 0 deletions fastboot/device/utility.h
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@

#include <android-base/unique_fd.h>
#include <android/hardware/boot/1.0/IBootControl.h>
#include <fstab/fstab.h>
#include <liblp/liblp.h>

// Logical partitions are only mapped to a block device as needed, and
Expand Down Expand Up @@ -51,6 +52,18 @@ class PartitionHandle {
std::function<void()> closer_;
};

class AutoMountMetadata {
public:
AutoMountMetadata();
~AutoMountMetadata();
explicit operator bool() const { return mounted_; }

private:
android::fs_mgr::Fstab fstab_;
bool mounted_ = false;
bool should_unmount_ = false;
};

class FastbootDevice;

// On normal devices, the super partition is always named "super". On retrofit
Expand Down

0 comments on commit 2cf89b0

Please sign in to comment.