Loading init/block_dev_initializer.cpp +7 −1 Original line number Diff line number Diff line Loading @@ -86,9 +86,15 @@ ListenerAction BlockDevInitializer::HandleUevent(const Uevent& uevent, } auto iter = devices->find(name); if (iter == devices->end()) { auto partition_name = DeviceHandler::GetPartitionNameForDevice(uevent.device_name); if (!partition_name.empty()) { iter = devices->find(partition_name); } if (iter == devices->end()) { return ListenerAction::kContinue; } } LOG(VERBOSE) << __PRETTY_FUNCTION__ << ": found partition: " << name; Loading init/devices.cpp +35 −0 Original line number Diff line number Diff line Loading @@ -46,6 +46,7 @@ using android::base::Dirname; using android::base::ReadFileToString; using android::base::Readlink; using android::base::Realpath; using android::base::Split; using android::base::StartsWith; using android::base::StringPrintf; using android::base::Trim; Loading Loading @@ -187,6 +188,36 @@ void SysfsPermissions::SetPermissions(const std::string& path) const { } } std::string DeviceHandler::GetPartitionNameForDevice(const std::string& query_device) { static const auto partition_map = [] { std::vector<std::pair<std::string, std::string>> partition_map; auto parser = [&partition_map](const std::string& key, const std::string& value) { if (key != "androidboot.partition_map") { return; } for (const auto& map : Split(value, ";")) { auto map_pieces = Split(map, ","); if (map_pieces.size() != 2) { LOG(ERROR) << "Expected a comma separated device,partition mapping, but found '" << map << "'"; continue; } partition_map.emplace_back(map_pieces[0], map_pieces[1]); } }; ImportKernelCmdline(parser); ImportBootconfig(parser); return partition_map; }(); for (const auto& [device, partition] : partition_map) { if (query_device == device) { return partition; } } return {}; } // Given a path that may start with a platform device, find the parent platform device by finding a // parent directory with a 'subsystem' symlink that points to the platform bus. // If it doesn't start with a platform device, return false Loading Loading @@ -389,6 +420,10 @@ std::vector<std::string> DeviceHandler::GetBlockDeviceSymlinks(const Uevent& uev // If we don't have a partition name but we are a partition on a boot device, create a // symlink of /dev/block/by-name/<device_name> for symmetry. links.emplace_back("/dev/block/by-name/" + uevent.device_name); auto partition_name = GetPartitionNameForDevice(uevent.device_name); if (!partition_name.empty()) { links.emplace_back("/dev/block/by-name/" + partition_name); } } auto last_slash = uevent.path.rfind('/'); Loading init/devices.h +6 −0 Original line number Diff line number Diff line Loading @@ -122,6 +122,12 @@ class DeviceHandler : public UeventHandler { std::vector<std::string> GetBlockDeviceSymlinks(const Uevent& uevent) const; // `androidboot.partition_map` allows associating a partition name for a raw block device // through a comma separated and semicolon deliminated list. For example, // `androidboot.partition_map=vdb,metadata;vdc,userdata` maps `vdb` to `metadata` and `vdc` to // `userdata`. static std::string GetPartitionNameForDevice(const std::string& device); private: bool FindPlatformDevice(std::string path, std::string* platform_device_path) const; std::tuple<mode_t, uid_t, gid_t> GetDevicePermissions( Loading Loading
init/block_dev_initializer.cpp +7 −1 Original line number Diff line number Diff line Loading @@ -86,9 +86,15 @@ ListenerAction BlockDevInitializer::HandleUevent(const Uevent& uevent, } auto iter = devices->find(name); if (iter == devices->end()) { auto partition_name = DeviceHandler::GetPartitionNameForDevice(uevent.device_name); if (!partition_name.empty()) { iter = devices->find(partition_name); } if (iter == devices->end()) { return ListenerAction::kContinue; } } LOG(VERBOSE) << __PRETTY_FUNCTION__ << ": found partition: " << name; Loading
init/devices.cpp +35 −0 Original line number Diff line number Diff line Loading @@ -46,6 +46,7 @@ using android::base::Dirname; using android::base::ReadFileToString; using android::base::Readlink; using android::base::Realpath; using android::base::Split; using android::base::StartsWith; using android::base::StringPrintf; using android::base::Trim; Loading Loading @@ -187,6 +188,36 @@ void SysfsPermissions::SetPermissions(const std::string& path) const { } } std::string DeviceHandler::GetPartitionNameForDevice(const std::string& query_device) { static const auto partition_map = [] { std::vector<std::pair<std::string, std::string>> partition_map; auto parser = [&partition_map](const std::string& key, const std::string& value) { if (key != "androidboot.partition_map") { return; } for (const auto& map : Split(value, ";")) { auto map_pieces = Split(map, ","); if (map_pieces.size() != 2) { LOG(ERROR) << "Expected a comma separated device,partition mapping, but found '" << map << "'"; continue; } partition_map.emplace_back(map_pieces[0], map_pieces[1]); } }; ImportKernelCmdline(parser); ImportBootconfig(parser); return partition_map; }(); for (const auto& [device, partition] : partition_map) { if (query_device == device) { return partition; } } return {}; } // Given a path that may start with a platform device, find the parent platform device by finding a // parent directory with a 'subsystem' symlink that points to the platform bus. // If it doesn't start with a platform device, return false Loading Loading @@ -389,6 +420,10 @@ std::vector<std::string> DeviceHandler::GetBlockDeviceSymlinks(const Uevent& uev // If we don't have a partition name but we are a partition on a boot device, create a // symlink of /dev/block/by-name/<device_name> for symmetry. links.emplace_back("/dev/block/by-name/" + uevent.device_name); auto partition_name = GetPartitionNameForDevice(uevent.device_name); if (!partition_name.empty()) { links.emplace_back("/dev/block/by-name/" + partition_name); } } auto last_slash = uevent.path.rfind('/'); Loading
init/devices.h +6 −0 Original line number Diff line number Diff line Loading @@ -122,6 +122,12 @@ class DeviceHandler : public UeventHandler { std::vector<std::string> GetBlockDeviceSymlinks(const Uevent& uevent) const; // `androidboot.partition_map` allows associating a partition name for a raw block device // through a comma separated and semicolon deliminated list. For example, // `androidboot.partition_map=vdb,metadata;vdc,userdata` maps `vdb` to `metadata` and `vdc` to // `userdata`. static std::string GetPartitionNameForDevice(const std::string& device); private: bool FindPlatformDevice(std::string path, std::string* platform_device_path) const; std::tuple<mode_t, uid_t, gid_t> GetDevicePermissions( Loading