Merge "Use target path when handling dm-bow" into main am: 2f56ec931a

Original change: https://android-review.googlesource.com/c/platform/system/core/+/2860710

Change-Id: I351be2b4a7e0b0b4b987505eb77ae38b4f8df8dd
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
Jaegeuk Kim 2023-12-06 02:36:03 +00:00 committed by Automerger Merge Worker
commit 0d10ab4a2f

View file

@ -1267,17 +1267,27 @@ class CheckpointManager {
};
std::string fs_mgr_find_bow_device(const std::string& block_device) {
if (block_device.substr(0, 5) != "/dev/") {
LOG(ERROR) << "Expected block device, got " << block_device;
return std::string();
// handle symlink such as "/dev/block/mapper/userdata"
std::string real_path;
if (!android::base::Realpath(block_device, &real_path)) {
real_path = block_device;
}
std::string sys_dir = std::string("/sys/") + block_device.substr(5);
struct stat st;
if (stat(real_path.c_str(), &st) < 0) {
PLOG(ERROR) << "stat failed: " << real_path;
return std::string();
}
if (!S_ISBLK(st.st_mode)) {
PLOG(ERROR) << real_path << " is not block device";
return std::string();
}
std::string sys_dir = android::base::StringPrintf("/sys/dev/block/%u:%u", major(st.st_rdev),
minor(st.st_rdev));
for (;;) {
std::string name;
if (!android::base::ReadFileToString(sys_dir + "/dm/name", &name)) {
PLOG(ERROR) << block_device << " is not dm device";
PLOG(ERROR) << real_path << " is not dm device";
return std::string();
}