]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
BlueStore: fix dest onode process logic of clone
authorxie xingguo <xie.xingguo@zte.com.cn>
Tue, 19 Jan 2016 10:55:25 +0000 (18:55 +0800)
committerxie xingguo <xie.xingguo@zte.com.cn>
Tue, 19 Jan 2016 11:32:15 +0000 (19:32 +0800)
Signed-off-by: xie xingguo <xie.xingguo@zte.com.cn>
src/os/bluestore/BlueStore.cc

index c1da65b47cbf81c34763a5b6181c0bb2a38ac10c..7a8fa47bb5117fc34fe0cf4ab36dfa27fc000a60 100644 (file)
@@ -5970,18 +5970,22 @@ int BlueStore::_clone(TransContext *txc,
     r = -ENOENT;
     goto out;
   }
-  newo = c->get_onode(new_oid, true);
+
+  newo = c->get_onode(new_oid, false);
+  if (newo) {
+    r = _do_truncate(txc, c, newo, 0);
+    if (r < 0)
+      goto out;
+  } else {
+    newo = c->get_onode(new_oid, true);
+    _assign_nid(txc, newo);
+  }
   assert(newo);
   newo->exists = true;
-  _assign_nid(txc, newo);
 
   // data
   oldo->flush();
 
-  r = _do_truncate(txc, c, newo, 0);
-  if (r < 0)
-    goto out;
-
   if (g_conf->bluestore_clone_cow) {
     EnodeRef e = c->get_enode(newo->oid.hobj.get_hash());
     bool marked = false;