From d51b7553919233d2f18d5fa79a0ff3c09e71ba8a Mon Sep 17 00:00:00 2001 From: Jason Dillaman Date: Mon, 1 May 2017 21:06:19 -0400 Subject: [PATCH] cls_rbd: default initialize snapshot namespace for legacy clients 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 (cherry picked from commit 03b0b03071f3e04754896664c69f73759ddb907a) Conflicts: src/cls/rbd/cls_rbd.h: trivial resolution --- src/cls/rbd/cls_rbd.cc | 6 ++++++ src/cls/rbd/cls_rbd.h | 5 ++--- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/cls/rbd/cls_rbd.cc b/src/cls/rbd/cls_rbd.cc index 4cd079cc73d..a038d64e1b0 100644 --- a/src/cls/rbd/cls_rbd.cc +++ b/src/cls/rbd/cls_rbd.cc @@ -1525,6 +1525,12 @@ int snapshot_add(cls_method_context_t hctx, bufferlist *in, bufferlist *out) return -EINVAL; } + if (boost::get( + &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); diff --git a/src/cls/rbd/cls_rbd.h b/src/cls/rbd/cls_rbd.h index 8c0a0533630..b4e01399d0c 100644 --- a/src/cls/rbd/cls_rbd.h +++ b/src/cls/rbd/cls_rbd.h @@ -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); } -- 2.47.3