From b14e7d35d3879426897d74534c5e6466879c6358 Mon Sep 17 00:00:00 2001 From: Jianpeng Ma Date: Mon, 26 Jan 2015 10:01:22 +0800 Subject: [PATCH] bufferlist: Refactor func get_contiguous. Now it can rebuild the related prt not all prt Signed-off-by: Jianpeng Ma --- src/common/buffer.cc | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/src/common/buffer.cc b/src/common/buffer.cc index 88656e836bd29..b62856f4540cf 100644 --- a/src/common/buffer.cc +++ b/src/common/buffer.cc @@ -1483,9 +1483,24 @@ void buffer::list::rebuild_page_aligned() } if (off + len > curbuf->length()) { - // FIXME we'll just rebuild the whole list for now. - rebuild(); - return c_str() + orig_off; + bufferlist tmp; + unsigned l = off + len; + + do { + if (l >= curbuf->length()) + l -= curbuf->length(); + else + l = 0; + tmp.append(*curbuf); + curbuf = _buffers.erase(curbuf); + + } while (curbuf != _buffers.end() && l > 0); + + assert(l == 0); + + tmp.rebuild(); + _buffers.insert(curbuf, tmp._buffers.front()); + return tmp.c_str() + off; } return curbuf->c_str() + off; -- 2.39.5