On Fri, Nov 16, 2012 at 2:55 PM, Dmitry Fleytman <dmi...@daynix.com> wrote: > @@ -252,6 +253,58 @@ unsigned iov_copy(struct iovec *dst_iov, unsigned int > dst_iov_cnt, > return j; > } > > +size_t iov_rebuild(struct iovec *dst, unsigned int dst_cnt, > + const struct iovec *src, const unsigned int src_cnt, > + size_t src_off) > +{ > + size_t curr_src_off = 0; > + unsigned int i, j = 0; > + > + for (i = 0; i < src_cnt; i++) { > + if (src_off < (curr_src_off + src[i].iov_len)) { > + if (j == dst_cnt) { > + return (size_t) -1; > + } > + > + dst[j].iov_len = curr_src_off + src[i].iov_len - src_off; > + dst[j].iov_base = src[i].iov_base + (src_off - curr_src_off); > + > + src_off += dst[j].iov_len; > + j++; > + } > + curr_src_off += src[i].iov_len; > + } > + return j; > +}
The existing iov_copy() function provides equivalent functionality. I don't think iov_rebuild() is needed. > +uint32_t > +iov_net_csum_add(const struct iovec *iov, const unsigned int iov_cnt, > + size_t iov_off, size_t size) > +{ > + size_t iovec_off, buf_off; > + unsigned int i; > + uint32_t res = 0; > + uint32_t seq = 0; > + > + iovec_off = 0; > + buf_off = 0; > + for (i = 0; i < iov_cnt && size; i++) { > + if (iov_off < (iovec_off + iov[i].iov_len)) { > + size_t len = MIN((iovec_off + iov[i].iov_len) - iov_off , size); > + void *chunk_buf = iov[i].iov_base + (iov_off - iovec_off); > + > + res += net_checksum_add_cont(len, chunk_buf, seq); > + seq += len; > + > + buf_off += len; > + iov_off += len; > + size -= len; > + } > + iovec_off += iov[i].iov_len; > + } > + return res; > +} Rename this net_checksum_add_iov() and place it in net/checksum.c, then the new dependency on net from block can be dropped.