From 3ae9f5723ca050b07f8ec1e1838e70d6a71fc1cb Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Wed, 3 Oct 2012 17:15:10 -0700 Subject: [PATCH] librbd: make read_iterate iterate over periods Object sizes no longer make sense since we are iterating over the logical device image space, and the striping may make that unrelated to the size of the individual objects. Signed-off-by: Sage Weil --- src/librbd/internal.cc | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/src/librbd/internal.cc b/src/librbd/internal.cc index cb88239ccfe5d..7cd077a266659 100644 --- a/src/librbd/internal.cc +++ b/src/librbd/internal.cc @@ -2099,16 +2099,14 @@ reprotect_and_return_err: return r; int64_t total_read = 0; - uint64_t start_block = get_block_num(ictx->order, off); - uint64_t end_block = get_block_num(ictx->order, off + len - 1); - uint64_t block_size = get_block_size(ictx->order); + uint64_t period = ictx->get_stripe_period(); uint64_t left = len; start_time = ceph_clock_now(ictx->cct); - for (uint64_t i = start_block; i <= end_block; i++) { - uint64_t total_off = off + total_read; - uint64_t block_ofs = get_block_ofs(ictx->order, total_off); - uint64_t read_len = min(block_size - block_ofs, left); + while (left > 0) { + uint64_t period_off = off - (off % period); + uint64_t read_len = min(period_off + period - off, left); + buffer::ptr bp(read_len); bufferlist bl; bl.append(bp); @@ -2120,7 +2118,7 @@ reprotect_and_return_err: Context *ctx = new C_SafeCond(&mylock, &cond, &done, &ret); AioCompletion *c = aio_create_completion_internal(ctx, rbd_ctx_cb); - r = aio_read(ictx, total_off, read_len, bl.c_str(), c); + r = aio_read(ictx, off, read_len, bl.c_str(), c); if (r < 0) { c->release(); delete ctx; @@ -2142,6 +2140,7 @@ reprotect_and_return_err: total_read += ret; left -= ret; + off += ret; } elapsed = ceph_clock_now(ictx->cct) - start_time; -- 2.39.5