From 3205441d3f711f5193610a7ff8acb5d7f9e61f6c Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Mon, 22 Aug 2011 16:53:45 -0700 Subject: [PATCH] librbd: reimplement copy using read_iterate Ah, so much simpler! Signed-off-by: Sage Weil --- src/librbd.cc | 54 ++++++++++----------------------------------------- 1 file changed, 10 insertions(+), 44 deletions(-) diff --git a/src/librbd.cc b/src/librbd.cc index f0e35505b1511..2c2ef94384a37 100644 --- a/src/librbd.cc +++ b/src/librbd.cc @@ -1012,20 +1012,19 @@ int snap_rollback(ImageCtx *ictx, const char *snap_name) return 0; } +int do_copy_extent(uint64_t offset, size_t len, const char *buf, void *destictx) +{ + if (buf) + return write((ImageCtx *)destictx, offset, len, buf); + else + return 0; /* do nothing for holes */ +} + int copy(ImageCtx& ictx, IoCtx& dest_md_ctx, const char *destname) { CephContext *cct = dest_md_ctx.cct(); - uint64_t src_size; - if (ictx.snapname.length()) { - map::iterator p = ictx.snaps_by_name.find(ictx.snapname); - assert(p != ictx.snaps_by_name.end()); - src_size = p->second.size; - } else { - src_size = ictx.header.image_size; - } - - uint64_t numseg = get_max_block(src_size, ictx.header.options.order); + uint64_t src_size = ictx.get_image_size(); int order = ictx.header.options.order; int r = create(dest_md_ctx, destname, src_size, &order); @@ -1041,40 +1040,7 @@ int copy(ImageCtx& ictx, IoCtx& dest_md_ctx, const char *destname) return r; } - uint64_t block_size = get_block_size(ictx.header); - - for (uint64_t i = 0; i < numseg; i++) { - bufferlist bl; - string oid = get_block_oid(ictx.header, i); - map m; - r = ictx.data_ctx.sparse_read(oid, m, bl, block_size, 0); - if (r < 0 && r == -ENOENT) - r = 0; - if (r < 0) - goto done; - - uint64_t blpos = 0; - for (map::iterator iter = m.begin(); iter != m.end(); ++iter) { - ldout(cct, 0) << " " << i << " " << iter->first << "~" << iter->second << dendl; - uint64_t extent_ofs = iter->first; - size_t extent_len = iter->second; - bufferlist wrbl; - if (blpos + extent_len > bl.length()) { - lderr(cct) << "data error!" << dendl; - r = -EIO; - goto done; - } - bl.copy(blpos, extent_len, wrbl); - blpos += extent_len; - r = write(destictx, i * block_size + extent_ofs, extent_len, wrbl.c_str()); - if (r < 0) - goto done; - } - ldout(cct, 0) << i + 1 << "/" << numseg << " objects copied" << dendl; - } - r = 0; - - done: + r = read_iterate(&ictx, 0, src_size, do_copy_extent, destictx); close_image(destictx); return r; } -- 2.39.5