init: Look for super partition only on a boot device
Init code is bailing out as soon as `super` partition was
found in the system, ignoring rest of uevents.
In case given device contains multiple boot sources, `super`
partition as well as all other partitions shall be taken
from the same boot source, instead of relying on
`which uevent came first`.
Bug: 309244873, 349144493
Test: Plug secondary USB boot device to device that supports multiple
boot sources. Select boot from USB. Device boots properly.
Signed-off-by: Jan Dabros <dabros@google.com>
Signed-off-by: Konrad Adamczyk <konrada@google.com>
Change-Id: I70eb7d4223258ec273faa523cb67ddab0b7c32a0
This commit is contained in:
parent
778ad88da6
commit
6f0ebcb526
3 changed files with 28 additions and 1 deletions
|
|
@ -98,7 +98,11 @@ ListenerAction BlockDevInitializer::HandleUevent(const Uevent& uevent,
|
|||
|
||||
LOG(VERBOSE) << __PRETTY_FUNCTION__ << ": found partition: " << name;
|
||||
|
||||
devices->erase(iter);
|
||||
// Remove partition from the list only if it was found on boot device
|
||||
if (device_handler_->IsBootDevice(uevent)) {
|
||||
devices->erase(iter);
|
||||
}
|
||||
|
||||
device_handler_->HandleUevent(uevent);
|
||||
return devices->empty() ? ListenerAction::kStop : ListenerAction::kContinue;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -188,6 +188,28 @@ void SysfsPermissions::SetPermissions(const std::string& path) const {
|
|||
}
|
||||
}
|
||||
|
||||
bool DeviceHandler::IsBootDevice(const Uevent& uevent) const {
|
||||
std::string device;
|
||||
|
||||
if (FindPlatformDevice(uevent.path, &device)) {
|
||||
// Skip /devices/platform or /devices/ if present
|
||||
static constexpr std::string_view devices_platform_prefix = "/devices/platform/";
|
||||
static constexpr std::string_view devices_prefix = "/devices/";
|
||||
|
||||
if (StartsWith(device, devices_platform_prefix)) {
|
||||
device = device.substr(devices_platform_prefix.length());
|
||||
} else if (StartsWith(device, devices_prefix)) {
|
||||
device = device.substr(devices_prefix.length());
|
||||
}
|
||||
} else if (FindPciDevicePrefix(uevent.path, &device)) {
|
||||
} else if (FindVbdDevicePrefix(uevent.path, &device)) {
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
|
||||
return boot_devices_.find(device) != boot_devices_.end();
|
||||
}
|
||||
|
||||
std::string DeviceHandler::GetPartitionNameForDevice(const std::string& query_device) {
|
||||
static const auto partition_map = [] {
|
||||
std::vector<std::pair<std::string, std::string>> partition_map;
|
||||
|
|
|
|||
|
|
@ -133,6 +133,7 @@ class DeviceHandler : public UeventHandler {
|
|||
// `androidboot.partition_map=vdb,metadata;vdc,userdata` maps `vdb` to `metadata` and `vdc` to
|
||||
// `userdata`.
|
||||
static std::string GetPartitionNameForDevice(const std::string& device);
|
||||
bool IsBootDevice(const Uevent& uevent) const;
|
||||
|
||||
private:
|
||||
void ColdbootDone() override;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue