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

Commit 6bee3182 authored by Daniel Zheng's avatar Daniel Zheng Committed by Gerrit Code Review
Browse files

Merge "libsnapshot: chunk iov writes" into main

parents e0b55e5a c60d2fc5
Loading
Loading
Loading
Loading
+17 −3
Original line number Diff line number Diff line
@@ -717,13 +717,27 @@ bool CowWriterV3::WriteOperation(std::span<const CowOperationV3> ops,
        return false;
    }
    if (!data.empty()) {
        const auto ret = pwritev(fd_, data.data(), data.size(), next_data_pos_);
        if (ret != total_data_size) {
        int total_written = 0;
        int i = 0;
        while (i < data.size()) {
            int chunk = std::min(static_cast<int>(data.size() - i), IOV_MAX);

            const auto ret = pwritev(fd_, data.data() + i, chunk, next_data_pos_ + total_written);
            if (ret < 0) {
                PLOG(ERROR) << "write failed chunk size of: " << chunk
                            << " at offset: " << next_data_pos_ + total_written << " " << errno;
                return false;
            }
            total_written += ret;
            i += chunk;
        }
        if (total_written != total_data_size) {
            PLOG(ERROR) << "write failed for data of size: " << data.size()
                        << " at offset: " << next_data_pos_ << " " << ret;
                        << " at offset: " << next_data_pos_ << " " << errno;
            return false;
        }
    }

    header_.op_count += ops.size();
    next_data_pos_ += total_data_size;