diff options
author | Sage Weil <sage@newdream.net> | 2012-04-19 16:18:55 -0700 |
---|---|---|
committer | Sage Weil <sage@newdream.net> | 2012-04-20 16:51:01 -0700 |
commit | 4ddbbf5467518d55130f5e5d1839f42efef0783c (patch) | |
tree | 0ef0195d6e81abb20de3a4b01f72c434d9990845 /src/librbd.cc | |
parent | 165038d589ed736874233656633b94fdb084ceaf (diff) | |
download | ceph-4ddbbf5467518d55130f5e5d1839f42efef0783c.tar.gz |
librbd: allow image resize to non-block boundaries
The caller is still invalidating the entire cache, so we don't need to
deal with discard at this level. That might be worth cleaning up
later, though.
Fixes: #2296
Signed-off-by: Sage Weil <sage@newdream.net>
Diffstat (limited to 'src/librbd.cc')
-rw-r--r-- | src/librbd.cc | 22 |
1 files changed, 17 insertions, 5 deletions
diff --git a/src/librbd.cc b/src/librbd.cc index c9bfb5efff5..029f043db58 100644 --- a/src/librbd.cc +++ b/src/librbd.cc @@ -570,11 +570,23 @@ void trim_image(IoCtx& io_ctx, const rbd_obj_header_ondisk &header, uint64_t new uint64_t bsize = get_block_size(header); uint64_t numseg = get_max_block(header); uint64_t start = get_block_num(header, newsize); - ldout(cct, 2) << "trimming image data from " << numseg << " to " << start << " objects..." << dendl; - for (uint64_t i=start; i<numseg; i++) { - string oid = get_block_oid(header, i); - io_ctx.remove(oid); - prog_ctx.update_progress(i * bsize, (numseg - start) * bsize); + + uint64_t block_ofs = get_block_ofs(header, newsize); + if (block_ofs) { + ldout(cct, 2) << "trim_image object " << numseg << " truncate to " << block_ofs << dendl; + string oid = get_block_oid(header, start); + librados::ObjectWriteOperation write_op; + write_op.truncate(block_ofs); + io_ctx.operate(oid, &write_op); + start++; + } + if (start < numseg) { + ldout(cct, 2) << "trim_image objects " << start << " to " << (numseg-1) << dendl; + for (uint64_t i=start; i<numseg; i++) { + string oid = get_block_oid(header, i); + io_ctx.remove(oid); + prog_ctx.update_progress(i * bsize, (numseg - start) * bsize); + } } } |