int krbd_resize(struct rbd_ctx *ctx, uint64_t size) { int ret; assert(size % truncbdy == 0); /* * When krbd detects a size change, it calls revalidate_disk(), * which ends up calling invalidate_bdev(), which invalidates * clean pages and does nothing about dirty pages beyond the * new size. The preceding cache flush makes sure those pages * are invalidated, which is what we need on shrink: * * write 0..1M * resize 0 * resize 2M * write 1..2M * * results in "data data" rather than "0000 data". */ ret = __krbd_flush(ctx); if (ret < 0) return ret; return __librbd_resize(ctx, size); }
int krbd_resize(struct rbd_ctx *ctx, uint64_t size) { int ret; assert(size % truncbdy == 0); /* * This is essential: when krbd detects a size change, it calls * revalidate_disk(), which ends up calling invalidate_bdev(), * which invalidates only clean buffers. The cache flush makes * it invalidate everything, which is what we need if we are * shrinking. */ ret = __krbd_flush(ctx); if (ret < 0) return ret; return __librbd_resize(ctx, size); }
int librbd_resize(struct rbd_ctx *ctx, uint64_t size) { return __librbd_resize(ctx, size); }