Merge changes I51628abe,I412d62b7
* changes: Wrap flock with TEMP_FAILURE_RETRY. Try locking after mounting metadata
This commit is contained in:
commit
9e84b3166f
1 changed files with 15 additions and 3 deletions
|
@ -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;
|
||||
}
|
||||
|
@ -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_;
|
||||
}
|
||||
}
|
||||
|
@ -2520,7 +2520,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…
Reference in a new issue