]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
cls_rbd: default initialize snapshot namespace for legacy clients 14934/head
authorJason Dillaman <dillaman@redhat.com>
Tue, 2 May 2017 01:06:19 +0000 (21:06 -0400)
committerJason Dillaman <dillaman@redhat.com>
Wed, 3 May 2017 13:51:26 +0000 (09:51 -0400)
Creating a snapshot on >=Kraken OSDs using <=Jewel clients can result
in an improperly initialized snapshot namespace. As a result, attempting
to remove the snapshot using a >=Kraken client will result in an -EINVAL
error.

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

Conflicts:
src/cls/rbd/cls_rbd.h: trivial resolution

src/cls/rbd/cls_rbd.cc
src/cls/rbd/cls_rbd.h

index 4cd079cc73da37213feb04cd068c78c1471b2a9b..a038d64e1b0e73185274e5049c957a975f42837c 100644 (file)
@@ -1525,6 +1525,12 @@ int snapshot_add(cls_method_context_t hctx, bufferlist *in, bufferlist *out)
     return -EINVAL;
   }
 
+  if (boost::get<cls::rbd::UnknownSnapshotNamespace>(
+        &snap_meta.snapshot_namespace.snapshot_namespace) != nullptr) {
+    CLS_ERR("Unknown snapshot namespace provided");
+    return -EINVAL;
+  }
+
   CLS_LOG(20, "snapshot_add name=%s id=%llu", snap_meta.name.c_str(),
         (unsigned long long)snap_meta.id.val);
 
index 8c0a05336300cf7c5c9f039400903e45916afe74..b4e01399d0c5892d08d3b15f2d6a2c57bd77cc61 100644 (file)
@@ -65,7 +65,8 @@ struct cls_rbd_snap {
   uint8_t protection_status;
   cls_rbd_parent parent;
   uint64_t flags;
-  cls::rbd::SnapshotNamespaceOnDisk snapshot_namespace;
+  cls::rbd::SnapshotNamespaceOnDisk snapshot_namespace = {
+    cls::rbd::UserSnapshotNamespace{}};
 
   /// true if we have a parent
   bool has_parent() const {
@@ -105,8 +106,6 @@ struct cls_rbd_snap {
     }
     if (struct_v >= 5) {
       ::decode(snapshot_namespace, p);
-    } else {
-      snapshot_namespace = cls::rbd::SnapshotNamespaceOnDisk(cls::rbd::UserSnapshotNamespace());
     }
     DECODE_FINISH(p);
   }