Loading fs_mgr/libsnapshot/snapshot.cpp +15 −3 Original line number Diff line number Diff line Loading @@ -1846,7 +1846,7 @@ auto SnapshotManager::OpenFile(const std::string& file, int lock_flags) PLOG(ERROR) << "Open failed: " << file; return nullptr; } if (lock_flags != 0 && flock(fd, lock_flags) < 0) { if (lock_flags != 0 && TEMP_FAILURE_RETRY(flock(fd, lock_flags)) < 0) { PLOG(ERROR) << "Acquire flock failed: " << file; return nullptr; } Loading @@ -1857,7 +1857,7 @@ auto SnapshotManager::OpenFile(const std::string& file, int lock_flags) } SnapshotManager::LockedFile::~LockedFile() { if (flock(fd_, LOCK_UN) < 0) { if (TEMP_FAILURE_RETRY(flock(fd_, LOCK_UN)) < 0) { PLOG(ERROR) << "Failed to unlock file: " << path_; } } Loading Loading @@ -2516,7 +2516,19 @@ std::unique_ptr<AutoDevice> SnapshotManager::EnsureMetadataMounted() { LOG(INFO) << "EnsureMetadataMounted does nothing in Android mode."; return std::unique_ptr<AutoUnmountDevice>(new AutoUnmountDevice()); } return AutoUnmountDevice::New(device_->GetMetadataDir()); auto ret = AutoUnmountDevice::New(device_->GetMetadataDir()); if (ret == nullptr) return nullptr; // In rescue mode, it is possible to erase and format metadata, but /metadata/ota is not // created to execute snapshot updates. Hence, subsequent calls is likely to fail because // Lock*() fails. By failing early and returning nullptr here, update_engine_sideload can // treat this case as if /metadata is not mounted. if (!LockShared()) { LOG(WARNING) << "/metadata is mounted, but errors occur when acquiring a shared lock. " "Subsequent calls to SnapshotManager will fail. Unmounting /metadata now."; return nullptr; } return ret; } bool SnapshotManager::HandleImminentDataWipe(const std::function<void()>& callback) { Loading Loading
fs_mgr/libsnapshot/snapshot.cpp +15 −3 Original line number Diff line number Diff line Loading @@ -1846,7 +1846,7 @@ auto SnapshotManager::OpenFile(const std::string& file, int lock_flags) PLOG(ERROR) << "Open failed: " << file; return nullptr; } if (lock_flags != 0 && flock(fd, lock_flags) < 0) { if (lock_flags != 0 && TEMP_FAILURE_RETRY(flock(fd, lock_flags)) < 0) { PLOG(ERROR) << "Acquire flock failed: " << file; return nullptr; } Loading @@ -1857,7 +1857,7 @@ auto SnapshotManager::OpenFile(const std::string& file, int lock_flags) } SnapshotManager::LockedFile::~LockedFile() { if (flock(fd_, LOCK_UN) < 0) { if (TEMP_FAILURE_RETRY(flock(fd_, LOCK_UN)) < 0) { PLOG(ERROR) << "Failed to unlock file: " << path_; } } Loading Loading @@ -2516,7 +2516,19 @@ std::unique_ptr<AutoDevice> SnapshotManager::EnsureMetadataMounted() { LOG(INFO) << "EnsureMetadataMounted does nothing in Android mode."; return std::unique_ptr<AutoUnmountDevice>(new AutoUnmountDevice()); } return AutoUnmountDevice::New(device_->GetMetadataDir()); auto ret = AutoUnmountDevice::New(device_->GetMetadataDir()); if (ret == nullptr) return nullptr; // In rescue mode, it is possible to erase and format metadata, but /metadata/ota is not // created to execute snapshot updates. Hence, subsequent calls is likely to fail because // Lock*() fails. By failing early and returning nullptr here, update_engine_sideload can // treat this case as if /metadata is not mounted. if (!LockShared()) { LOG(WARNING) << "/metadata is mounted, but errors occur when acquiring a shared lock. " "Subsequent calls to SnapshotManager will fail. Unmounting /metadata now."; return nullptr; } return ret; } bool SnapshotManager::HandleImminentDataWipe(const std::function<void()>& callback) { Loading