Merge "libdm: Add a helper function for creating placeholder devices."

This commit is contained in:
David Anderson 2022-12-15 17:26:59 +00:00 committed by Gerrit Code Review
commit 3460b75289
2 changed files with 30 additions and 0 deletions

View file

@ -20,6 +20,7 @@
#include <sys/ioctl.h>
#include <sys/sysmacros.h>
#include <sys/types.h>
#include <sys/utsname.h>
#include <chrono>
#include <functional>
@ -711,5 +712,28 @@ std::map<std::string, std::string> DeviceMapper::FindDmPartitions() {
return dm_block_devices;
}
bool DeviceMapper::CreatePlaceholderDevice(const std::string& name) {
if (!CreateEmptyDevice(name)) {
return false;
}
struct utsname uts;
unsigned int major, minor;
if (uname(&uts) != 0 || sscanf(uts.release, "%u.%u", &major, &minor) != 2) {
LOG(ERROR) << "Could not parse the kernel version from uname";
return true;
}
// On Linux 5.15+, there is no uevent until DM_TABLE_LOAD.
if (major > 5 || (major == 5 && minor >= 15)) {
DmTable table;
table.Emplace<DmTargetError>(0, 1);
if (!LoadTable(name, table)) {
return false;
}
}
return true;
}
} // namespace dm
} // namespace android

View file

@ -292,6 +292,12 @@ class DeviceMapper final : public IDeviceMapper {
// Returns mapping <partition-name, /dev/block/dm-x>
std::map<std::string, std::string> FindDmPartitions();
// Create a placeholder device. This is useful for ensuring that a uevent is in the pipeline,
// to reduce the amount of time a future WaitForDevice will block. On kernels < 5.15, this
// simply calls CreateEmptyDevice. On 5.15 and higher, it also loads (but does not activate)
// a placeholder table containing dm-error.
bool CreatePlaceholderDevice(const std::string& name);
private:
// Maximum possible device mapper targets registered in the kernel.
// This is only used to read the list of targets from kernel so we allocate