From: Kefu Chai Date: Fri, 15 Oct 2021 23:58:50 +0000 (+0800) Subject: common/bl: simplify bl::prepare_iovs() X-Git-Tag: v17.1.0~660^2~1 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=e9678d0b67ad44fcf1674eea3b6014351bd28f2a;p=ceph-ci.git common/bl: simplify bl::prepare_iovs() * consolidate the code to initialize a vector * use an iterator to track the current vector. less repeating this way. Signed-off-by: Kefu Chai --- diff --git a/src/common/buffer.cc b/src/common/buffer.cc index 6e6bf41b118..0fd90606862 100644 --- a/src/common/buffer.cc +++ b/src/common/buffer.cc @@ -2032,28 +2032,27 @@ int buffer::list::write_fd(int fd, uint64_t offset) const buffer::list::iov_vec_t buffer::list::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].iov.resize( - std::min(_num - IOV_MAX * iovs_i, (size_t)IOV_MAX)); - iovs[iovs_i].offset = off; - iovs[iovs_i].length = 0; + iov_vec_t iovs{_num / IOV_MAX + 1}; + auto it = iovs.begin(); for (auto& bp : _buffers) { - if (index == IOV_MAX) { - iovs_i++; + if (index == 0) { + it->offset = off; + it->length = 0; + size_t nr_iov_created = std::distance(iovs.begin(), it); + it->iov.resize( + std::min(_num - IOV_MAX * nr_iov_created, (size_t)IOV_MAX)); + } + it->iov[index].iov_base = (void*)bp.c_str(); + it->iov[index].iov_len = bp.length(); + off += bp.length(); + it->length += bp.length(); + if (++index == IOV_MAX) { + // continue with a new vector if we have more buf + ++it; index = 0; - iovs[iovs_i].offset = off; - iovs[iovs_i].length = 0; - iovs[iovs_i].iov.resize( - std::min(_num - IOV_MAX * iovs_i, (size_t)IOV_MAX)); } - iovs[iovs_i].iov[index].iov_base = (void*)bp.c_str(); - iovs[iovs_i].iov[index++].iov_len = bp.length(); - off += bp.length(); - iovs[iovs_i].length += bp.length(); } return iovs; }