init: fix first stage mount failure due to /dev/device-mapper not found
It has been reported that fs_mgr failed to open /dev/device-mapper during the first stage mount. It's because other uevent (e.g., i2c charger device) happens to be sent at the same time we're triggering the device-mapper uevent to be sent. Current implementation returns COLDBOOT_STOP unconditionally so it will only process the first received uevent, leaving device-mapper uevent unhandled when the race happens. Fix this by only returning COLDBOOT_STOP when the received uevent->path matches that of device mapper. Bug: 37745254 Test: first stage mount /vendor with vboot 2.0 (avb) on bullhead Test: first stage mount /vendor with vboot 1.0 on sailfish Change-Id: I4a77093ec8f90a5ca981a088f34d082d0270533b
This commit is contained in:
parent
d340c1ebbe
commit
ea5fca4cd0
|
@ -143,8 +143,11 @@ bool FirstStageMount::InitDevices() {
|
|||
if (!GetRequiredDevices(&devices_partition_names, &need_dm_verity)) return false;
|
||||
|
||||
if (need_dm_verity) {
|
||||
device_init("/sys/devices/virtual/misc/device-mapper",
|
||||
[&](uevent* uevent) -> coldboot_action_t { return COLDBOOT_STOP; });
|
||||
const std::string dm_path = "/devices/virtual/misc/device-mapper";
|
||||
device_init(("/sys" + dm_path).c_str(), [&dm_path](uevent* uevent) -> coldboot_action_t {
|
||||
if (uevent->path == dm_path) return COLDBOOT_STOP;
|
||||
return COLDBOOT_CONTINUE; // dm_path not found, continue to find it.
|
||||
});
|
||||
}
|
||||
|
||||
bool success = false;
|
||||
|
|
Loading…
Reference in New Issue