Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 82e0c384 authored by Yifan Hong's avatar Yifan Hong Committed by Android (Google) Code Review
Browse files

Merge changes I51628abe,I412d62b7 into rvc-dev

* changes:
  Wrap flock with TEMP_FAILURE_RETRY.
  Try locking after mounting metadata
parents 46a58a59 bd6d2cde
Loading
Loading
Loading
Loading
+15 −3
Original line number Original line Diff line number Diff line
@@ -1846,7 +1846,7 @@ auto SnapshotManager::OpenFile(const std::string& file, int lock_flags)
        PLOG(ERROR) << "Open failed: " << file;
        PLOG(ERROR) << "Open failed: " << file;
        return nullptr;
        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;
        PLOG(ERROR) << "Acquire flock failed: " << file;
        return nullptr;
        return nullptr;
    }
    }
@@ -1857,7 +1857,7 @@ auto SnapshotManager::OpenFile(const std::string& file, int lock_flags)
}
}


SnapshotManager::LockedFile::~LockedFile() {
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_;
        PLOG(ERROR) << "Failed to unlock file: " << path_;
    }
    }
}
}
@@ -2516,7 +2516,19 @@ std::unique_ptr<AutoDevice> SnapshotManager::EnsureMetadataMounted() {
        LOG(INFO) << "EnsureMetadataMounted does nothing in Android mode.";
        LOG(INFO) << "EnsureMetadataMounted does nothing in Android mode.";
        return std::unique_ptr<AutoUnmountDevice>(new AutoUnmountDevice());
        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) {
bool SnapshotManager::HandleImminentDataWipe(const std::function<void()>& callback) {