diff --git a/fastboot/device/commands.cpp b/fastboot/device/commands.cpp index 1a745ab46..b7263d945 100644 --- a/fastboot/device/commands.cpp +++ b/fastboot/device/commands.cpp @@ -31,7 +31,6 @@ #include #include #include -#include #include #include #include @@ -550,42 +549,6 @@ bool UpdateSuperHandler(FastbootDevice* device, const std::vector& 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& args) { if (args.size() != 2) { return device->WriteFail("Invalid arguments"); diff --git a/fastboot/device/flashing.cpp b/fastboot/device/flashing.cpp index 102ebdb3e..7e7e50715 100644 --- a/fastboot/device/flashing.cpp +++ b/fastboot/device/flashing.cpp @@ -21,6 +21,7 @@ #include #include +#include #include #include @@ -56,6 +57,7 @@ void WipeOverlayfsForPartition(FastbootDevice* device, const std::string& partit Fstab fstab; ReadDefaultFstab(&fstab); + std::optional mount_metadata; for (const auto& entry : fstab) { auto partition = android::base::Basename(entry.mount_point); if ("/" == entry.mount_point) { @@ -63,6 +65,7 @@ void WipeOverlayfsForPartition(FastbootDevice* device, const std::string& partit } if ((partition + device->GetCurrentSlot()) == partition_name) { + mount_metadata.emplace(); fs_mgr_overlayfs_teardown(entry.mount_point.c_str()); } } diff --git a/fastboot/device/utility.cpp b/fastboot/device/utility.cpp index b3f2d5fbe..7c6ac8993 100644 --- a/fastboot/device/utility.cpp +++ b/fastboot/device/utility.cpp @@ -26,6 +26,7 @@ #include #include #include +#include #include #include #include @@ -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"); + } +} diff --git a/fastboot/device/utility.h b/fastboot/device/utility.h index bfeeb742f..3b71ef006 100644 --- a/fastboot/device/utility.h +++ b/fastboot/device/utility.h @@ -20,6 +20,7 @@ #include #include +#include #include // Logical partitions are only mapped to a block device as needed, and @@ -51,6 +52,18 @@ class PartitionHandle { std::function 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