return r;
}
ictx->parent->snap_set(ictx->parent->snap_name);
+ ictx->parent->parent_lock.get_write();
+ r = refresh_parent(ictx->parent);
+ if (r < 0) {
+ lderr(ictx->cct) << "error refreshing parent snapshot "
+ << ictx->parent->id << " "
+ << ictx->parent->snap_name << dendl;
+ ictx->parent->parent_lock.put_write();
+ ictx->parent->snap_lock.put_write();
+ close_image(ictx->parent);
+ ictx->parent = NULL;
+ return r;
+ }
+ ictx->parent->parent_lock.put_write();
ictx->parent->snap_lock.put_write();
return 0;
bool *is_protected);
int add_snap(ImageCtx *ictx, const char *snap_name);
int rm_snap(ImageCtx *ictx, const char *snap_name);
+ int refresh_parent(ImageCtx *ictx);
int ictx_check(ImageCtx *ictx);
int ictx_refresh(ImageCtx *ictx);
int copy(ImageCtx *ictx, IoCtx& dest_md_ctx, const char *destname,
after_flatten = clone2.read(IMG_SIZE / 2, 256)
eq(data, after_flatten)
self.rbd.remove(ioctx, 'clone2')
+
+ def test_flatten_multi_level(self):
+ self.clone.create_snap('snap2')
+ self.clone.protect_snap('snap2')
+ self.rbd.clone(ioctx, 'clone', 'snap2', ioctx, 'clone3', features)
+ self.clone.flatten()
+ with Image(ioctx, 'clone3') as clone3:
+ clone3.flatten()
+ self.clone.unprotect_snap('snap2')
+ self.clone.remove_snap('snap2')
+ self.rbd.remove(ioctx, 'clone3')
+
+ def test_resize_flatten_multi_level(self):
+ self.clone.create_snap('snap2')
+ self.clone.protect_snap('snap2')
+ self.rbd.clone(ioctx, 'clone', 'snap2', ioctx, 'clone3', features)
+ self.clone.resize(1)
+ orig_data = self.image.read(0, 256)
+ with Image(ioctx, 'clone3') as clone3:
+ clone3_data = clone3.read(0, 256)
+ eq(orig_data, clone3_data)
+ self.clone.flatten()
+ with Image(ioctx, 'clone3') as clone3:
+ clone3_data = clone3.read(0, 256)
+ eq(orig_data, clone3_data)
+ self.rbd.remove(ioctx, 'clone3')
+ self.clone.unprotect_snap('snap2')
+ self.clone.remove_snap('snap2')