diff options
Diffstat (limited to 'fs_mgr')
-rw-r--r-- | fs_mgr/libsnapshot/libsnapshot_cow/writer_v3.cpp | 20 |
1 files changed, 17 insertions, 3 deletions
diff --git a/fs_mgr/libsnapshot/libsnapshot_cow/writer_v3.cpp b/fs_mgr/libsnapshot/libsnapshot_cow/writer_v3.cpp index ea1da4b53..8cc9964bf 100644 --- a/fs_mgr/libsnapshot/libsnapshot_cow/writer_v3.cpp +++ b/fs_mgr/libsnapshot/libsnapshot_cow/writer_v3.cpp @@ -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; |