namespace parent {
-int attach(cls_method_context_t hctx, cls_rbd_parent parent) {
+int attach(cls_method_context_t hctx, cls_rbd_parent parent,
+ bool reattach) {
int r = check_exists(hctx);
if (r < 0) {
CLS_LOG(20, "cls_rbd::image::parent::attach: child doesn't exist");
if (r == 0 &&
(on_disk_parent.head_overlap ||
- on_disk_parent_without_overlap != parent)) {
+ on_disk_parent_without_overlap != parent) &&
+ !reattach) {
CLS_LOG(20, "cls_rbd::parent::attach: existing legacy parent "
"pool=%" PRIi64 ", ns=%s, id=%s, snapid=%" PRIu64 ", "
"overlap=%" PRIu64,
return -EINVAL;
}
- int r = image::parent::attach(hctx, parent);
+ int r = image::parent::attach(hctx, parent, false);
if (r < 0) {
return r;
}
int parent_attach(cls_method_context_t hctx, bufferlist *in, bufferlist *out) {
cls::rbd::ParentImageSpec parent_image_spec;
uint64_t parent_overlap;
+ bool reattach = false;
auto iter = in->cbegin();
try {
decode(parent_image_spec, iter);
decode(parent_overlap, iter);
+ if (!iter.end()) {
+ decode(reattach, iter);
+ }
} catch (const buffer::error &err) {
CLS_LOG(20, "cls_rbd::parent_attach: invalid decode");
return -EINVAL;
}
- int r = image::parent::attach(hctx, {parent_image_spec, parent_overlap});
+ int r = image::parent::attach(hctx, {parent_image_spec, parent_overlap},
+ reattach);
if (r < 0) {
return r;
}
void parent_attach(librados::ObjectWriteOperation* op,
const cls::rbd::ParentImageSpec& parent_image_spec,
- uint64_t parent_overlap) {
+ uint64_t parent_overlap, bool reattach) {
bufferlist in_bl;
encode(parent_image_spec, in_bl);
encode(parent_overlap, in_bl);
+ encode(reattach, in_bl);
op->exec("rbd", "parent_attach", in_bl);
}
int parent_attach(librados::IoCtx *ioctx, const std::string &oid,
const cls::rbd::ParentImageSpec& parent_image_spec,
- uint64_t parent_overlap) {
+ uint64_t parent_overlap, bool reattach) {
librados::ObjectWriteOperation op;
- parent_attach(&op, parent_image_spec, parent_overlap);
+ parent_attach(&op, parent_image_spec, parent_overlap, reattach);
return ioctx->operate(oid, &op);
}
void parent_attach(librados::ObjectWriteOperation* op,
const cls::rbd::ParentImageSpec& parent_image_spec,
- uint64_t parent_overlap);
+ uint64_t parent_overlap, bool reattach);
int parent_attach(librados::IoCtx *ioctx, const std::string &oid,
const cls::rbd::ParentImageSpec& parent_image_spec,
- uint64_t parent_overlap);
+ uint64_t parent_overlap, bool reattach);
void parent_detach(librados::ObjectWriteOperation* op);
int parent_detach(librados::IoCtx *ioctx, const std::string &oid);