summaryrefslogtreecommitdiff
path: root/src/librbd.cc
diff options
context:
space:
mode:
authorSage Weil <sage@newdream.net>2012-04-19 16:18:55 -0700
committerSage Weil <sage@newdream.net>2012-04-20 16:51:01 -0700
commit4ddbbf5467518d55130f5e5d1839f42efef0783c (patch)
tree0ef0195d6e81abb20de3a4b01f72c434d9990845 /src/librbd.cc
parent165038d589ed736874233656633b94fdb084ceaf (diff)
downloadceph-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.cc22
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);
+ }
}
}