]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
librbd: Make metadata support clone operation
authorHaomai Wang <haomaiwang@gmail.com>
Mon, 9 Mar 2015 06:13:56 +0000 (14:13 +0800)
committerHaomai Wang <haomaiwang@gmail.com>
Fri, 13 Mar 2015 14:52:42 +0000 (22:52 +0800)
Signed-off-by: Haomai Wang <haomaiwang@gmail.com>
src/librbd/internal.cc

index c8700fb9519c20d47a82fadb223756ad084b8950..8ccc02598e9d09b604b53f4fc01bac503e15f0f9 100644 (file)
@@ -1077,6 +1077,7 @@ reprotect_and_return_err:
     int remove_r;
     librbd::NoOpProgressContext no_op;
     ImageCtx *c_imctx = NULL;
+    map<string, string> pairs;
     // make sure parent snapshot exists
     ImageCtx *p_imctx = new ImageCtx(p_name, "", p_snap_name, p_ioctx, true);
     r = open_image(p_imctx);
@@ -1143,6 +1144,20 @@ reprotect_and_return_err:
       goto err_close_child;
     }
 
+    r = cls_client::metadata_list(&p_ioctx, p_imctx->header_oid, &pairs);
+    if (r < 0) {
+      lderr(cct) << "couldn't list metadata: " << r << dendl;
+      goto err_close_child;
+    }
+    for (map<string, string>::iterator it = pairs.begin(); it != pairs.end(); it++) {
+      r = cls_client::metadata_set(&c_ioctx, c_imctx->header_oid,
+                                   it->first, it->second);
+      if (r < 0) {
+        lderr(cct) << "couldn't set metadata: " << r << dendl;
+        goto err_close_child;
+      }
+    }
+
     p_imctx->md_lock.get_write();
     r = ictx_refresh(p_imctx);
     p_imctx->md_lock.put_write();