newo->exists = true;
_assign_nid(txc, newo);
- r = _do_read(c.get(), oldo, srcoff, length, bl, 0);
- if (r < 0)
- goto out;
- r = _do_write(txc, c, newo, dstoff, bl.length(), bl, 0);
- if (r < 0)
- goto out;
+ if (g_conf->bluestore_clone_cow) {
+ _do_zero(txc, c, newo, dstoff, length);
+ _do_clone_range(txc, c, oldo, newo, srcoff, length, dstoff);
+ } else {
+ r = _do_read(c.get(), oldo, srcoff, length, bl, 0);
+ if (r < 0)
+ goto out;
+ r = _do_write(txc, c, newo, dstoff, bl.length(), bl, 0);
+ if (r < 0)
+ goto out;
+ }
txc->write_onode(newo);
-
r = 0;
out: