]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
cls/rbd: extend parent_attach to support reattach
authorMykola Golub <mgolub@suse.com>
Mon, 21 Jan 2019 08:27:14 +0000 (08:27 +0000)
committerMykola Golub <mgolub@suse.com>
Tue, 19 Feb 2019 08:43:09 +0000 (08:43 +0000)
Signed-off-by: Mykola Golub <mgolub@suse.com>
src/cls/rbd/cls_rbd.cc
src/cls/rbd/cls_rbd_client.cc
src/cls/rbd/cls_rbd_client.h

index a6a767195d0c237aa8c9a8a0e32a1607fdade480..7c23fe10f7fe432ee6b6f618671bf8a5a84d6207 100644 (file)
@@ -586,7 +586,8 @@ int write(cls_method_context_t hctx, const std::string& snap_key,
 
 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");
@@ -621,7 +622,8 @@ int attach(cls_method_context_t hctx, cls_rbd_parent parent) {
 
   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,
@@ -1679,7 +1681,7 @@ int set_parent(cls_method_context_t hctx, bufferlist *in, bufferlist *out)
     return -EINVAL;
   }
 
-  int r = image::parent::attach(hctx, parent);
+  int r = image::parent::attach(hctx, parent, false);
   if (r < 0) {
     return r;
   }
@@ -1816,17 +1818,22 @@ int parent_overlap_get(cls_method_context_t hctx, bufferlist *in,
 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;
   }
index ab5305909b02ec32c320fefe9a120b0897895846..9a3ce845cf6fec838fbfd2798bcb5de661f58235 100644 (file)
@@ -445,18 +445,19 @@ int parent_overlap_get(librados::IoCtx* ioctx, const std::string &oid,
 
 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);
 }
 
index 48125173bffa8fbf9b67563c69cc2c8755fd2f19..e1a17373360091c720c9a51dcb25c27f43070a91 100644 (file)
@@ -111,10 +111,10 @@ int parent_overlap_get(librados::IoCtx* ioctx, const std::string &oid,
 
 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);