]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
cls_rbd: default initialize snapshot namespace for legacy clients 14903/head
authorJason Dillaman <dillaman@redhat.com>
Tue, 2 May 2017 01:06:19 +0000 (21:06 -0400)
committerJason Dillaman <dillaman@redhat.com>
Tue, 2 May 2017 01:08:00 +0000 (21:08 -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>
src/cls/rbd/cls_rbd.cc
src/cls/rbd/cls_rbd.h

index 206028c83ec63abaa3144588e62d91171c022a59..c5dc0cf45ebad78383aa423158a3864ce612007f 100644 (file)
@@ -1554,6 +1554,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 c1f17b845e5e5e6c68262a27ff47ebbfa461991d..f08fc1b1f0a65861e10cde4c48668a7040f79637 100644 (file)
@@ -66,7 +66,8 @@ struct cls_rbd_snap {
   cls_rbd_parent parent;
   uint64_t flags;
   utime_t timestamp;
-  cls::rbd::SnapshotNamespaceOnDisk snapshot_namespace;
+  cls::rbd::SnapshotNamespaceOnDisk snapshot_namespace = {
+    cls::rbd::UserSnapshotNamespace{}};
 
   /// true if we have a parent
   bool has_parent() const {
@@ -107,8 +108,6 @@ struct cls_rbd_snap {
     }
     if (struct_v >= 5) {
       ::decode(snapshot_namespace, p);
-    } else {
-      snapshot_namespace = cls::rbd::SnapshotNamespaceOnDisk(cls::rbd::UserSnapshotNamespace());
     }
     if (struct_v >= 6) {
       ::decode(timestamp, p);