From b93d748d295e5d213bfc35abfa799e31a1bcd850 Mon Sep 17 00:00:00 2001 From: Xuehan Xu Date: Fri, 15 Oct 2021 13:42:41 +0800 Subject: [PATCH] common: add prepare_iovs to bufferlist Enable bufferlist that have more than IOV_MAX buffers to build a vector of iov. Signed-off-by: Xuehan Xu --- src/include/buffer.h | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/src/include/buffer.h b/src/include/buffer.h index 7c8f90e9fb5d3..adf56400ecae0 100644 --- a/src/include/buffer.h +++ b/src/include/buffer.h @@ -1196,6 +1196,40 @@ struct error_code; ++n; } } + + // vector, iov> + using iov_vec_t = + std::vector, std::vector>>; + + iov_vec_t prepare_iovs() + { + iov_vec_t iovs; + size_t iovs_i = 0; + size_t index = 0; + uint64_t off = 0; + iovs.resize(_num / IOV_MAX + 1); + iovs[iovs_i].second.resize( + std::min(_num - IOV_MAX * iovs_i, (size_t)IOV_MAX)); + iovs[iovs_i].first.first = off; + iovs[iovs_i].first.second = 0; + for (auto& bp : _buffers) { + if (index == IOV_MAX) { + iovs_i++; + index = 0; + iovs[iovs_i].first.first = off; + iovs[iovs_i].first.second = 0; + iovs[iovs_i].second.resize( + std::min(_num - IOV_MAX * iovs_i, (size_t)IOV_MAX)); + } + iovs[iovs_i].second[index].iov_base = (void*)bp.c_str(); + iovs[iovs_i].second[index++].iov_len = bp.length(); + off += bp.length(); + iovs[iovs_i].first.second += bp.length(); + } + + return iovs; + } + uint32_t crc32c(uint32_t crc) const; void invalidate_crc(); -- 2.39.5