]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
librbd: default clone operation to image format 2 8972/head
authorJason Dillaman <dillaman@redhat.com>
Mon, 2 May 2016 19:06:51 +0000 (15:06 -0400)
committerAbhishek Varshney <abhishek.varshney@flipkart.com>
Fri, 6 May 2016 14:34:06 +0000 (20:04 +0530)
Image format 1 doesn't support clones, so unless the user
overrode the setting, default to format 2.

Fixes: http://tracker.ceph.com/issues/15685
Signed-off-by: Jason Dillaman <dillaman@redhat.com>
(cherry picked from commit f24c70f54343aa6698af8ac1f0774282b0659968)

src/librbd/internal.cc

index 365e7918a6149f31d7bea55f3c624d4df8ad57ad..ba826e94193e429747f779f820182108e5feb811 100644 (file)
@@ -1233,6 +1233,8 @@ remove_mirroring_image:
             ImageOptions& opts)
   {
     CephContext *cct = (CephContext *)io_ctx.cct();
+    ldout(cct, 10) << __func__ << " name=" << imgname << ", "
+                   << "size=" << size << ", opts=" << opts << dendl;
 
     uint64_t format = cct->_conf->rbd_default_format;
     opts.get(RBD_IMAGE_OPTION_FORMAT, &format);
@@ -1343,7 +1345,6 @@ remove_mirroring_image:
     uint64_t order = *c_order;
 
     ImageOptions opts;
-    opts.set(RBD_IMAGE_OPTION_FORMAT, static_cast<uint64_t>(2));
     opts.set(RBD_IMAGE_OPTION_FEATURES, features);
     opts.set(RBD_IMAGE_OPTION_ORDER, order);
     opts.set(RBD_IMAGE_OPTION_STRIPE_UNIT, stripe_unit);
@@ -1360,10 +1361,16 @@ remove_mirroring_image:
   {
     CephContext *cct = (CephContext *)p_ioctx.cct();
     ldout(cct, 20) << "clone " << &p_ioctx << " name " << p_name << " snap "
-                  << p_snap_name << "to child " << &c_ioctx << " name "
+                  << p_snap_name << " to child " << &c_ioctx << " name "
                   << c_name << " opts = " << c_opts << dendl;
 
-    uint64_t format = cct->_conf->rbd_default_format;
+    bool default_format_set;
+    c_opts.is_set(RBD_IMAGE_OPTION_FORMAT, &default_format_set);
+    if (!default_format_set) {
+      c_opts.set(RBD_IMAGE_OPTION_FORMAT, static_cast<uint64_t>(2));
+    }
+
+    uint64_t format = 0;
     c_opts.get(RBD_IMAGE_OPTION_FORMAT, &format);
     if (format < 2) {
       lderr(cct) << "format 2 or later required for clone" << dendl;