]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
librbd: default clone operation to image format 2 8883/head
authorJason Dillaman <dillaman@redhat.com>
Mon, 2 May 2016 19:06:51 +0000 (15:06 -0400)
committerJason Dillaman <dillaman@redhat.com>
Mon, 2 May 2016 21:12:08 +0000 (17:12 -0400)
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>
src/librbd/internal.cc

index 8a5161f4a96a20750f1138c241bf91aeb83bed38..455d3b35eb4c19c61243808e886dbe1d9f24e098 100644 (file)
@@ -1234,6 +1234,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);
@@ -1344,7 +1346,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);
@@ -1361,10 +1362,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;